在生产环境中使用Docker时,经常需要对数据进行持久化,这就有点像Redis里面的持久性一样的,或者需要在多个容器之间在进行数据共享,这就是Docker中我们说的数据管理操作。
容器中管理数据主要有两种方式:
数据卷(Data Volumes):容器内数据直接映射到本地主机环境;
数据卷容器(Data Volume Containers):使用特定容器维护数据卷;
01数据卷
数据卷(Data Volumes)是一个可供容器使用的特殊目录,它可以将主机操作系统目录直接映射进容器,类似于Linux中的mount行为。
数据卷可以提供很多有用的特性:
目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中。
volume:
Docker管理宿主机文件系统的一部分,默认位于/var/lib/docker/volumes目录中,这是目前使用的最多的方式。
目前所有容器的数据都保存在这个目录下,由于没有创建指定卷,所以Docker帮默认创建了许多匿名卷。
bind mount:
表示可以存储在宿主机系统的任意位置,这种方法比较常用。但是bind mount在不同的宿主机系统时不可移植。
tmpfs mount:
表示挂载存储在宿主机系统内存中,而不会写入宿主机的文件系统,几乎不用。
02创建数据卷
Docker提供了volume子命令来管理数据卷,volume子命令的语法格式如下:
docker volume create [OPTIONS] [VOLUME]
//创建一个自宝义容器卷
root@ubuntu:/var/lib/docker/volumes# docker volume create my-vol
//查看所有容器卷
root@ubuntu:/var/lib/docker/volumes# docker volume ls
DRIVER VOLUME NAME
local badc300c2e02888929999ee56f2653983adc52a06b62e2b86f3a2ce6228b4ae4
local my-vol
//查看指定容器卷详细信息
root@ubuntu:/var/lib/docker/volumes# docker volume inspect my-vol
[
{
"CreatedAt": "2021-09-26T08:17:59-07:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]
//删除数据卷
docker volume rm my-vol
03绑定数据卷
定义好数据卷后,即可以创建一个使用这个数据卷的容器,下面 nginx为例,将数据卷绑定到容器中。将本地的my-vol数据卷挂载到/usr/share/nginx/html目录下。
root@uuntu:/var/lib/docker/volumes# docker run -it --name=test-nginx -p 80:80 -v
local-test-vol:/usr/local/nginx/html nginx
绑定完成后可以通过inspect命令来查看是否绑定成功。
root@ubuntu:/var/lib/docker/volumes/local-test-vol/_data# docker inspect testnginx
//inspect命令可以看到以下内容,由于内容比较多,所以只摘起核心内容
"HostConfig": {
"Binds": [ //这是绑定的数据卷信"
local-test-vol:/usr/local/nginx/html"
//这是挂载点的信息
"Mounts": [{"Type": "volume","Name": "local-test-vol","Source": "/var/lib/docker/volumes/local-test-vol/_data","Destination": "/usr/local/nginx/html","Driver": "local","Mode": "z","RW": true,"Propagation": ""}]
接下来在本地目录/var/lib/docker/volumes/local-test-vol数据卷就可以与容器中
的/usr/local/nginx/html目录进行同步数据,进而达到持久化的效果。即不管是在本地数据卷中还是容器中的/usr/local/nginx/html目录中进行修改文件,两个目录的信息都可以互通。
即使如果容器停止了,我们在本地更新文件,再将容器启动也可以实现数据同步。
04Dockerfile添加数据卷
除了使用-v选项来添加数据卷之外,也可以使用Dockerfile文件中的VOLUME命令来创建一个带数据卷的镜像。VOLUME 指令创建具有指定名称的挂载点,并将其标记为保存来自本地主机或其他容器的外部安装的数据卷。该值可以是 JSON 数组,VOLUME ["/var/log/"],也可以是带有多个参数的纯字符串,例如 VOLUME /var/log 或 VOLUME /var/log /var/db。
使用Dockerfile创建带数据卷的镜像步骤如何下:
1)创建一个Dockerfile文件
任意一个目录下创建一个Dockerfile文件,Dockerfile文件内容如下:
FROM alpine:3.14
//设置容器内的数据卷
VOLUME ["/var/html"]
EXPOSE 80
2)使用build命令进行构建镜像
root@ubuntu:/home/test# docker build -t nginx:v1.0 .
Sending build context to Docker daemon 8.65MB
Step 1/3 : FROM alpine:3.14
3.14: Pulling from library/alpine
a0d0a0d46f8b: Pull complete
Digest: sha256:e1c082e3d3c45cccac829840a25941e679c25d438cc8412c2fa221cf1a824e6a
Status: Downloaded newer image for alpine:3.14
---> 14119a10abf4
Step 2/3 : VOLUME ["/var/html"]
---> Running in baa52a8c37bd
Removing intermediate container baa52a8c37bd
---> 83ba81539ce7
Step 3/3 : EXPOSE 80
---> Running in b0b0efd15aa3
Removing intermediate container b0b0efd15aa3
---> d10277ba6308
Successfully built d10277ba6308
Successfully tagged nginx:v1.0
root@ubuntu:/home/test# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v1.0 d10277ba6308 23 minutes ago 5.6MB
nginx latest ad4c705f24d3 2 weeks ago 133MB
alpine 3.14 14119a10abf4 4 weeks ago 5.6MB
其中nginx标签为v1.0的是我们使用Dockerfile新建的镜像
使用inspect命令可以查看该镜像的详细信息,在该镜像的详细信息中可以看到数据卷的信息。
root@ubuntu:/home/test# docker inspect d10277ba6308
"Volumes": {
"/var/html": {}
},
3)使用刚创建的镜像创建并运行一个容器
//创建一个容器,用的镜像为Dockerfile文件创建的镜像
root@ubuntu:/home/test# docker run -it --name nginx-v1.0 d10277ba6308
//查看创建容器的详细信息
root@ubuntu:/home/test# docker inspect nginx-v1.0
05数据卷容器
如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载。
1)创建一个父容器
创建方法跟之前类似;
2)再创建一个容器,并使用volumes-from选项来创建一个依赖于父容器的容器。
//创建一个依赖容器
root@ubuntu:/var/lib/docker/volumes# docker run -it --name nginx-dc2 --volumesfrom
test-nginx nginx
//查看刚创建的容器详细信息
root@ubuntu:/home/test# docker inspect 41530b76bebf
//可以看到会自动继承挂载的信息
"Mounts": [
{
"Type": "volume",
"Name": "local-test-vol",
"Source": "/var/lib/docker/volumes/local-test-vol/_data",
"Destination": "/usr/local/nginx/html",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
挂载数据卷完成后,在父容器test-nginx或继承容器nginx-dc2中的任意一个容器更新、删除文件,都可以同步到另外一个容器中。