Docker05:容器数据卷与数据卷容器

一、容器数据卷

1、什么是数据卷

  • 当将应用软件和环境打包成一个镜像,当生成一个容器,如果数据都存在容器中时,删除容器就等于删除所有数据了,这是就需要将容器中的数据保存到本地。
  • 容器间可以有一个数据共享的技术,docker容器产生的数据同步到本地。
  • 容器的持久化和同步操作。
  • 容器间也是可以数据共享的。

2、如何使用数据卷技术

  • 直接使用命令挂载
docker run -it -v 主机目录:容器内目录  -p 主机端口:容器内端口

# /home/ceshi:主机home目录下的ceshi文件夹  映射:centos容器中的/home

[root@iz2zeak7 home]# docker run -it -v /home/ceshi:/home centos /bin/bash

#这时候主机的/home/ceshi文件夹就和容器的/home文件夹关联了,二者可以实现文件或数据同步了
#通过 docker inspect 容器id 查看

[root@iz2zeak7sgj6i7hrb2g862z home]# docker inspect 6064c490c371

在这里插入图片描述

二、mysql实现数据持久化

1、mysql使用容器数据卷实现本地数据持久化

  • 命令
# 获取mysql镜像
[root@iz2zeak7sgj6i7hrb2g862z home]# docker pull mysql:5.7
# 运行容器,需要做数据挂载 #安装启动mysql,需要配置密码的,这是要注意点!
# 参考官网hub 
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
#启动我们得
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
-- name 容器名字
$ docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql03 mysql:5.7
# 启动成功之后,我们在本地使用sqlyog来测试一下
# sqlyog-连接到服务器的3306--和容器内的3306映射 
# 在本地测试创建一个数据库,查看一下我们映射的路径是否ok!
  • 连接本地SQLyog进行测试,需要注意的是,宿主的端口3310需要在阿里云的安全组中打开,否则无法完成映射与连接
    在这里插入图片描述
  • 本地新建test数据库,实现与容器的同步
    在这里插入图片描述
  • 我们将包含mysql的容器删除时,会发现我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能。
    在这里插入图片描述

三、具名挂载和匿名挂载

1、具名挂载

# 具名挂载 -P:表示随机映射端口
$ docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
9663cfcb1e5a9a1548867481bfddab9fd7824a6dc4c778bf438a040fe891f0ee
# 查看所有的volume(卷)的情况
$ docker volume ls                  
DRIVER              VOLUME NAME
local               21159a8518abd468728cdbe8594a75b204a10c26be6c36090cde1ee88965f0d0
local               b17f52d38f528893dd5720899f5

2、匿名挂载

# 匿名挂载
-v 容器内路径!
$ docker run -d -P --name nginx01 -v /etc/nginx nginx
# 查看所有的volume(卷)的情况
$ docker volume ls    
DRIVER              VOLUME NAME # 容器内的卷名(匿名卷挂载)
local               21159a8518abd468728cdbe8594a75b204a10c26be6c36090cde1ee88965f0d0
local               b17f52d38f528893dd5720899f555caf22b31bf50b0680e7c6d5431dbda2802c
# 这里发现,这种就是匿名挂载,我们在 -v只写了容器内的路径,没有写容器外的路径!

3、通过 -v 卷名,查看容器内路径

docker volume inspect juming-nginx

在这里插入图片描述

  • 所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/自定义的卷名/_data下,如果指定了目录,docker volume ls 是查看不到的。
    在这里插入图片描述

4、区分三种挂载方式

# 三种挂载: 匿名挂载、具名挂载、指定路径挂载
-v 容器内路径                  #匿名挂载
-v 卷名:容器内路径             #具名挂载
-v /宿主机路径:容器内路径       #指定路径挂载 docker volume ls 是查看不到的
  • 拓展
# 通过 -v 容器内路径: ro rw 改变读写权限
ro          #readonly 只读
rw          #readwrite 可读可写
$ docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx
$ docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!

四、初始Dockerfile

1、什么是Dockerfile

  • Dockerfile 就是用来构建docker镜像的构建文件。

2、生成镜像

  • 通过脚本可以生成镜像,镜像是一层一层的,脚本是一个个的命令,每个命令都是一层。
# 创建一个dockerfile文件,名字可以随便 建议Dockerfile

# 文件中的内容: 指令(大写) + 参数

$ vim dockerfile1
    FROM centos                        # 当前这个镜像是以centos为基础的
    VOLUME ["volume01","volume02"]     # 挂载卷的卷目录列表(多个目录)
    CMD echo "-----end-----"           # 输出一下用于测试
    CMD /bin/bash                      # 默认走bash控制台
    
# 这里的每个命令,就是镜像的一层。

$ docker build -f dockerfile1 -t caoshipeng/centos .
-f dockerfile1             # f代表file,指这个当前文件的地址(这里是当前目录下的dockerfile1)
-t caoshipeng/centos       # t就代表target,指目标目录(注意caoshipeng镜像名前不能加斜杠‘/’)
.                          # 表示生成在当前目录下

Sending build context to Docker daemon   2.56kB
Step 1/4 : FROM centos
latest: Pulling from library/centos
8a29a15cefae: Already exists 
Digest: sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700
Status: Downloaded newer image for centos:latest
 ---> 470671670cac
Step 2/4 : VOLUME ["volume01","volume02"]              # 卷名列表
 ---> Running in c18eefc2c233
Removing intermediate container c18eefc2c233
 ---> 623ae1d40fb8
Step 3/4 : CMD echo "-----end-----"                    # 输出脚本命令
 ---> Running in 70e403669f3c
Removing intermediate container 70e403669f3c
 ---> 0eba1989c4e6
Step 4/4 : CMD /bin/bash
 ---> Running in 4342feb3a05b
Removing intermediate container 4342feb3a05b
 ---> f4a6b0d4d948
Successfully built f4a6b0d4d948
Successfully tagged caoshipeng/centos:latest

# 查看自己构建的镜像
$ docker images
REPOSITORY          TAG          IMAGE ID            CREATED              SIZE
caoshipeng/centos   latest       f4a6b0d4d948        About a minute ago   237MB

3、启动自己写的容器镜像

 docker run -it f4a6b0d4d948 /bin/bash      # 运行自己写的镜像
 ls -l                                      # 查看目录

在这里插入图片描述

  • 这个卷的外部一定有一个同步的目录
    在这里插入图片描述
  • 查看一下卷挂载
 docker inspect 容器id
 docker inspect ca3b45913df5

在这里插入图片描述

  • 测试一下刚才的文件是否同步出去了
    在这里插入图片描述
  • 这种方式使用的十分多,因为我们通常会构建自己的镜像,假设构建镜像的时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径。

五、数据卷容器

1、多个mysql同步数据

  • 命名的容器挂载数据卷
    在这里插入图片描述
  • 启动三个容器实现数据同步
创建docker01:因为我本机是最新版
docker run -it --name docker01 caoshipeng/centos:latest

查看容器docekr01内容
ls
bin  home   lost+found    opt   run   sys  var
dev  lib    media    proc  sbin  tmp  volume01
etc  lib64  mnt        root  srv   usr  volume02

不关闭该容器退出
CTRL + Q + P  

创建docker02: 并且让docker02 继承 docker01
docker run -it --name docker02 --volumes-from docker01 caoshipeng/centos:latest

查看容器docker02内容
ls
bin  home   lost+found    opt   run   sys  var
dev  lib    media    proc  sbin  tmp  volume01
etc  lib64  mnt        root  srv   usr  volume02

在这里插入图片描述

  • 创建docker03继承docker01
 docker run -it --name docker03 --volumes-from docker01 caoshipeng/centos:latest
cd volume01    #进入volume01 查看是否也同步docker01的数据

ls 
docker01.txt
# 测试:可以删除docker01,查看一下docker02和docker03是否可以访问这个文件
# 测试发现:数据依旧保留在docker02和docker03中没有被删除

在这里插入图片描述

  • 多个mysql实现数据共享
$ docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
$ docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01  mysql:5.7
# 这个时候,可以实现两个容器数据同步。
  • 容器之间的配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
  • 但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的。

版权声明:本文为WADE_AJJD原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。