[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
咱们总结一下#
数据卷容器会用在容器之间的配置信息的传递,数据卷的生命周期会一直持续到没有容器使用为止
哪怕我们不使用数据卷容器了,那么持久化到本地宿主机的数据,也是不会被删除掉的
参考资料:
欢迎点赞,关注,收藏#
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是小魔童哪吒,欢迎点赞关注收藏,下次见~
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: