3.具名挂载 & 匿名挂载
(1).匿名挂载
# 匿名挂载, 注意这里使用-P表示的指定随机的端口号,没有指定主机的位置信息 -v 容器内路径 [root@Jsxs home]# docker run -d -P --name nginx01 -v /etc/nginx nginx [root@Jsxs home]# docker volume ls #匿名挂载信息查询 DRIVER VOLUME NAME local 0f4d71c052604b6e9e65800064b6e39c2b2d0b38f94b45beaa84792807c0c914 local ac54910cfd4d3b0a5e7a6d129d94a717161b7644110348224a32fb952f7fb0eb # 这里发现,这种就是匿名挂载,我们在-v只写了容器内的路径,没有写容器外的路径 ------------------------------------------------------------------------ # 查看卷的具体信息 [root@Jsxs home]# docker inspect ac54910cfd4d3b0a5e7a6d129d94a717161b7644110348224a32fb952f7fb0eb [ { "CreatedAt": "2023-03-22T15:59:12+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/ac54910cfd4d3b0a5e7a6d129d94a717161b7644110348224a32fb952f7fb0eb/_data", "Name": "ac54910cfd4d3b0a5e7a6d129d94a717161b7644110348224a32fb952f7fb0eb", 挂载的具体目录的地址 "Options": null, "Scope": "local" } ]
(2).具名挂载
# 具名挂载 docker run -d -P --name 名字 -v 具名名字:容器路径 镜像 docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx --------------------------------------------------------------------- [root@Jsxs home]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx f026e984d67a6b522ca380cfa6eec6424e918a672e268388d93ac2b8d276a773 [root@Jsxs home]# docker volum ls docker: 'volum' is not a docker command. See 'docker --help' [root@Jsxs home]# docker volume ls DRIVER VOLUME NAME local 0f4d71c052604b6e9e65800064b6e39c2b2d0b38f94b45beaa84792807c0c914 local ac54910cfd4d3b0a5e7a6d129d94a717161b7644110348224a32fb952f7fb0eb local juming-nginx # 查看卷的具体信息 [root@Jsxs home]# docker inspect juming-nginx [ { "CreatedAt": "2023-03-22T16:12:01+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/
(3).判断匿名挂载和具名挂载
# 如何确定是匿名挂载还是具名挂载,还是指定路径挂载 -v 容器内路径 # 匿名挂载 -v 卷名:容器内路径 # 具名挂载,卷名没有路径/ -v 宿主机路径:容器内路径 # 指定路径挂载,一般/开头
(4).扩展
# 通过 -v 容器内路径:ro rw 改变读写权限 ro readonly # 只读 rw readwrite # 可读可写 # 一旦设置了这个容器权限,容器对我们挂载出来的内容就有了限定了 docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx # ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法进行操作的
4.数据卷之DockerFile 【自定义镜像+挂载】💥
DockerFile 就是用来构建docker镜像的构建文件! 命令脚本!
通过这个脚本可以生成镜像,镜像是一层层的,脚本一个个的命令,每个命令都是一层!
1. 创建一个drockerfile文件,名字可以自定义 2. 文件中的内容: FROM Centos VOLUME ["volume01","volume02"] CMD echo "----end----" CMD /bin/bash ---------------------------------------------------------------编写 [root@Jsxs home]# cd docker-test-volume/ [root@Jsxs docker-test-volume]# ls [root@Jsxs docker-test-volume]# clear [root@Jsxs docker-test-volume]# vim dockerfile1 [root@Jsxs docker-test-volume]# cat dockerfile1 FROM centos VOLUME ["volume01","volume02"] CMD echo "----end----" CMD /bin/bash #创建自定义镜像-> # -f 文件 -t 名字 [root@Jsxs docker-test-volume]# docker build -f dockerfile1 -t centos-test:1.0 . [+] Building 0.0s (5/5) FINISHED => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load build definition from dockerfile1 0.0s => => transferring dockerfile: 120B 0.0s => [internal] load metadata for docker.io/library/centos:latest 0.0s => [1/1] FROM docker.io/library/centos 0.0s => exporting to image 0.0s => => exporting layers 0.0s => => writing image sha256:0282d836c4f5ab8268cf4ebcf33ca7109bd03217f82358c4fa764466139852f2 0.0s => => naming to docker.io/library/centos-test:1.0 ---------------------------------------------------------------查看 [root@Jsxs /]# docker images #查看镜像 REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 605c77e624dd 14 months ago 141MB tomcat 9.0 b8e65a4d736d 15 months ago 680MB mysql 5.7 c20987f18b13 15 months ago 448MB hello-world latest feb5d9fea6a5 18 months ago 13.3kB centos-test 1.0 0282d836c4f5 18 months ago 231MB #获取成功 centos latest 5d0da3dc9764 18 months ago 231MB portainer/portainer latest 580c0e4e98b0 2 years ago 79.1MB ---------------------------------------------------------------启动
启动我们生成的镜像并查看
[root@Jsxs /]# docker run -it --name myCentos 0282d836c4f5 /bin/bash [root@96c226405ba9 /]# ls -l
这个卷和外部一定有一个同步的目录 -> 匿名挂载
[root@96c226405ba9 /]# cd volume01 #进入数据卷01 [root@96c226405ba9 volume01]# ls [root@96c226405ba9 volume01]# touch container.txt #创建一个文件 [root@96c226405ba9 volume01]# ls container.txt [root@96c226405ba9 volume01]# exit #离开 exit CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 96c226405ba9 0282d836c4f5 "/bin/bash" 7 minutes ago Exited (0) 28 seconds ago myCentos 4aba86a517af portainer/portainer "/portainer" 4 hours ago Up 4 hours 0.0.0.0:8088->9000/tcp, :::8088->9000/tcp eager_agnesi [root@Jsxs /]# docker inspect 96c226405ba9 #查看容器的详细信息
查看文件是否同步出去了
[root@Jsxs /]# cd /var/lib/docker/volumes/
同步
这种方式未来的使用非常多,因为我们自己通常会构建自己的镜像
假设构建镜像的时候没有挂载,需要自己手动挂载镜像 -v 卷名:容器内路径
5.数据卷容器 【容器和容器挂载】
注意: 1.bin/bash是规定镜像启动时执行这条命令,centos镜像启动时默认会执行/bin/bash.所以这里可以省略。 2.可以通过镜像ID和镜像名创建容器 [root@Jsxs docker-test-volume]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 605c77e624dd 14 months ago 141MB tomcat 9.0 b8e65a4d736d 15 months ago 680MB mysql 5.7 c20987f18b13 15 months ago 448MB hello-world latest feb5d9fea6a5 18 months ago 13.3kB centos-test 1.0 0282d836c4f5 18 months ago 231MB centos latest 5d0da3dc9764 18 months ago 231MB portainer/portainer latest 580c0e4e98b0 2 years ago 79.1MB [root@Jsxs docker-test-volume]# docker run -it --name docker01 centos-test:1.0 #新建容器并启动 [root@d0680299dc2b /]# ls -l total 56 lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin drwxr-xr-x 5 root root 360 Mar 22 09:53 dev drwxr-xr-x 1 root root 4096 Mar 22 09:53 etc drwxr-xr-x 2 root root 4096 Nov 3 2020 home lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64 drwx------ 2 root root 4096 Sep 15 2021 lost+found drwxr-xr-x 2 root root 4096 Nov 3 2020 media drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt drwxr-xr-x 2 root root 4096 Nov 3 2020 opt dr-xr-xr-x 211 root root 0 Mar 22 09:53 proc dr-xr-x--- 2 root root 4096 Sep 15 2021 root drwxr-xr-x 11 root root 4096 Sep 15 2021 run lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin drwxr-xr-x 2 root root 4096 Nov 3 2020 srv dr-xr-xr-x 13 root root 0 Mar 22 09:53 sys drwxrwxrwt 7 root root 4096 Sep 15 2021 tmp drwxr-xr-x 12 root root 4096 Sep 15 2021 usr drwxr-xr-x 20 root root 4096 Sep 15 2021 var drwxr-xr-x 2 root root 4096 Mar 22 09:53 volume01 #数据卷 drwxr-xr-x 2 root root 4096 Mar 22 09:53 volume02 #数据卷 # 在docker01不停止的情况下,启动docker02并挂载01 docker run -it --name docker02 --volumes-from docker01 centos-test:1.0 [root@15849a421f0d /]# ls -l # total 56 lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin drwxr-xr-x 5 root root 360 Mar 22 10:10 dev drwxr-xr-x 1 root root 4096 Mar 22 10:10 etc drwxr-xr-x 2 root root 4096 Nov 3 2020 home lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64 drwx------ 2 root root 4096 Sep 15 2021 lost+found drwxr-xr-x 2 root root 4096 Nov 3 2020 media drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt drwxr-xr-x 2 root root 4096 Nov 3 2020 opt dr-xr-xr-x 217 root root 0 Mar 22 10:10 proc dr-xr-x--- 2 root root 4096 Sep 15 2021 root drwxr-xr-x 11 root root 4096 Sep 15 2021 run lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin drwxr-xr-x 2 root root 4096 Nov 3 2020 srv dr-xr-xr-x 13 root root 0 Mar 22 10:10 sys drwxrwxrwt 7 root root 4096 Sep 15 2021 tmp drwxr-xr-x 12 root root 4096 Sep 15 2021 usr drwxr-xr-x 20 root root 4096 Sep 15 2021 var drwxr-xr-x 2 root root 4096 Mar 22 09:53 volume01 drwxr-xr-x 2 root root 4096 Mar 22 09:53 volume02 root@Jsxs ~]#cd volume01 root@Jsxs volume01]# touch docker01Create.txt [root@Jsxs ~]# docker attach d0680299dc2b #进入到docker01 [root@d0680299dc2b /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02 [root@d0680299dc2b /]# cd volume01 [root@d0680299dc2b volume01]# ls #发现也存在 docker01Create.txt
容器和容器键相互挂载了
再此创建docker03
[root@Jsxs /]# docker run -it --name docker03 --volumes-from docker01 centos-test:1.0 [root@db1ab3bfc102 /]# docker ps bash: docker: command not found [root@db1ab3bfc102 /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02 [root@db1ab3bfc102 /]# cd volume01 [root@db1ab3bfc102 volume01]# ls docker01Create.txt [root@db1ab3bfc102 volume01]# touch docker03 [root@db1ab3bfc102 volume01]# ls docker01Create.txt docker03 [root@db1ab3bfc102 volume01]# [root@Jsxs /]# [root@Jsxs /]# docker attach docker01 [root@d0680299dc2b volume01]# ls docker01Create.txt docker03
删除docker01也就是我们的父容器
[root@Jsxs /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES db1ab3bfc102 centos-test:1.0 "/bin/sh -c /bin/bash" 3 minutes ago Up 3 minutes docker03 15849a421f0d centos-test:1.0 "/bin/sh -c /bin/bash" 31 minutes ago Up 31 minutes docker02 d0680299dc2b centos-test:1.0 "/bin/sh -c /bin/bash" 48 minutes ago Up 48 minutes docker01 4aba86a517af portainer/portainer "/portainer" 6 hours ago Up 5 hours 0.0.0.0:8088->9000/tcp, :::8088->9000/tcp eager_agnesi [root@Jsxs /]# docker rm -f d0680299dc2b d0680299dc2b [root@Jsxs /]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES db1ab3bfc102 centos-test:1.0 "/bin/sh -c /bin/bash" 4 minutes ago Up 4 minutes docker03 15849a421f0d centos-test:1.0 "/bin/sh -c /bin/bash" 32 minutes ago Up 32 minutes docker02 4aba86a517af portainer/portainer "/portainer" 6 hours ago Up 5 hours 0.0.0.0:8088->9000/tcp, :::8088->9000/tcp eager_agnesi [root@Jsxs /]# docker attach docker02 [root@15849a421f0d volume01]# ls docker01Create.txt docker03
6. 多个MySql数据共享
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=338218 --name mysql01 mysql:5.7 docker run -d -p 3311:3306 -e MYSQL_ROOT_PASSWORD=338218 --name mysql02 --volumes-from mysql01 mysql:5.7 # 这个时候可以实现两个容器数据同步
结论:
- 容器之间配置信息的传递,数据卷容器的生命周期这一直持续到没有容器使用为止。(复制)
- 但是一旦持久化到了本地,这个时候,本地的数据不会被删除
(七)、DockerFile
dockerfile是用来构建docker镜像的文件,命令参数脚本
1.构建步骤:
- 编写一个dockerfile文件 - docker build构建为一个镜像 - docker run 运行镜像 - docker push发布镜像(DockerHub、阿里云镜像仓库)
FROM scratch ADD centos-7-x86_64-docker.tar.xz / LABEL \ org.label-schema.schema-version="1.0" \ org.label-schema.name="CentOS Base Image" \ org.label-schema.vendor="CentOS" \ org.label-schema.license="GPLv2" \ org.label-schema.build-date="20201113" \ org.opencontainers.image.title="CentOS Base Image" \ org.opencontainers.image.vendor="CentOS" \ org.opencontainers.image.licenses="GPL-2.0-only" \ org.opencontainers.image.created="2020-11-13 00:00:00+00:00" CMD ["/bin/bash"]
- 很多官方的镜像都是基础包,很多功能都没有(只是基础包)。我们通常会自己搭建自己的镜像