docker 入门到精通(四)

发布于 更新于
本文目录
  1. 容器数据卷
  2. 什么是容器数据卷?
  3. 使用数据卷
  4. 实战mysql 数据卷挂载
  5. 具名挂载和匿名挂载
  6. 挂载方式总结
  7. ro和rw
  8. 使用Dockerfile挂载卷
  9. 1、编写dockerfile文件
  10. 2、通过dockerfile构建镜像
  11. 3、通过新镜像运行容器
  12. 容器之前共享数据卷

技术文章持续集成与运维

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

容器数据卷

什么是容器数据卷?

比如你创建了一个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容器是否能运行

来源:testingpai

继续阅读