Docker容器数据卷

容器数据卷

  1. 什么是容器数据卷:

    docker可以将应用程序连同环境一起打包成镜像容器运行,但容器是互相隔离,一旦容器被删除,容器内的数据便都会丢失,无法持久化保留。为了解决该问题,容器数据卷便诞生了,它可以实现资源共享,将某个文件目录挂在到宿主机上,实现数据的同步,同时也支持容器和容器间的数据共享。
  2. 使用数据卷:

    • 方式一:

      # 将容器目录地址挂在到宿主机上
      docker run -it -v 宿主机目录地址:容器目录地址 centos /bin/bash

      练习1:

      1. docker run -it -v C:\Users\Administrator\Desktop\mounts:/opt centos /bin/bash

      2. 此时,容器的opt目录已经挂载到了宿主机c盘桌面的mounts文件夹上(如果没有mounts文件夹,执行完命令后会自动创建)

      3. 此时,宿主机mounts和容器opt是资源共享,双向绑定的关系,mounts有的opt会有,opt有的mounts也会有。可以在opt添加一个文件,或在mounts添加一个文件进行测试

      4. 在opt创建一个hello.java,会自动同步到mounts中 

      5. 在mounts中查看 

      6. 补充:只要容器存在(不运行的情况下),资源发生了变化也会自动同步!之后如果不想在容器内部修改,通过数据源资源共享,便可实现例如直接在本地修改容器配置文件等操作。


       

      练习2:实现mysql数据持久化

      1. docker pull mysql:5.7

      2. docker run -d -p 3310:3306 --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 -v D:\docker_mysql\conf.d:/etc/mysql/conf.d  -v D:\docker_mysql\data:/etc/mysql/data mysql:5.7
        # -d 后台运行;-p 端口映射;--name 给容器命名;-e 环境参数配置;-v 数据卷挂载

      3. 在宿主机上测试连接容器mysql

      4. 连接后可以建库等操作,会发现挂载的目录会数据自动同步,即使最后把mysql容器删掉,宿主机上的数据仍然存在,实现数据持久保留。

具名和匿名挂载

1. -v 容器路径  # 匿名挂载:不写前面的宿主机路径,只写容器路径
docker run -d --name nginx01 -v /etc/nginx nginx
2. -v 卷名:容器路径 # 具名挂载:将宿主机路径改成一个卷名:容器路径
docker run -d --name nginx02 -v my_nginx_volume:/etc/nginx nginx
3. docker volume ls # 查看数据卷
DRIVER   VOLUME NAME
local     9bdc86392992977a2672bcc8cb17cb480f2ece9d6487d4da901581f00964637e # 匿名(docker会自动生成一个卷名)
local     my_nginx_volume # 具名(自已定义的卷名)
4. docker volume inspect 卷名 # 查看指定卷名的信息
docker volume inspect my_nginx_volume
# 通常会使用具名挂载,而不会使用匿名挂载

# 扩展
docker run -d -v my_nginx_volume:/etc/nginx:ro nginx # ro :readOnly 只读
docker run -d -v my_nginx_volume:/etc/nginx:rw nginx # rw :readWrite 读写(默认)
# 一旦设置了ro,便说明这个路径只能通过宿主机来操作,容器内部是无法操作的

 

DockerFIle(后面会详细说DockerFile,这里只是简单使用dockerfile进行数据卷挂载演示)

什么是DockerFile:DockerFile就是通过编写命令脚本,构建镜像的!

pull 镜像的时候,我们可以发现是一层一层拉取的,而构建镜像的脚本命令,也是一层一层的。

# 1. 在宿主机上创建dockerfile文件,编写命令脚本。命令都是大写(运行时将#注释删除掉)
FORM centos # 首先镜像需要跑在一个服务器上,所有这里使用centos作为基础
VOLUME ["volume01","volume02"] # 挂载文件(匿名挂载)
CMD echo "---end---" # CMD 以命令行的方式运行
CMD /bin/bash # 默认进入到bash控制台
# 2.构建镜像
-f # dockerfile文件路径
-t # 镜像名称
# docker build -f dockerfile文件路径 -t 镜像名称 打包路径
docker build -f D:\docker-file\docklefile01 -t my-first-image-centos D:\docker-file
# build 完成后,执行 docker images 便会看到我们自己构建的 my-first-image-centos 镜像

#既然有挂载,说明容器内和宿主机是资源共享的,通过inspect查看容器元数据,查看卷挂载的路径。
#在实际使用docker中,挂载大多都会在dockerfile中进行挂载,否则便需要-v手动挂载。

posted @ 2022-01-17 17:39  迷路小孩  阅读(75)  评论(0)    收藏  举报