docker 入门到精通(四)

本贴最后更新于 1360 天前,其中的信息可能已经斗转星移

容器数据卷

什么是容器数据卷?

比如你创建了一个mysql的容器,在里面新建数据库、表、数据,之后你想迁移数据或者升级数据库。直接把容器mysql容器删除,里面的数据也会跟着被删除,这时候如果可以把数据和容器分离,单独挂载一个数据卷,那么就能会好的应对这类问题。

8.png

使用数据卷

方式一: -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容器是否能运行
回帖
请输入回帖内容 ...