前言:
推荐免费Docker基础讲解视频:【狂神说Java】Docker最新超详细版教程通俗易懂_哔哩哔哩_bilibili
具名挂载和匿名挂载
匿名挂载
1 2 3 4 5 6 7 8 9 10 11 12 # 匿名挂载,注意这里使用-P表示指定随机的端口号,没有指定主机的位置信息; # -v容器内路径 [root@jokerdig ~]# docker run -d -P --name nginx01 -v /etc/nginx nginx f13b823d6bbde0876e080b490bf974a39c11949cba82e638a26c6807ee43c57d # 查看所有卷 [root@jokerdig ~]# docker volume ls DRIVER VOLUME NAME local 0b7c8a9289fab16486681cc604987d65793fd173ef917efed20b9de2f6ea980c local 2ecc011bbb8b7961e2097456c4bd31e837f83157c24bb6e72c0f48def108d697 local 08d6ee16e5fab4ad0faf5b1bfc4db99414e803fcbdee9aafad91b3a502e6e4cc local 85333e36603577dd8210031bd7a29a7c1e395e1cb942b09dac7392e3db4468cc local e04224546a6e7d3c149224a3395a5b363a8a09708fb1e4f6d04e8fbfdc59a100
具名挂载
1 2 3 4 5 6 7 8 9 10 11 12 # 具名挂载 [root@jokerdig ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx a0fe31db4a537aaf815c315be80e4a184a34537efb96cd929b9bfcd3405b57cd # 查看所有卷 [root@jokerdig ~]# docker volume ls DRIVER VOLUME NAME local 0b7c8a9289fab16486681cc604987d65793fd173ef917efed20b9de2f6ea980c local 2ecc011bbb8b7961e2097456c4bd31e837f83157c24bb6e72c0f48def108d697 local 08d6ee16e5fab4ad0faf5b1bfc4db99414e803fcbdee9aafad91b3a502e6e4cc local 85333e36603577dd8210031bd7a29a7c1e395e1cb942b09dac7392e3db4468cc local e04224546a6e7d3c149224a3395a5b363a8a09708fb1e4f6d04e8fbfdc59a100 local juming-nginx # 看到具名挂载
查看卷在容器中的位置
1 2 3 4 5 6 7 8 9 10 11 12 [root@jokerdig ~]# docker volume inspect juming-nginx [ { "CreatedAt": "2022-09-24T11:00:17+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
我们通过具名挂载可以方便找到我们的一个卷,大多数情况下都是使用具名挂载
如何确定是匿名挂载还是具名挂载,还是指定路径挂载
1 2 3 -v 容器内路径 # 匿名挂载 -v 卷名:容器内路径 # 具名挂载 -v 宿主机路径:容器内路径 # 指定路径挂载
拓展
1 2 3 4 5 6 7 # 通过 -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
初识Dockerfile
Dockerfile就是用来构建docker镜像文件;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 [root@jokerdig docker-test-volume]# vim dockerfile1 # 通过脚本生成镜像 FROM centos VOLUME ["volume01","volume02"] CMD echo "-------end--------" CMD /bin/bash # 查看 dockerfile1 [root@jokerdig docker-test-volume]# cat dockerfile1 # 通过脚本生成镜像 FROM centos VOLUME ["volume01","volume02"] CMD echo "-------end--------" CMD /bin/bash # 构建镜像 [root@jokerdig docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1 -t jokerdig/centos:1.0 . Sending build context to Docker daemon 2.048kB Step 1/4 : FROM centos ---> 5d0da3dc9764 Step 2/4 : VOLUME ["volume01","volume02"] ---> Running in 652d0791c5b2 Removing intermediate container 652d0791c5b2 ---> bf974fab8280 Step 3/4 : CMD echo "-------end--------" ---> Running in d3ceb57280a4 Removing intermediate container d3ceb57280a4 ---> 1483a7b063c7 Step 4/4 : CMD /bin/bash ---> Running in 3176bbbcae0c Removing intermediate container 3176bbbcae0c ---> 1c6767a3e585 Successfully built 1c6767a3e585 Successfully tagged jokerdig/centos:1.0 # 查看生成的镜像 [root@jokerdig docker-test-volume]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE jokerdig/centos 1.0 1c6767a3e585 47 seconds ago 231MB
查看自己挂载的目录
数据卷容器
启动3个容器,通过我们刚刚写的镜像启动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 # 查看镜像 [root@jokerdig home]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE PORTS NAMES jokerdig/centos 1.0 1c6767a3e585 27 minutes ago 231MB docker01 # 启动第一个容器 [root@jokerdig home]# docker run -it --name docker01 1c6767a3e585 # 查看容器根目录内容 [root@90db9d80811c /]# ls -l total 56 lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin drwxr-xr-x 5 root root 360 Sep 24 03:55 dev drwxr-xr-x 1 root root 4096 Sep 24 03:55 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 195 root root 0 Sep 24 03:55 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 Sep 24 03:55 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 Sep 24 03:55 volume01 drwxr-xr-x 2 root root 4096 Sep 24 03:55 volume02 [root@90db9d80811c /]# # 启动第二个容器 Ctrl+P+Q退出 [root@jokerdig home]# docker run -it --name docker02 --volumes-from docker01 1c6767a3e585 [root@a90e37775954 /]# # 启动第三个容器 Ctrl+P+Q退出 [root@jokerdig home]# docker run -it --name docker03 --volumes-from docker01 1c6767a3e585 # 我们在docker03的volume01里创建docker03文件 [root@244dd7e798c7 /]# cd volume01 [root@244dd7e798c7 volume01]# touch docker03 [root@244dd7e798c7 volume01]# ls docker03 # 我们进入docker01的volume01 [root@jokerdig home]# docker attach docker01 [root@8b37a916e5db /]# cd volume01 [root@8b37a916e5db volume01]# ls docker03 # 可以看到docker03,说明它们之间数据互通
测试 :可以删除容器dcoker01,查看docker02和docker03时候还可以访问这个文件
结论
容器之间配置信息的传递,数据卷容器的生命周期这一直持续到没有容器使用为止,但是一旦持久化到了本地,这个时候,本地的数据不会被删除;
Dockerfile介绍
Dockerfile是用来构建docker镜像的文件,命令参数脚本
构建步骤
编写一个Dockerfile
文件;
docker build
构建为一个镜像
docker run
运行镜像
docker push
发布镜像(DockerHub、阿里云镜像仓库)
查看官方实例
CentOS Dockerfile - github.com
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 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"]
构建过程
基础知识:
每个保留关键字(指令)都是必须是大写字母 ;
执行从上到下顺序执行;
#
表示注释;
每一个指令都会创建提交一个新的镜像层,并提交;
Dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件;
Docker镜像逐渐成为了企业交付的标准,必须要掌握;
DockerFile:构建文件,定义了一切的步骤,源代码;
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品;
Docker容器:容器就是镜像运行起来提供服务的;
Dockerfile指令说明
1 2 3 4 5 6 7 8 9 10 11 12 FROM # 基础镜像FROM,一般在开头位置; MAINTAINER # 镜像的作者,格式:姓名+邮箱; RUN # 镜像构建的时候需要运行的命令; ADD # 添加内容; WORKDIR # 镜像工作目录; VOLUME # 挂载的目录; EXPOSE # 暴露端口配置; CMD # 指定容器运行时的shell命令,只有最后一个生效,可被替代; ENTRYPOINT # 指定容器运行时的shell命令,可以追加命令; ONBUILD # 当构建一个被继承Dockerfile这个还是会就会运行ONBUILD的指令,触发指令; COPY # 类似ADD,将我们文件拷贝到镜像中; ENV # 构建的时候设置环境变量;