容器数据卷
什么是容器数据卷?
比如你创建了一个mysql的容器,在里面新建数据库、表、数据,之后你想迁移数据或者升级数据库。直接把容器mysql容器删除,里面的数据也会跟着被删除,这时候如果可以把数据和容器分离,单独挂载一个数据卷,那么就能会好的应对这类问题。
使用数据卷
方式一: -v 宿主机路径:容器路径
[root@localhost ~]# docker run -d -v /test:/usr/local/tomcat/webapps --name mytomcat -p 8080:8080 a33700929548
[root@localhost ~]#docker exec -it 3f18bc983 /bin/bash
root@3f18bc9835da:/usr/local/tomcat# cd webapps
root@3f18bc9835da:/usr/local/tomcat/webapps# ls
此时webapps目录下没有任何东西。切换到linxu宿主机
[root@localhost webapps]# cd /home/webapps
[root@localhost webapps]# touch test.java
此时容器webapps目录下也会有test.java,也就是说容器中webapps目录实际是指向linxu宿主机/home/webapps
实战mysql 数据卷挂载
[root@localhost ~]# docker run -d -p 3306:3306 -v /test/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 7aacec936dc9
具名挂载和匿名挂载
[root@localhost ~]# docker run -d --name mynginx -P -v /etc/nginx nginx
匿名挂载:只给出容器内路径
[root@localhost ~]# docker volume ls
查看所有匿名volume
local e239204ac9b6687102879dbc1290269ed198a34f80d5f39e4483f9dc713d4cff
[root@localhost ~]# docker run -d --name mynginx -P -v nginx_volume:/etc/nginx nginx
具名挂载:给出名字,不能在前面加/,加了就表示绝对路径。
[root@localhost ~]# docker volume ls
local nginx_volume
[root@localhost ~]# docker volume inspect nginx_volume
查看数据卷信息
[
{
"CreatedAt": "2021-01-14T01:20:44+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/nginx_volume/_data",
"Name": "nginx_volume",
"Options": null,
"Scope": "local"
}
]
其中/var/lib/docker/volumes就是所有数据卷在宿主机中的目录。
挂载方式总结
-v 容器内路径 匿名挂载
-v 卷名:容器内路径 具名挂载
-v /宿主机路径:容器路径 指定路径挂载
ro和rw
ro readOnly #只读
rw readWrite #可读可写
docker run -d --name mynginx -P -v nginx_volume:/etc/nginx:ro nginx
docker run -d --name mynginx -P -v nginx_volume:/etc/nginx:rw nginx
# ro 路径只能通过宿主机操作,不能从容器内容操作。
使用Dockerfile挂载卷
dockerfile是啥?dockerfile 用来构建docker镜像的文件。
1、编写dockerfile文件
FROM cetnos
VOLUME ["volume01","volume02"]
CMD echo ".....end....."
CMD /bin/bash
2、通过dockerfile构建镜像
[root@localhost home]# docker build -f /home/dockerfile01 -t lj_centos .
Sending build context to Docker daemon 121MB
Step 1/4 : FROM centos
---> 300e315adb2f
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in 625283035ed5
Removing intermediate container 625283035ed5
---> e0dfe5f28b8d
Step 3/4 : CMD echo ".....end....."
---> Running in 9e46f4c22a0d
Removing intermediate container 9e46f4c22a0d
---> 52f777986e57
Step 4/4 : CMD /bin/bash
---> Running in c4529bbb2dbf
Removing intermediate container c4529bbb2dbf
---> 95917d694396
Successfully built 95917d694396
Successfully tagged lj_centos:latest
#查看镜像
[root@localhost home]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
lj_centos latest 95917d694396 12 seconds ago 209MB
3、通过新镜像运行容器
[root@localhost home]# docker run -it lj_centos /bin/bash
[root@3cf8b26d06cd /]# ls -l
total 0
lrwxrwxrwx. 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x. 5 root root 360 Jan 15 14:31 dev
drwxr-xr-x. 1 root root 66 Jan 15 14:31 etc
drwxr-xr-x. 2 root root 6 Nov 3 15:22 home
lrwxrwxrwx. 1 root root 7 Nov 3 15:22 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
drwx------. 2 root root 6 Dec 4 17:37 lost+found
drwxr-xr-x. 2 root root 6 Nov 3 15:22 media
drwxr-xr-x. 2 root root 6 Nov 3 15:22 mnt
drwxr-xr-x. 2 root root 6 Nov 3 15:22 opt
dr-xr-xr-x. 146 root root 0 Jan 15 14:31 proc
dr-xr-x---. 2 root root 162 Dec 4 17:37 root
drwxr-xr-x. 11 root root 163 Dec 4 17:37 run
lrwxrwxrwx. 1 root root 8 Nov 3 15:22 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 3 15:22 srv
dr-xr-xr-x. 13 root root 0 Jan 15 14:05 sys
drwxrwxrwt. 7 root root 145 Dec 4 17:37 tmp
drwxr-xr-x. 12 root root 144 Dec 4 17:37 usr
drwxr-xr-x. 20 root root 262 Dec 4 17:37 var
drwxr-xr-x. 2 root root 6 Jan 15 14:31 volume01
drwxr-xr-x. 2 root root 6 Jan 15 14:31 volume02
容器之前共享数据卷
多个容器之间可以共享数据卷,类似于共享文件夹。共享的原理是双向拷贝,不会因为删除一个容器导致其他容器不能使用数据卷。
1. 先启动一个centos docker01
[root@localhost ~]# docker run -it --name docker01 lj_centos
2. 在启动一个centos docker02,并关联挂载卷
[root@localhost ~]# docker run -it --name docker02 --volumes-from docker01 lj_centos
3. 在其中一个容器的共享数据卷创建文件,观察另外一个
4. 删除docker01容器查看docker02容器是否能运行
欢迎来到testingpai.com!
注册 关于