写点什么

docker 数据卷使用

作者:忙着长大#
  • 2022-10-23
    广东
  • 本文字数:2255 字

    阅读完需:约 7 分钟

数据卷介绍:

数据卷的特点及使用:
  • 创建容器的时候指定参数会删除/var/lib/docker/containers/的容器数据目录,但是不会删除数据卷的内容,实现即使删除容器持久化的数据也不会丢失。

  • 数据卷是宿主机的目录或者文件,并且可以在多个容器之间共同使用。

  • 在宿主机对数据卷更改数据后会在所有容器里面会立即更新。

  • 数据卷的数据可以持久保存,即使删除使用使用该容器卷的容器也不影响。

  • 在容器里面的写入数据不会影响到镜像本身。

数据卷使用场景:
  • 容器数据持久化(mysql 数据、nginx 日志等类型)

  • 静态 web 页面挂载

  • 应用配置文件挂载

  • 多容器间的目录或文件共享


1、使用 create volume 方式

创建 volume

root@yt:~#  docker volume create nginx-datanginx-dataroot@yt:~# docker volume ls DRIVER    VOLUME NAMElocal     nginx-data
复制代码

启动容器,报错

root@yt:~# docker run -it -d -p 80:80 -v nginx-data:/data nginx:1.20.2Unable to find image 'nginx:1.20.2' locally1.20.2: Pulling from library/nginxa2abf6c4d29d: Pull complete da03644a1293: Pull complete dcbfc6badd70: Pull complete 3f7ccff97047: Pull complete 49e31097680b: Pull complete c423e1dacb26: Pull complete 
docker: unexpected EOF.See 'docker run --help'.
复制代码

查看 docker 状态日志

 systemctl status docker  -l 
复制代码


怀疑是 docker 的 Cgroup Driver 有问题

root@yt:~# docker info | grep -i cgroup Cgroup Driver: cgroupfs Cgroup Version: 1
复制代码

修改 docker 的 Cgroup Driver

root@yt:~# cat /etc/docker/daemon.json {  "exec-opts": [    "native.cgroupdriver=systemd"  ],  "registry-mirrors": ["https://rmvgz1hz.mirror.aliyuncs.com"]}
root@yt:~# systemctl daemon-reload root@yt:~# systemctl restart docker
root@yt:~# docker info | grep -i cgroup Cgroup Driver: systemd Cgroup Version: 1WARNING: No swap limit support
复制代码

再次启动容器,启动成功

root@yt:~# docker run -it -d -p 80:80 -v nginx-data:/data nginx:1.20.2Unable to find image 'nginx:1.20.2' locally1.20.2: Pulling from library/nginxa2abf6c4d29d: Already exists da03644a1293: Already exists dcbfc6badd70: Already exists 3f7ccff97047: Already exists 49e31097680b: Already exists c423e1dacb26: Already exists Digest: sha256:03f3cb0afb7bd5c76e01bfec0ce08803c495348dccce37bcb82c347b4853c00bStatus: Downloaded newer image for nginx:1.20.2f45b71664cab34bc9cba1d0190a79934bf639ef8ab6401e1d2bfb1cbcbf4c64froot@yt:~# docker ps CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                               NAMESf45b71664cab   nginx:1.20.2   "/docker-entrypoint.…"   3 seconds ago   Up 3 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   wonderful_khayyam
复制代码

在容器中写入一个文件

root@yt:~# docker exec -it f45b71664cab bashroot@f45b71664cab:/# echo "nginx web" > /data/index.htmlroot@f45b71664cab:/# exitexitroot@yt:~# ls /var/lib/docker/volumes/nginx-data/_data/index.html/var/lib/docker/volumes/nginx-data/_data/index.html
复制代码

发现宿主机上的 volume 目录已经能看到容器内写入的文件,至此已经完成 volume 的挂载使用,完成了数据在宿主机的持久化。

root@yt:~# ls /var/lib/docker/volumes/nginx-data/_data/index.html/var/lib/docker/volumes/nginx-data/_data/index.htmlroot@yt:~# cat /var/lib/docker/volumes/nginx-data/_data/index.htmlnginx web
复制代码


2、使用数据目录挂载方式

在宿主机创建要挂载到容器内的目录及文件

root@yt:~# mkdir -pv /data/testapp mkdir: created directory '/data'mkdir: created directory '/data/testapp'root@yt:~# echo "testapp web page" > /data/testapp/index.htmlroot@yt:~# cat /data/testapp/index.htmltestapp web page
复制代码

启动容器并将目录挂载到容器

##直接挂载root@yt:~# docker run -d --name web1 -v /data/testapp:/usr/share/nginx/html/testapp -p 81:80 nginx:1.20.2cfb892707215eb23224c28eb0a5dffdd1fc19efd9690bbb8e59698e2ab60a6bb

##将目录已只读的方式挂载root@yt:~# docker run -d --name web2 -v /data/testapp:/usr/share/nginx/html/testapp:ro -p 82:80 nginx:1.20.27375e2d5e49b366dd99298cde0c2dda21858ee340109a05146845b8352698ac9
复制代码

测试访问,已经挂载到容器,并且可以访问

root@yt:~# curl http://192.168.131.129:81/testapp/testapp web pageroot@yt:~# curl http://192.168.131.129:82/testapp/testapp web pageroot@yt:~# 
复制代码


3、数据目录及配置多卷挂载


创建目录,并将应用的配置文件 cp 到目录中

root@yt:~# mkdir -p /data/nginx/conf 
## 因为是将宿主机的文件挂载到容器内所以需要宿主机有这个文件才行,将nginx容器内自带的文件cp出来即可。root@yt:~# docker cp web1:/etc/nginx/nginx.conf /data/nginx/conf/root@yt:~# ls /data/nginx/conf/nginx.conf
复制代码

将刚刚 cp 出来的配置文件挂载到新启动的容器内,通过两次-v 将 testapp 和 nginx.conf 都挂载到容器内

root@yt:~# docker run -d --name web3 -v /data/testapp:/usr/share/nginx/html/testapp -v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro -p 83:80 nginx:1.20.2f4acec249f436a1874fd92fb24d3a2516059404c61a6673cb9d210eaf875e54f
复制代码


用户头像

忙着长大#

关注

还未添加个人签名 2022-02-09 加入

还未添加个人简介

评论

发布
暂无评论
docker数据卷使用_,docker_忙着长大#_InfoQ写作社区