什么是容器数据卷

思考一个问题,咱们为什么要应用 Docker?

次要是为了能够将利用和环境进行打包成镜像,一键部署。

再思考一个问题,容器之间是互相隔离的,如果咱们在容器中部署相似 mysql 这样的组件,如果把该容器删除掉,那么 mysql 的数据也会被删掉了,数据失落了,咱们删库跑路真刺激

事实上,咱们可不能让这么有危险的事件存在,因而有了卷技术

卷技术是容器之间能够共享数据的技术,Docker 容器中产生数据,将数据同步到本地

例如咱们将 Docker mysql 容器中的 /usr/mysql 目录挂载到宿主机的/home/mysql 目录

应用卷技术,咱们就能够让数据得以长久化

实际上操作起来就是挂载目录,将 Docker 容器外面的目录,挂载到宿主机上的某个目录,这就能够将数据长久化和同步了, Docker 容器间的数据共享依然是这样做的

咱们如何应用数据卷?

启动容器的时候,间接应用 -v命令就能够进行数据卷的挂载

docker run -it -v 宿主机目录:容器目录 镜像名

咱们来尝试启动一个 nginx,并将宿主机的 /home/test 目录和 nginx 的 /home 目录挂载起来

#docker run -d -v /home/test:/home nginx

此时咱们在宿主机的 /home/test 目录下建一个 test.txt 并且写入一些字符串,再查看容器的 /home 目录 是否有 test.txt

# 宿主机root@iZuf66y3tuzn4wp3h02t7pZ:/home/test# echo xiaomotong >> test.txt# 容器root@c8405d03a9a1:/home# lstest.txtroot@c8405d03a9a1:/home# cat test.txtxiaomotong

咱们在容器的/home 目录下创立一个test2.txt 文件,同样写入一些字符串,再查看 宿主机的 /home/test 目录是否有 test2.txt

# 容器root@c8405d03a9a1:/home# echo xiaozhu >> test2.txt# 宿主机root@iZuf66y3tuzn4wp3h02t7pZ:/home/test# lstest2.txt  test.txtroot@iZuf66y3tuzn4wp3h02t7pZ:/home/test# cat test2.txtxiaozhu

查看上述成果,果然是挂载 ok,数据的确同步了,哪怕是咱们把 docker 容器删除掉,数据也不会失落

docker inspect 容器ID ,查看一下咱们创立的容器的挂载状况

# docker psCONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                  NAMESc8405d03a9a1   nginx     "/docker-entrypoint.…"   9 minutes ago   Up 9 minutes   80/tcp                 nginx2# docker inspect c8405d03a9a1[    ...    "Mounts": [            {                "Type": "bind",                "Source": "/home/test",                "Destination": "/home",                "Mode": "",                "RW": true,                "Propagation": "rprivate"            }        ],    ...]

应用容器数据卷的便当之处:

当前咱们只须要批改宿主机外面的目录和文件,即可和容器中的指定目录放弃同步

mysql 实战一波

咱们再来一个实战,咱们一起来看看数据卷如何应用

下载 5.7 版本的 mysql docker 镜像,也能够下载其余版本,这个没有关系

# docker pull mysql:5.75.7: Pulling from library/mysql        # 5.7版本33847f680f63: Already exists        # 本层级曾经之前曾经下载过了5cb67864e624: Pull complete1a2b594783f5: Pull completeb30e406dd925: Pull complete48901e306e4c: Pull complete603d2b7147fd: Pull complete802aa684c1c4: Pull complete5b5a19178915: Pull completef9ce7411c6e4: Pull completef51f6977d9b2: Pull completeaeb6b16ce012: Pull completeDigest: sha256:be70d18aedc37927293e7947c8de41ae6490ecd4c79df1db40d1b5b5af7d9596Status: Downloaded newer image for mysql:5.7    docker.io/library/mysql:5.7            # 实在的mysql 镜像地址

启动镜像,间接应用 -v 来挂载目录

应用形式

docker run -it -v 主机目录:容器的目录

开始启动镜像

咱们能够参考 dockerhub 上的文档

# docker run  -d -p 8888:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql1 mysql:5.723c31b285804cd95130e36ad40d3c07239fe744845ca464b9c80e42c84848bfb# 解释一下上述命令-d 后盾运行-p 宿主机端口:容器端口  端口映射-v 宿主机目录:容器目录  挂载卷-e 设置环境变量--name 设置启动容器的名字

咱们能够通过window 的 workbench 来近程连贯一下 mysql

我的是云服务器,因而输出云服务器的地址,端口填入 8888 端口

默认用户名是 root , 明码是 123456

测试连贯 ok ,咱们能够来进入数据库

咱们在 workbench 中新建一个数据库

看看这个数据库是否会在咱们的宿主机下面有同步

查看咱们挂载宿主机的目录 /home/mysql/data

root@iZuf66y3tuzn4wp3h02t7pZ:/home/mysql/data#lsauto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  mysql               private_key.pem  server-cert.pem  sysca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  ibtmp1       performance_schema  public_key.pem   server-key.pem   test

果然是有的,再次 nice,这就达到了数据长久化的成果,这就是咱们从意识数据卷到应用数据卷的一个简略流程,咱们能够缓缓的深刻上来

具名挂载和匿名挂载

以启动一个 nginx 为例子:

具名挂载:

# docker run -d  --name nginx3 -v JM:/etc/nginx:rw nginx

匿名挂载:

# docker run -d  --name nginx3 -v /etc/nginx:rw nginx

上述的 rw也能够写成ro

  • rw

可读可写

  • ro

只读,只能宿主机能力写

查看数据挂载卷

root@iZuf66y3tuzn4wp3h02t7pZ:/home/mysql# docker volume lsDRIVER    VOLUME NAMElocal     JM        # 具名挂载 ,上面的为匿名挂载local     bd2b9ea00eb7d95bb69bdd39a63769ce906a0bb17fae2e29b726f9b92cbcb008local             d67ba49109dfd654173b8d05f8602b99751066483a357c654b63ba46ec72d5c0

查看挂载具体目录

l# docker volume inspect JM[    {        "CreatedAt": "2021-08-04T23:48:05+08:00",        "Driver": "local",        "Labels": null,        "Mountpoint": "/var/lib/docker/volumes/JM/_data",        "Name": "JM",        "Options": null,        "Scope": "local"    }]

查看该目录下的挂载文件,是否是和 nginx 容器中的 /etc/nginx目录下内容统一

root@iZuf66y3tuzn4wp3h02t7pZ:/var/lib/docker/volumes/JM/_data# lltotal 36drwxr-xr-x 3 root root 4096 Aug  4 23:48 ./drwx-----x 3 root root 4096 Aug  4 23:48 ../drwxr-xr-x 2 root root 4096 Aug  4 23:48 conf.d/-rw-r--r-- 1 root root 1007 Jul  6 22:59 fastcgi_params-rw-r--r-- 1 root root 5290 Jul  6 22:59 mime.typeslrwxrwxrwx 1 root root   22 Jul  6 23:11 modules -> /usr/lib/nginx/modules-rw-r--r-- 1 root root  648 Jul  6 23:11 nginx.conf-rw-r--r-- 1 root root  636 Jul  6 22:59 scgi_params-rw-r--r-- 1 root root  664 Jul  6 22:59 uwsgi_params

果然一毛一样,nice

再来看看 docker 默认的挂载目录 /var/lib/docker/volumes,咱们能够看到每一个匿名挂载,和具名挂载的目录和数据都寄存于此

root@iZuf66y3tuzn4wp3h02t7pZ:/var/lib/docker/volumes# lltotal 44drwx-----x  5 root root   4096 Aug  4 23:48 ./drwx--x--x 13 root root   4096 Aug  3 22:58 ../brw-------  1 root root 252, 1 Aug  3 22:58 backingFsBlockDevdrwx-----x  3 root root   4096 Aug  1 21:36 bd2b9ea00eb7d95bb69bdd39a63769ce906a0bb17fae2e29b726f9b92cbcb008/drwx-----x  3 root root   4096 Aug  3 23:32 d67ba49109dfd654173b8d05f8602b99751066483a357c654b63ba46ec72d5c0/drwx-----x  3 root root   4096 Aug  4 23:48 JM/-rw-------  1 root root  32768 Aug  4 23:48 metadata.db

咱们来小结一下

  • 指定挂载

-v 宿主机的绝对路径:容器门路

  • 具名挂载

-v 卷名:容器门路

  • 匿名挂载

-v 容器门路

参考资料:

docker docs

欢送点赞,关注,珍藏

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

好了,本次就到这里

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

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