Dockerfile

Dockerfile 就是用来构建 docker 镜像的构建文件,对于 Dockerfile 具体的咱们在前面一期说到,此处先用用

他是一个命令脚本,通过这个脚本能够生成咱们想要的镜像,镜像是分层的,一层一层的,脚本也是一个一个的命令,每个命令就是一层

咱们能够来看一个小小的例子

本人写一个 Dockerfile 来构建本人的镜像,咱们以 ubuntu 为例子

写一个简略的 dockerfile1

# vim dockerfile1FROM ubuntuVOLUME ["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.346GBStep 1/4 : FROM ubuntu ---> 1318b700e415Step 2/4 : VOLUME ["volume1","volume2"] ---> Running in d7b475cacb22Removing intermediate container d7b475cacb22 ---> b8ac33cfbcfdStep 3/4 : CMD echo "====successfully====" ---> Running in 35c98a625a9eRemoving intermediate container 35c98a625a9e ---> 67b6faf43370Step 4/4 : CMD /bin/bash ---> Running in b2e1e0ad8d9bRemoving intermediate container b2e1e0ad8d9b ---> b26faaedefacSuccessfully built b26faaedefacSuccessfully tagged xiaomotong/ubuntu:latest

通过上述咱们能够看到 docker 构建镜像的时候是一层一层的,一个命令一个命令的执行的,一个命令就是一层

  • docker build

构建咱们本人的镜像

  • -f

指定 dockerfile 的文件

  • -t

指标,即咱们 docker 镜像的名字

前面跟着生成镜像的地位

通过咱们构建的镜像的创立并启动容器

# docker imagesREPOSITORY            TAG       IMAGE ID       CREATED         SIZExiaomotong/ubuntu     latest    b26faaedefac   6 minutes ago   72.8MB# docker run -it b26faaedefac

执行完上述命令之后,咱们能够看到容器外面目录如下:

从图中咱们能够看到volume1volume2,这就是咱们方才构建容器时候做的匿名挂载,那么咱们应用 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能够看出 volume1volume2具体是挂载到宿主机的目录为/var/lib/docker/volumes/a1fd1edec5784f1153a318003bba4279b86fd2dd71b401be5864ed9b868d7332/_data , 和var/lib/docker/volumes/975ae74c8716f5e85ccf784c716291cffda2158baf6b3f9e145ffc1ea353cb7b/_data

咱们在容器挂载中创立一个文件,测试是否能够同步数据

在容器中的volume1中创立一个文件 xiaomotong.txt,写入字符串 hello world

root@b29995f4178d:/# cd volume1root@b29995f4178d:/volume1# echo hello world >> xiaomotong.txtroot@b29995f4178d:/volume1# lltotal 12drwxr-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# lsxiaomotong.txtroot@iZuf66y3tuzn4wp3h02t7pZ:/var/lib/docker/volumes/a1fd1edec5784f1153a318003bba4279b86fd2dd71b401be5864ed9b868d7332/_data# cat xiaomotong.txthello world

果然同步ok,nice

那么咱们有没有想过,当初是容器和宿主机之间同步数据,可是容器和容器之间是如何同步数据的呢?

数据卷容器

数据卷容器,例如容器 1 通过指令 –volumes-from挂载到容器 2 上的某个目录,那么容器 2 就是父容器,这个时候就实现了两个容器之间数据同步,容器 2 就是数据卷容器

来实战一个小例子:

用方才咱们制作的镜像,创立 2 容器,先创立 docker2 ,再创立 docker1,并且 docker1 挂载到 docker2 上,并在docker2 挂载的目录,volume1外面创立一个文件,xiaomotong.txt,咱们验证 docker1 volume1外面是否也有这个文件

# docker imagesREPOSITORY            TAG       IMAGE ID       CREATED          SIZExiaomotong/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# lsroot@3ed3ca51118f:/volume1# touch xiaomotong.txt

docker2

root@e9e1a0c46331:/volume1# lsxiaomotong.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

欢送点赞,关注,珍藏

敌人们,你的反对和激励,是我保持分享,提高质量的能源

好了,本次就到这里

技术是凋谢的,咱们的心态,更应是凋谢的。拥抱变动,背阴而生,致力向前行。

我是小魔童哪吒,欢送点赞关注珍藏,下次见~