『现学现忘』Docker基础 — 32、通过DockerFile的方式挂载数据卷
1、简单了解一下DockerFile
我们这里先简单的概括一下DockerFile:
- Dockerfile就是用来构建Docker镜像的构建文件,是一个命令脚本。
- 通过这个脚本可以生成镜像,镜像是一层一层的,而脚本也是一个个的命令,每个命令都是一层。
(理解到这里就可以了)
2、通过DockerFile的方式挂载数据卷
目标:在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷。
(1)创建DockerFile文件
在宿主机的/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
(2)编辑Dockerfile文件
在dockerfile文件中编写如下内容。
FROM centos # 添加基础镜像
VOLUME ["volume01", "volume02"] # 添加两个容器数据卷,属于匿名挂载
CMD echo "--finished----success--" # 容器构建完成输出的信息
CMD /bin/bash # 指定终端命令
说明:
- 创建一个Dockerfile文件,名字可以随机起,建议使用Dockerfile命名。
- 文件中的指令都大写。
- Dockerfile里面的每个命令,就是镜像的一层!
提示:
出于可移植和分享的考虑,用
-v 主机目录:容器目录这种方法不能够直接在Dockerfile中实现。是由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。
(3)构建Dokcer镜像
构建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.048kB
Step 1/4 : FROM centos # 可以看到一步一步的执行Dockerfile文件的每一条语句
---> 300e315adb2f
Step 2/4 : VOLUME ["volume01", "volume02"]
---> Running in 5b470e19ab85
Removing intermediate container 5b470e19ab85
---> 9f32b7e2ec23
Step 3/4 : CMD echo "--finished----success--"
---> Running in 8e5e921be91d
Removing intermediate container 8e5e921be91d
---> c25f409aaaa3
Step 4/4 : CMD /bin/bash
---> Running in 3a09eb701bf5
Removing intermediate container 3a09eb701bf5
---> 98b1b6590b78
Successfully built 98b1b6590b78 # 最后生成的镜像ID
Successfully tagged wukong/centos:1.0
# 查看本地Docker镜像
[root@192 mydocker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wukong/centos 1.0 98b1b6590b78 3 minutes ago 209MB
mysql 5.7 a70d36bc331a 8 weeks ago 449MB
centos latest 300e315adb2f 3 months ago 209MB
(4)启动镜像,并操作镜像
执行命令:docker run -it wukong/centos /bin/bash
启动容器,并且查看wukong/centos容器的根目录。
# 启动进入容器
[root@192 ~]# docker run -it 98b1b6590b78 /bin/bash
[root@b2094527a8c4 /]#
# 查看wukong/centos容器的根目录
[root@b2094527a8c4 /]# ls -l
total 0
lrwxrwxrwx. 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x. 5 root root 360 Mar 19 12:52 dev
drwxr-xr-x. 1 root root 66 Mar 19 12:52 etc
drwxr-xr-x. 2 root root 6 Nov 3 15:22 home
lrwxrwxrwx. 1 root root 7 Nov 3 15:22 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
drwx------. 2 root root 6 Dec 4 17:37 lost+found
drwxr-xr-x. 2 root root 6 Nov 3 15:22 media
drwxr-xr-x. 2 root root 6 Nov 3 15:22 mnt
drwxr-xr-x. 2 root root 6 Nov 3 15:22 opt
dr-xr-xr-x. 126 root root 0 Mar 19 12:52 proc
dr-xr-x---. 2 root root 162 Dec 4 17:37 root
drwxr-xr-x. 11 root root 163 Dec 4 17:37 run
lrwxrwxrwx. 1 root root 8 Nov 3 15:22 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 3 15:22 srv
dr-xr-xr-x. 13 root root 0 Mar 19 04:07 sys
drwxrwxrwt. 7 root root 145 Dec 4 17:37 tmp
drwxr-xr-x. 12 root root 144 Dec 4 17:37 usr
drwxr-xr-x. 20 root root 262 Dec 4 17:37 var
drwxr-xr-x. 2 root root 6 Mar 19 12:52 volume01
drwxr-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 /volume01
total 0
drwxr-xr-x. 2 root root 6 Mar 19 12:58 container.txt
(5)查看数据卷
我们通过docker inspect命令,查看容器的详细信息。
# 查看当前运行的容器
[root@192 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
b2094527a8c4 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
总用量 0
drwxr-xr-x. 2 root root 6 3月 19 20:58 container.txt
说明在容器中volume01目录下创建的container.txt,同步到宿主机中了。
提示:
使用DockerFile挂载数据卷的方式我们未来使用的十分多,因为我们通常会构建自己的镜像。
假设构建镜像时候没有挂载数据卷,那我们就要手动进行数据卷的挂载了,
-v 卷名:容器内路径。
『现学现忘』Docker基础 — 32、通过DockerFile的方式挂载数据卷的更多相关文章
- 『现学现忘』Docker基础 — 34、DockerFile文件详解
目录 1.DockerFile文件说明 2.Dockerfile构建过程解析 (1)Docker容器构建三步骤 (2)Dockerfile文件的基本结构 (3)Dockerfile注意事项 (4)Do ...
- 『现学现忘』Docker基础 — 28、Docker容器数据卷介绍
目录 1.什么是Docker容器数据卷 2.数据卷的作用 3.数据卷的使用 1.什么是Docker容器数据卷 Docker容器数据卷,即Docker Volume(卷). 当Docker容器运行的时候 ...
- 『现学现忘』Docker基础 — 29、Docker容器数据卷的应用
目录 1.验证容器和宿主机之间数据共享 2.容器停止退出后,主机修改后数据是否同步 3.带只读权限的挂载数据卷 1.验证容器和宿主机之间数据共享 通过上面的操作,接下来我们演示一下通过数据卷的挂载,实 ...
- 『现学现忘』Docker基础 — 30、Docker中数据卷相关命令
目录 1.Volume命令说明 2.Volume命令的使用 (1)创建数据卷 (2)查看本地数据卷列表 (3)打印myVolume数据卷的详细信息 (4)删除数据卷 (5)删除所有未使用的数据卷 3. ...
- 『现学现忘』Docker基础 — 33、Docker数据卷容器的说明与共享数据原理
目录 1.数据卷容器的说明 2.数据卷容器共享数据原理 3.总结 4.练习:MySQL实现数据共享 1.数据卷容器的说明 (1)什么是数据卷容器 一个容器中已经创建好的数据卷,其它容器通过这个容器实现 ...
- 『现学现忘』Docker基础 — 16、Docker中的基本概念和底层原理
目录 1.Docker的底层原理 2.Docker中常用的基本概念 3.run命令的运行流程 4.为什么Docker比VM快 Docker架构图: 我们依照Docker架构图进行Docker基础概念的 ...
- 『现学现忘』Docker基础 — 22、使用Docker安装Nginx
目录 步骤1:搜索镜像 步骤2:下载Nginx镜像 步骤3:运行Nginx镜像 步骤4:进行本机测试 步骤5:进入容器内操作 步骤6:测试外网访问容器 步骤1:搜索镜像 使用docker search ...
- 『现学现忘』Docker基础 — 24、Docker图形化管理工具Portainer
目录 1.Portainer介绍 2.Portainer安装启动 3.Portainer初始化配置 4.Portainer汉化 1.Portainer介绍 (1)Portainer 是一款轻量级的图形 ...
- 『现学现忘』Docker基础 — 31、实现MySQL同步数据
目录 1.搜索镜像 2.拉取镜像 3.查看镜像 4.启动镜像 5.操作容器 (1)在MySQL中创建数据库 (2)外部连接Dokcer容器中的MySQL服务 (3)查看挂载情况 (4)测试MySQL服 ...
随机推荐
- 基于GDAL库,读取.nc文件(以海洋表温数据为例)C++版
对于做海洋数据处理的同学,会经常遇到nc格式的文件,nc文件的格式全称是NetCDF,具体的详细解释请查询官网[https://www.unidata.ucar.edu/software/netcdf ...
- Java如何实现消费数据隔离?
我是3y,一年CRUD经验用十年的markdown程序员常年被誉为优质八股文选手 今天继续更新austin项目,如果还没看过该系列的同学可以点开我的历史文章回顾下,在看的过程中不要忘记了点赞哟!建议 ...
- [源码解析] NVIDIA HugeCTR,GPU版本参数服务器---(3)
[源码解析] NVIDIA HugeCTR,GPU版本参数服务器---(3) 目录 [源码解析] NVIDIA HugeCTR,GPU版本参数服务器---(3) 0x00 摘要 0x01 回顾 0x0 ...
- CentOS7编译安装升级openssh8.7p1
因生成环境服务器安全扫描出的漏洞问题,只能升级最新的openssh,适用于centos6和centos7的升级使用. 一.编译前工作 openssl版本要求1.0.1以上,zlib版本要求1.1.4以 ...
- 如何通过pid定位是哪个容器
此时,我有一个pid为28117的进程,通过pdwx命令,无法找到他所在的目录,此时我判定他是docker容器 pwdx 28117 输出如下 28117: / 通过docker ps -q命令,获取 ...
- python-利用shutil模块rmtree方法可以将文件及其文件夹下的内容删除
import shutil import os image_path = os.path.join(os.path.dirname(__file__),'image') # 如果存在image目录则删 ...
- mongodb之shard分片
总的 1:在3台独立服务器上,分别运行 27017,27018,27019实例, 互为副本集,形成3套repl set 2: 在3台服务器上,各配置config server, 运行27020端口上 ...
- Python:获取某一月的天数
import calendarcalendar.monthlen(2021,6)30calendar.monthrange(2021,6)(1, 30) calendar.monthrange( ye ...
- broken pipe 报错分析和解决办法
参考资料: 1.博客1:https://blog.csdn.net/qq_37535749/article/details/113781338 2.博客2:https://blog.csdn.net/ ...
- python如何data格式和时间戳的转换
Python 获取几天前的时间 计算几天前并转换为指定格式. import time import datetime # 先获得时间数组格式的日期 threeDayAgo = (datetime.da ...