数据卷介绍:
数据卷的特点及使用:
创建容器的时候指定参数会删除/var/lib/docker/containers/的容器数据目录,但是不会删除数据卷的内容,实现即使删除容器持久化的数据也不会丢失。
数据卷是宿主机的目录或者文件,并且可以在多个容器之间共同使用。
在宿主机对数据卷更改数据后会在所有容器里面会立即更新。
数据卷的数据可以持久保存,即使删除使用使用该容器卷的容器也不影响。
在容器里面的写入数据不会影响到镜像本身。
数据卷使用场景:
1、使用 create volume 方式
创建 volume
root@yt:~# docker volume create nginx-data
nginx-data
root@yt:~# docker volume ls
DRIVER VOLUME NAME
local nginx-data
复制代码
启动容器,报错
root@yt:~# docker run -it -d -p 80:80 -v nginx-data:/data nginx:1.20.2
Unable to find image 'nginx:1.20.2' locally
1.20.2: Pulling from library/nginx
a2abf6c4d29d: 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: 1
WARNING: No swap limit support
复制代码
再次启动容器,启动成功
root@yt:~# docker run -it -d -p 80:80 -v nginx-data:/data nginx:1.20.2
Unable to find image 'nginx:1.20.2' locally
1.20.2: Pulling from library/nginx
a2abf6c4d29d: Already exists
da03644a1293: Already exists
dcbfc6badd70: Already exists
3f7ccff97047: Already exists
49e31097680b: Already exists
c423e1dacb26: Already exists
Digest: sha256:03f3cb0afb7bd5c76e01bfec0ce08803c495348dccce37bcb82c347b4853c00b
Status: Downloaded newer image for nginx:1.20.2
f45b71664cab34bc9cba1d0190a79934bf639ef8ab6401e1d2bfb1cbcbf4c64f
root@yt:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f45b71664cab 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 bash
root@f45b71664cab:/# echo "nginx web" > /data/index.html
root@f45b71664cab:/# exit
exit
root@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.html
root@yt:~# cat /var/lib/docker/volumes/nginx-data/_data/index.html
nginx 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.html
root@yt:~# cat /data/testapp/index.html
testapp web page
复制代码
启动容器并将目录挂载到容器
##直接挂载
root@yt:~# docker run -d --name web1 -v /data/testapp:/usr/share/nginx/html/testapp -p 81:80 nginx:1.20.2
cfb892707215eb23224c28eb0a5dffdd1fc19efd9690bbb8e59698e2ab60a6bb
##将目录已只读的方式挂载
root@yt:~# docker run -d --name web2 -v /data/testapp:/usr/share/nginx/html/testapp:ro -p 82:80 nginx:1.20.2
7375e2d5e49b366dd99298cde0c2dda21858ee340109a05146845b8352698ac9
复制代码
测试访问,已经挂载到容器,并且可以访问
root@yt:~# curl http://192.168.131.129:81/testapp/
testapp web page
root@yt:~# curl http://192.168.131.129:82/testapp/
testapp web page
root@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.2
f4acec249f436a1874fd92fb24d3a2516059404c61a6673cb9d210eaf875e54f
复制代码
评论