【Docker 系列】docker 学习六,探究一下数据卷容器
Dockerfile
Dockerfile 就是用来构建 docker 镜像的构建文件,关于 Dockerfile 详细的我们在后面一期说到,此处先用用
他是一个命令脚本,通过这个脚本可以生成我们想要的镜像,镜像是分层的,一层一层的,脚本也是一个一个的命令,「每个命令就是一层」
我们可以来看一个小小的例子
自己写一个 Dockerfile 来构建自己的镜像,我们以 ubuntu 为例子
写一个简单的 dockerfile1
# vim dockerfile1
FROM ubuntu
VOLUME ["volume1","volume2"]
CMD echo "====successfully===="
CMD /bin/bash
解释一下:
- FROM
来源基础镜像为 ubuntu
- VOLUME
挂载,可以匿名挂载,也可以是具名挂载 ,默认会挂载到 docker 专门挂载的目录
- CMD
指定可以使用命令
构建我们自己的镜像
# docker build -f dockerfile1 -t xiaomotong/ubuntu .
Sending build context to Docker daemon 1.346GB
Step 1/4 : FROM ubuntu
---> 1318b700e415
Step 2/4 : VOLUME ["volume1","volume2"]
---> Running in d7b475cacb22
Removing intermediate container d7b475cacb22
---> b8ac33cfbcfd
Step 3/4 : CMD echo "====successfully===="
---> Running in 35c98a625a9e
Removing intermediate container 35c98a625a9e
---> 67b6faf43370
Step 4/4 : CMD /bin/bash
---> Running in b2e1e0ad8d9b
Removing intermediate container b2e1e0ad8d9b
---> b26faaedefac
Successfully built b26faaedefac
Successfully tagged xiaomotong/ubuntu:latest
通过上述我们可以看到 docker 构建镜像的时候是一层一层的,一个命令一个命令的执行的,一个命令就是一层
- docker build
构建我们自己的镜像
- -f
指定 dockerfile 的文件
- -t
目标,即我们 docker 镜像的名字
后面跟着生成镜像的位置
通过我们构建的镜像的创建并启动容器
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
xiaomotong/ubuntu latest b26faaedefac 6 minutes ago 72.8MB
# docker run -it b26faaedefac
执行完上述命令之后,我们可以看到容器里面目录如下:
从图中我们可以看到volume1
和volume2
,这就是我们刚才构建容器时候做的匿名挂载,那么我们使用 docker inspect
命令来看看这俩挂载卷具体是挂载到宿主机的哪个位置,并测试一个同步数据
# docker inspect b29995f4178d
...
"Mounts": [
{
"Type": "volume",
"Name": "a1fd1edec5784f1153a318003bba4279b86fd2dd71b401be5864ed9b868d7332",
"Source": "/var/lib/docker/volumes/a1fd1edec5784f1153a318003bba4279b86fd2dd71b401be5864ed9b868d7332/_data",
"Destination": "volume1",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "975ae74c8716f5e85ccf784c716291cffda2158baf6b3f9e145ffc1ea353cb7b",
"Source": "/var/lib/docker/volumes/975ae74c8716f5e85ccf784c716291cffda2158baf6b3f9e145ffc1ea353cb7b/_data",
"Destination": "volume2",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
...
通过 docker inspect
可以看出 volume1
和volume2
具体是挂载到宿主机的目录为/var/lib/docker/volumes/a1fd1edec5784f1153a318003bba4279b86fd2dd71b401be5864ed9b868d7332/_data
, 和var/lib/docker/volumes/975ae74c8716f5e85ccf784c716291cffda2158baf6b3f9e145ffc1ea353cb7b/_data
「咱们在容器挂载中创建一个文件,测试是否可以同步数据」
在容器中的volume1
中创建一个文件 xiaomotong.txt
,写入字符串 hello world
root@b29995f4178d:/# cd volume1
root@b29995f4178d:/volume1# echo hello world >> xiaomotong.txt
root@b29995f4178d:/volume1# ll
total 12
drwxr-xr-x 2 root root 4096 Aug 5 15:01 ./
drwxr-xr-x 1 root root 4096 Aug 5 14:54 ../
-rw-r--r-- 1 root root 12 Aug 5 15:01 xiaomotong.txt
查看宿主机对应的挂载目录,确认是否同步数据
root@iZuf66y3tuzn4wp3h02t7pZ:/var/lib/docker/volumes/a1fd1edec5784f1153a318003bba4279b86fd2dd71b401be5864ed9b868d7332/_data# ls
xiaomotong.txt
root@iZuf66y3tuzn4wp3h02t7pZ:/var/lib/docker/volumes/a1fd1edec5784f1153a318003bba4279b86fd2dd71b401be5864ed9b868d7332/_data# cat xiaomotong.txt
hello world
果然同步ok,nice
「那么我们有没有想过,现在是容器和宿主机之间同步数据,可是容器和容器之间是如何同步数据的呢?」
数据卷容器
数据卷容器,例如容器 1 通过指令 –volumes-from
挂载到容器 2 上的某个目录,那么容器 2 就是父容器,这个时候就实现了两个容器之间数据同步,容器 2 就是数据卷容器
来实战一个小例子:
用刚才我们制作的镜像,创建 2 容器,先创建 docker2 ,再创建 docker1,并且 docker1 挂载到 docker2 上,并在docker2 挂载的目录,volume1
里面创建一个文件,xiaomotong.txt,我们验证 docker1 volume1
里面是否也有这个文件
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
xiaomotong/ubuntu latest b26faaedefac 38 minutes ago 72.8MB
# docker run -it --name docker2 b26faaedefac
# docker run -it --name docker1 --volumes-from docker2 b26faaedefac
b26faaedefac 是我们自己制作的镜像的 ID
主要是使用 --volumes-from
指令,我们就可以将两个容器进行挂载
docker1
root@3ed3ca51118f:/volume1# ls
root@3ed3ca51118f:/volume1# touch xiaomotong.txt
docker2
root@e9e1a0c46331:/volume1# ls
xiaomotong.txt
果然,两个容器互相同步数据了
上述的例子,不仅仅是两个容器之间挂载,进行同步数据,多个容器挂载也是同样的道理,例如再来一个容器 docker3 挂载到 docker2 上,也是一样的效果
「那么他们都是如何同步数据的呢?」
容器间同步数据的原理是通过拷贝的方式,例如在 docker2 上面的挂载上创建了一个文件2,这个时候 docker1 挂载了 docker2,也就是说 docker2 是父容器,那么 docker1 就会将文件2 拷贝到自己对应的挂载中
反之,如果 docker1 在自己的挂载中创建了文件1,那么文件1也会被 docker2 拷贝到自己的挂载中
若这个时候,我们删除 docker2 ,「那么 docker1 挂载中的文件会丢失吗?」
答案是不会的,因为他们是通过拷贝的方式,并不是共享一个副本
那么我们回顾一下上一期我们创建 mysql 容器的时候,若我们创建多个,那么我们是不是就很容易让他们数据同步,且删除其中一个容器,「数据也不会丢失了」
例如:
#docker run -d -p 8888:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql1 mysql:5.7
#docker run -d -p 8888:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql2 --volumes-from mysql1 mysql:5.7
咱们总结一下
数据卷容器会用在容器之间的配置信息的传递,数据卷的生命周期会一直持续到没有容器使用为止
哪怕我们不使用数据卷容器了,那么持久化到本地宿主机的数据,也是不会被删除掉的
参考资料:
docker docs
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是「小魔童哪吒」,欢迎点赞关注收藏,下次见~
相关文章
- Docker的基本使用——常用docker命令
- Pycharm代码docker容器运行调试 | 机器学习系列
- 【重识云原生】第六章容器6.1.5节——Docker核心技术Namespace
- docker运行容器外命令及系统监控的思路
- Ubuntu 卸载 Docker
- docker容器中使用rsyslogd
- 企业运维 | MySQL关系型数据库在Docker与Kubernetes容器环境中快速搭建部署主从实践
- 【重识云原生】第六章容器6.1.9节——Docker镜像技术剖析
- 使用Docker将你的应用制作成镜像
- 利用 Github Action 一键编译多平台 Docker 镜像
- 十年失眠架构师教你使用Docker来构建、运行、发布微服务
- Docker 离线安装_docker官方中文文档
- 使用 Docker 搭建你的Wiki(MoinMoin)
- Debian 系统无网络/依赖安装 Docker 环境
- Docker删除容器命令(docker rm)
- 【Docker 系列】docker 学习 四,镜像相关原理
- 【Docker 系列】docker 学习八,Docker 网络
- 【Docker 系列】docker 学习十,Compose 编写规则及wp 实战
- 【Docker 系列】docker 学习十一,docker 总结和面试题整理
- docker新建容器副本映射成新镜像永久解决tomcat报404的问题
- 【愚公系列】2023年01月 Docker容器 .NET Core应用在Docker中的部署
- 机器学习开发的灵药—Docker容器
- Docker容器的重启策略及docker run的–restart选项详解程序员
- Docker数据卷容器备份、恢复详解架构师
- Docker-容器相关核心技术
- overlay 如何实现跨主机通信?- 每天5分钟玩转 Docker 容器技术(52)
- 如何共享数据?- 每天5分钟玩转 Docker 容器技术(41)