1、Docker
1、安装
1、基本组成
镜像(image):
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务。
容器(contanier):
Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的。
仓库(repository):
仓库就是存放镜像的地方
2、安装
1、卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2、需要的安装包
yum install -y yum-utils
3、更新yum软件索引
yum makecache fast
4、设置镜像的仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
5、安装docker
yum install docker-ce docker-ce-cli containerd.io
6、启动docker
systemctl start docker
7、查看是否安装成功
docker version
8、运行hello-world
docker run hello-world
9、查看hello-world镜像
docker images
10、卸载docker
1、卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
2、删除资源
rm -rf /var/lib/docker
11、默认工作路径
/usr/lib/docker
3、阿里云加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ht2we6t8.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2、Docker常用命令
1、镜像命令
docker images
列出本地镜像。
[root@VM-4-16-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 17 months ago 13.3kB
#
REPOSITORY 镜像的仓库
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小
# 可选项
Options:
-a, --all Show all images (default hides intermediate images)
-q, --quiet Only show image IDs
docker search
从Docker Hub查找镜像
[root@VM-4-16-centos ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 13833
mariadb MariaDB Server is a high performing open sou… 5276
percona Percona Server is a fork of the MySQL relati… 599
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 741
circleci/mysql MySQL is a widely used, open-source relation… 28
# 可选项
--filter=STARs=3000 列出收藏数不小于指定值的镜像。
[root@VM-4-16-centos ~]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 13833 [OK]
mariadb MariaDB Server is a high performing open sou… 5276 [OK]
docker pull
从镜像仓库中拉取或者更新指定镜像
[root@VM-4-16-centos ~]# docker pull mysql
Using default tag: latest #不指定tag默认最新版本
latest: Pulling from library/mysql
72a69066d2fe: Pull complete # 分层下载
93619dbc5b36: Pull complete
99da31dd6142: Pull complete
626033c43d70: Pull complete
37d5d7efb64e: Pull complete
ac563158d721: Pull complete
d2ba16033dad: Pull complete
688ba7d5c01a: Pull complete
00e060b6d11d: Pull complete
1c04857f594f: Pull complete
4d7cfa90e6ea: Pull complete
e0431212d27d: Pull complete
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709 #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #真是下载地址
## 指定版本下载
[root@VM-4-16-centos ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
72a69066d2fe: Already exists
93619dbc5b36: Already exists
99da31dd6142: Already exists
626033c43d70: Already exists
37d5d7efb64e: Already exists
ac563158d721: Already exists
d2ba16033dad: Already exists
0ceb82207cd7: Pull complete
37f2405cae96: Pull complete
e2482e017e53: Pull complete
70deed891d42: Pull complete
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
docker rmi
删除镜像
docker rmi -f 镜像ID # 删除指定的容器
docker rmi -f 镜像ID 镜像ID 镜像ID # 删除多个容器
docker rmi -f $(docker images -aq) # 删除全部容器
2、容器命令
有了镜像才可以创建容器
docker pull centos
新建容器并启动
docker run [可选参数] image
#参数
--name="Name" 容器名字
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口
-p 主机端口:容器端口
# 测试,启动并进入容器
[root@VM-4-16-centos ~]# docker run -it centos /bin/bash
[root@1e4d93b06655 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@1e4d93b06655 /]# exit # 退出容器
exit
列出所有运行的容器
#docker ps
#列出当前正在运行的容器
-a # 列出当前正在运行的容器+历史运行的容器
-n=? #显示最近创建的容器
-q # 只显示容器编号
[root@VM-4-16-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@VM-4-16-centos ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e4d93b06655 centos "/bin/bash" About a minute ago Exited (0) About a minute ago compassionate_blackwell
7d3f2807d5d2 feb5d9fea6a5 "/hello" 18 hours ago Exited (0) 18 hours ago charming_mayer
[root@VM-4-16-centos ~]# docker ps -n=1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e4d93b06655 centos "/bin/bash" 3 minutes ago Exited (0) 2 minutes ago compassionate_blackwell
退出容器
exit 直接退出
Ctrl + P + Q 容器不停止退出
删除容器
docker rm 容器id # 删除指定容器,不能删除正在运行的 如要 rm -f
docker rm -f $(docker ps -aq)
启动与停止
docker start 容器id
docker restart 容器id
docker stop 容器id
docker kill 容器id
3、常用其他命令
后台启动容器
[root@VM-4-16-centos ~]# docker run -d centos
# 问题docker ps ,发现centos自己停了
# 坑:容器使用后台运行,就必须要有一个前台进程,docker发现没应用,就会停止
查看日志
docker logs [OPTIONS] CONTAINER
OPTIONS说明:
- -f : 跟踪日志输出
- **–since 😗*显示某个开始时间的所有日志
- -t : 显示时间戳
- **–tail 😗*仅列出最新N条容器日志
查看容器进程信息
[root@VM-4-16-centos ~]# docker top 82dd28fa2d2a
UID PID PPID C STIME TTY TIME CMD
root 10932 10911 0 15:08 pts/0 00:00:00 /bin/bash
查看镜像的元数据
docker inspect 82dd28fa2d2a
进入运行中的容器
# 进入容器后开启一个新的终端,可以操作
docker exec -it 82dd28fa2d2a /bin/bash
# 进入容器正在执行的终端,不会启动新的进程
docker attach 82dd28fa2d2a
数据拷贝
用于容器与主机之间的数据拷贝。
# 将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下。
docker cp /www/runoob 96f7f14e99ab:/www/
#将容器96f7f14e99ab的/www目录拷贝到主机的/tmp目录中。 (先进入容器)
docker cp 96f7f14e99ab:/www /tmp/
4、卷命令
[root@VM-4-16-centos ~]# docker volume --help
Usage: docker volume COMMAND
Manage volumes
Commands:
create Create a volume
inspect Display detailed information on one or more volumes
ls List volumes
prune Remove all unused local volumes
rm Remove one or more volumes
Run 'docker volume COMMAND --help' for more information on a command.
3、案列
nginx
# 1、搜索search
# 2、拉取 pull
[root@VM-4-16-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 13 months ago 141MB
centos latest 5d0da3dc9764 17 months ago 231MB
# -d 后台运行
# --name 取名
# -p 宿主机端口:容器内部端口
[root@VM-4-16-centos ~]# docker run -d --name nginx01 -p 5566:80 nginx
17c6ab028d7db5f067a2ed11da5c6f7d34297bae4b3794df2eb992527a8241c7
[root@VM-4-16-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
17c6ab028d7d nginx "/docker-entrypoint.…" 4 seconds ago Up 2 seconds 0.0.0.0:5566->80/tcp, :::5566->80/tcp nginx01
[root@VM-4-16-centos ~]# curl localhost:5566
4、数据卷
数据卷是宿主机中的一个目录或文件。
当容器目录和数据卷目录绑定后,对方的修改会立即同步。
一个数据卷可以被多个数据卷挂载
一个容器可以挂载多个数据卷
作用:
容器数据持久化;外部机器和容器间接通信;容器之间数据交换。
命令挂载
docker run -it -v /home/ceshi:/home centos /bin/bash
主机目录:容器目录
#使用inspect 查看详情
docker inspect 5fa219d39c99
"Mounts": [
{
"Type": "bind",
"Source": "/home/ceshi",
"Destination": "/home",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
实战:Mysql
数据持久化
# 拉取镜像
docker pull mysql:5.7
# 需要配置密码,官方文档提供
# docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
docker run -d -p 6000:3306 -v /home/mysql/conf:/etc/home/config.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=p123456 --name mysql01 mysql:5.7
####将容器删除
[root@VM-4-16-centos ~]# docker rm -f mysql01
mysql01
[root@VM-4-16-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@VM-4-16-centos ~]# docker ps -aq
会发现:挂载在本地的数据卷没有丢失,这就实现了容器数据持久化功能。
具名挂载
docker run -d -p 6001:80 --name nginx02 -v juming-nginx:/etc/nginx nginx
[root@VM-4-16-centos ~]# docker volume ls
DRIVER VOLUME NAME
local juming-nginx
[root@VM-4-16-centos ~]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2023-02-25T11:18:25+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
所有docker容器内的卷,没有指定目录都是在/var/lib/docker/volumes/xxx/_data下
权限
# 通过 -v 容器内路径:ro rw改变读写权限
ro readonly #只读
rw readwirte #可读可写
docker run -d -p 6001:6379 --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -p 6001:6379 --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
# 只要看到ro就说明这个路径只能在宿主机操作,容器内部无法操作
5、DockerFIle
javaweb
自定义镜像
1、在/tmp目录创建docker-demo文件夹
2、上传demo.jar包到/tmp/docker-demo
3、编写Dockerfile文件
# 指定基础镜像
FROM java:8-alpine
COPY ./demo.jar /tem/app.jar
#暴露端口
EXPOSE 6002
# 入口
ENTRYPOINT java -jar /tem/app.jar
4、构建镜像
docker build -t javaweb:1.0 .
5、查看镜像是否创建
[root@VM-4-16-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
javaweb 1.0 85b99088869a 18 minutes ago 162MB
6、启动镜像
docker run --name web -p 6002:6002 -d javaweb:1.0
javaweb
自定义镜像
1、在/tmp目录创建docker-demo文件夹
2、上传demo.jar包到/tmp/docker-demo
3、编写Dockerfile文件
# 指定基础镜像
FROM java:8-alpine
COPY ./demo.jar /tem/app.jar
#暴露端口
EXPOSE 6002
# 入口
ENTRYPOINT java -jar /tem/app.jar
4、构建镜像
docker build -t javaweb:1.0 .
5、查看镜像是否创建
[root@VM-4-16-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
javaweb 1.0 85b99088869a 18 minutes ago 162MB
6、启动镜像
docker run --name web -p 6002:6002 -d javaweb:1.0