目录
1.问题:
1.1容器的数据保存问题 和 数据持久化怎么实现
Docker 有两个选项让容器在主机上存储文件,以便即使在容器停止后文件也能持久保存:volumes和 bind mounts,使用tmpfs mount将文件存储在主机的系统内存中。
卷存储
由 Docker(/var/lib/docker/volumes/在 Linux 上)管理的主机文件系统的一部分中。非 Docker 进程不应修改文件系统的这一部分。卷是在 Docker 中持久化数据的最佳方式。
绑定挂载
可以存储在主机系统的任何位置。它们甚至可能是重要的系统文件或目录。Docker 主机或 Docker 容器上的非 Docker 进程可以随时修改它们。
tmpfs
挂载仅存储在主机系统的内存中,永远不会写入主机系统的文件系统。
1.2正常停止容器,容器的数据会丢失吗
不会丢失,会保存到 /var/lib/docker/volumes
2.如何将容器里面的数据保存到宿主机
Use volumes | Docker Documentation
2.1卷
卷是保存由 Docker 容器生成和使用的数据的首选机制。虽然绑定挂载依赖于主机的目录结构和操作系统,但卷完全由 Docker 管理。与绑定挂载相比,卷有几个优点:
- 卷比绑定挂载更容易备份或迁移。
- 您可以使用 Docker CLI 命令或 Docker API 管理卷。
- 卷适用于 Linux 和 Windows 容器。
- 卷可以在多个容器之间更安全地共享。
- 卷驱动程序允许您将卷存储在远程主机或云提供商上,以加密卷的内容或添加其他功能。
- 新卷的内容可以由容器预先填充。
- Docker Desktop 上的卷比来自 Mac 和 Windows 主机的绑定挂载具有更高的性能。
此外,与在容器的可写层中持久化数据相比,卷通常是更好的选择,因为卷不会增加使用它的容器的大小,并且卷的内容存在于给定容器的生命周期之外。
创建和管理卷
创建卷
[root@localhost scout]# docker volume create meiko-vol
列出卷
[root@localhost scout]# docker volume ls
检查卷
[root@localhost scout]# docker volume inspect meiko-vol
[
{
"CreatedAt": "2022-08-10T22:51:06+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/meiko-vol/_data",
"Name": "meiko-vol",
"Options": {},
"Scope": "local"
}
]
删除卷
docker volume rm my-vol
启动一个带有卷的容器
[root@localhost scout]# docker run --name meiko-nginx-2 -d -p 3378:80 --mount source=meiko-vol,target=/usr/share/nginx/html nginx
进入卷
[root@localhost scout]# cd /var/lib/docker/volumes/
[root@localhost volumes]# cd meiko-vol/
[root@localhost meiko-vol]# ls
_data
[root@localhost meiko-vol]# cd _data/
[root@localhost _data]# ls
50x.html index.html
2.2绑定挂载
#docker挂载文件或目录到容器
#创建目录及文件
mkdir -p /data/test1
echo 'docker volume'>/data/test1/test.txt
#创建容器,-v 挂载目录(默认读写权限)
docker run -dit --name busybox1 -v /data/test1:/data/test1 busybox
#查看
docker exec busybox1 cat /data/test1/test.txt
#修改文件后,在查看本地是否更改
docker exec busybox1 echo my files>>/data/test1/test.txt
docker exec busybox1 cat /data/test1/test.txt
cat /data/test1/test.txt
2.3tmpfs挂载
Use tmpfs mounts | Docker Documentation
# 使用--tmpfs
docker run -dit --name tmpfs-test --tmpfs /app busybox
3.数据共享
3.1在同一台主机上
要想容器和宿主机之间实现数据传输,需要容器和宿主机使用同一个卷volume
docker run --name meiko-nginx-2 -d -p 3378:80 --mount source=meiko-vol,target=/usr/share/nginx/html nginx
docker run --name meiko-nginx-3 -d -p 3379:80 --mount source=meiko-vol,target=/usr/share/nginx/html nginx
3.2在不同主机上
多台宿主机上的容器,可以将卷挂在同一台存储设备上,比如比较容易构建的nfs
#NFS服务端,配置nfs共享
yum install nfs-utils rpcbind -y
mkdir -p /data/nfs/docker
echo "/data/nfs *(rw,no_root_squash,sync)">>/etc/exports
exportfs -r
systemctl start rpcbind nfs-server
systemctl enable rpcbind nfs-server
showmount -e localhost
#nfs客户端
yum install -y nfs-utils rpcbind
#创建volume 连接 172.16.50.43:/data/nfs
docker volume create --driver local \
--opt type=nfs \
--opt o=addr=172.16.50.43,rw \
--opt device=:/data/nfs \
volume-nfs
#查看
docker volume ls
docker volume inspect volume-nfs
#容器使用volume-nfs
docker run -dit --name busybox7 -v volume-nfs:/nfs busybox
#查看
docker inspect -f {{.Mounts}} busybox7
df -h |grep /data/nfs
#volume目录/var/lib/docker/volumes/volume-nfs/_data自动挂载到了nfs服务上
#容器创文件测试
docker exec busybox7 touch /nfs/testfiles.txt