我们这里先简单的概括一下DockerFile:
(理解到这里就可以了)
目标:在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷。
在宿主机的/home目录中创建一个mydocker目录。
在mydocker目录中,创建一个文件dockerfile。
如下所示:
# 进入/home目录[root@192 ~]# cd /home/[root@192 home]# ll总用量 0# 创建并进入mydocker目录[root@192 home]# mkdir mydocker[root@192 home]# cd mydocker/# 创建Dockerfile文件[root@192 mydocker]# touch dockerfile[root@192 mydocker]# ll总用量 0-rw-r--r--. 1 root root 0 3月 19 19:59 dockerfile在dockerfile文件中编写如下内容。
FROM centos # 添加基础镜像VOLUME ["volume01", "volume02"] # 添加两个容器数据卷,属于匿名挂载CMD echo "--finished----success--" # 容器构建完成输出的信息CMD /bin/bash # 指定终端命令说明:
提示:
出于可移植和分享的考虑,用
-v 主机目录:容器目录这种方法不能够直接在Dockerfile中实现。是由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。
构建Dokcer镜像使用docker build命令。
执行命令:docker build -f /home/mydocker/dockerfile -t wukong/centos:1.0 .
提示:
-f:指明Dockerfile文件的路径。-t:定义镜像的命名空间/镜像名:TAG。(命名空间可以省略). 表示是在指定镜像构建过程中上下文环境的目录。(先按固定写法记)# 从Dockerfile生成镜像[root@192 mydocker]# docker build -f /home/mydocker/dockerfile -t wukong/centos:1.0 .Sending build context to Docker daemon 2.048kBStep 1/4 : FROM centos # 可以看到一步一步的执行Dockerfile文件的每一条语句 ---> 300e315adb2fStep 2/4 : VOLUME ["volume01", "volume02"] ---> Running in 5b470e19ab85Removing intermediate container 5b470e19ab85 ---> 9f32b7e2ec23Step 3/4 : CMD echo "--finished----success--" ---> Running in 8e5e921be91dRemoving intermediate container 8e5e921be91d ---> c25f409aaaa3Step 4/4 : CMD /bin/bash ---> Running in 3a09eb701bf5Removing intermediate container 3a09eb701bf5 ---> 98b1b6590b78Successfully built 98b1b6590b78 # 最后生成的镜像IDSuccessfully tagged wukong/centos:1.0# 查看本地Docker镜像[root@192 mydocker]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEwukong/centos 1.0 98b1b6590b78 3 minutes ago 209MBmysql 5.7 a70d36bc331a 8 weeks ago 449MBcentos latest 300e315adb2f 3 months ago 209MB执行命令:docker run -it wukong/centos /bin/bash
启动容器,并且查看wukong/centos容器的根目录。
# 启动进入容器[root@192 ~]# docker run -it 98b1b6590b78 /bin/bash[root@b2094527a8c4 /]## 查看wukong/centos容器的根目录[root@b2094527a8c4 /]# ls -ltotal 0lrwxrwxrwx. 1 root root 7 Nov 3 15:22 bin -> usr/bindrwxr-xr-x. 5 root root 360 Mar 19 12:52 devdrwxr-xr-x. 1 root root 66 Mar 19 12:52 etcdrwxr-xr-x. 2 root root 6 Nov 3 15:22 homelrwxrwxrwx. 1 root root 7 Nov 3 15:22 lib -> usr/liblrwxrwxrwx. 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64drwx------. 2 root root 6 Dec 4 17:37 lost+founddrwxr-xr-x. 2 root root 6 Nov 3 15:22 mediadrwxr-xr-x. 2 root root 6 Nov 3 15:22 mntdrwxr-xr-x. 2 root root 6 Nov 3 15:22 optdr-xr-xr-x. 126 root root 0 Mar 19 12:52 procdr-xr-x---. 2 root root 162 Dec 4 17:37 rootdrwxr-xr-x. 11 root root 163 Dec 4 17:37 runlrwxrwxrwx. 1 root root 8 Nov 3 15:22 sbin -> usr/sbindrwxr-xr-x. 2 root root 6 Nov 3 15:22 srvdr-xr-xr-x. 13 root root 0 Mar 19 04:07 sysdrwxrwxrwt. 7 root root 145 Dec 4 17:37 tmpdrwxr-xr-x. 12 root root 144 Dec 4 17:37 usrdrwxr-xr-x. 20 root root 262 Dec 4 17:37 vardrwxr-xr-x. 2 root root 6 Mar 19 12:52 volume01drwxr-xr-x. 2 root root 6 Mar 19 12:52 volume02从上面我们到,在容器的根目录多了两个文件夹volume01和volume02。
其实这两个文件夹就是我们在Dockerfile文件中定义的数据卷挂载,是以匿名挂载的方式挂载数据卷的。
在容器启动的时候,会自动挂载这两个数据卷目录。
然后我们进入volume01目录创建一个文件container.txt。
# 创建container.txt文件[root@b2094527a8c4 /]# mkdir /volume01/container.txt# 查看文件是否创建成功[root@b2094527a8c4 /]# ls -l /volume01total 0drwxr-xr-x. 2 root root 6 Mar 19 12:58 container.txt我们通过docker inspect命令,查看容器的详细信息。
# 查看当前运行的容器[root@192 ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTSb2094527a8c4 98b1b6590b78 "/bin/bash" 8 minutes ago Up 8 minutes# 查看容器详细信息[root@192 ~]# docker inspect b2094527a8c4下图是截取容器挂载部分的内容。

上图就证明容器启动时,自动创建了volume01和volume02两个挂载数据卷目录。
并且使用匿名挂载的方式进行挂载。
我们进入宿主机的/var/lib/docker/volumes/2a2c26cec7ba4908a33a381aa90367a5e4123bb6e6fd9f5ef0887911a962ba19/_data目录,查看是否存在container.txt文件。
[root@192 ~]# cd /var/lib/docker/volumes/2a2c26cec7ba4908a33a381aa90367a5e4123bb6e6fd9f5ef0887911a962ba19/_data[root@192 _data]# ll总用量 0drwxr-xr-x. 2 root root 6 3月 19 20:58 container.txt说明在容器中volume01目录下创建的container.txt,同步到宿主机中了。
提示:
使用DockerFile挂载数据卷的方式我们未来使用的十分多,因为我们通常会构建自己的镜像。
假设构建镜像时候没有挂载数据卷,那我们就要手动进行数据卷的挂载了,
-v 卷名:容器内路径。