容器数据卷

suaxi
2021-03-23 / 0 评论 / 159 阅读 / 正在检测是否收录...

容器数据卷:将应用和环境打包成一个镜像

目的:将容器中的目录,挂在的Linux本地(容器的持久化和同步操作、容器间数据共享)


方式一:直接使用 -v 命令挂载

docker run -it -v 主机目录:容器内目录

# 测试
[root@suaxi ~]# docker run -it -v /home/test:/home centos /bin/bash

1.1-v直接挂载.png

从容器同步到主机:

1.2同步过程(双向绑定).png

从主机同步到容器:(在容器停止后,主机修改了绑定路径下的文件,容器再次启动后,双向绑定依然生效)

1.3同步过程(双向绑定).png


1.安装MySQl

# 拉取镜像
[root@suaxi ~]# docker pull mysql

# 官方文档命令
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

# 启动(注意:docker启动mysql需使用-e命令配置密码)
-d 后台运行
-p 端口映射
-v 数据卷挂载
-e 环境配置
--name 给容器起个别名
[root@suaxi ~]# docker run -d -p 8088:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql


# 后续再使用navicat等工具连接docker中的mysql实际测试一下配置是否生效

2.安装mysql测试.png

删除容器之后,同步到本地的数据依然存在,即实现数据的持久化。


2.具名挂载、匿名挂载

# 匿名挂载
-v 容器内的路径
-P 大写的P,随机映射端口
[root@suaxi ~]# docker run -d -P --name nginx01 -v /etc/nginx nginx

3.匿名挂载.png


# 具名挂载
-v 卷名:容器内路径
[root@suaxi ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx

# 查看刚才挂载的卷
[root@suaxi ~]# docker volume inspect juming-nginx

4.具名挂载.png

所有docker容器内的卷,在没有指定目录的情况下都在 /var/lib/docker/volumes/xxx/

通过具名挂载,可以方便的找到挂载的卷及相关数据、信息


# 区分匿名/具名挂载、指定路径挂载
-v 容器内路径            # 匿名挂载
-v 卷名:容器内路径           # 具名挂载
-v /主机路径:容器内路径      # 指定路径挂载


# 通过 -v 容器内路径:ro/rw 改变读写权限
ro read only    # 只读
rw read/write    # 可读可写

[root@suaxi ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
[root@suaxi ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

# ro 只能通过主机来操作,容器内只具有读的权限


方式二:Dockerfile

通过脚本生成镜像

# 1.创建dockerfile文件
# 2.编写脚本,命令(都是大写)参数
FROM centos

VOLUME ["volume01","volume02"]

CMD echo "----create complete----"
CMD /bin/bash

5.1.dockerfile脚本.png

启动并进入容器:

5.2.dockerfile启动容器.png


脚本命令中挂载的目录是匿名挂载:

5.3.dockerfile匿名挂载.png


测试挂载目录下的双向绑定是否成功:

5.4.dockerfile双向绑定.png


1.数据卷容器

多个mysql同步数据

6.数据卷容器.png

图片来源:狂神说Java


# 通过刚才的脚本依次启动3个容器
[root@suaxi docker-test-volume]# docker run -it --name docker01 b0bf8a6507a3

[root@suaxi docker-test-volume]# docker run -it --name docker02 --volumes-from docker01 b0bf8a6507a3

[root@suaxi docker-test-volume]# docker run -it --name docker03 --volumes-from docker01 b0bf8a6507a3

7.1.数据卷容器文件同步.png


通过volumes实现容器间的数据共享

7.2.volumes容器间数据共享.png

注:即使删除父容器docker01,其他容器中的数据依然存在

# 实现多个mysql间的数据同步
[root@suaxi ~]# docker run -d -p 8088:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql

[root@suaxi ~]# docker run -d -p 8088:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql

结论:

容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。

0

评论 (0)

取消