共计 4246 个字符,预计需要花费 11 分钟才能阅读完成。
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
欢送点赞,关注,珍藏
敌人们,你的反对和激励,是我保持分享,提高质量的能源
好了,本次就到这里
技术是凋谢的,咱们的心态,更应是凋谢的。拥抱变动,背阴而生,致力向前行。
我是 小魔童哪吒,欢送点赞关注珍藏,下次见~