关于docker:Docker-系列docker-学习六数据卷容器

49次阅读

共计 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

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

从图中咱们能够看到 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 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

欢送点赞,关注,珍藏

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

好了,本次就到这里

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

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

正文完
 0