Docker容器数据卷

Posted by Smile on March 17, 2021

Docker容器数据卷

容器之间可以有一个数据共享的技术,Docker容器中产生的数据,同步到本地。

目录的挂载,将我们的容器内的目录,挂载到Linux上

容器的持久化和同步操作,容器间也是可以数据共享的。

以后修改配置,只在本地修改即可,会自动同步到docker容器内

使用数据卷

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

[smile@hadoop101 ~]$ sudo docker run -it -v /home/test:/home centos /bin/bash
[root@e5684c592027 /]# 

# 使用 docker inspect 容器id 查看挂载信息

image-20210316193342200

eg:挂载 mysql data目录

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 mysql01 mysql

具名和匿名挂载

# 匿名挂载
# -v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx

[smile@hadoop101 data]$ sudo docker run -d -P --name nginx02 -v /etc/nginx nginx
cfdeb196e97d7739e7f71833c86a0c3088b8525912d85dbcde42ec8471f6d2a3
# 查看所有 volume 的情况
[smile@hadoop101 data]$ sudo docker volume ls
DRIVER    VOLUME NAME
local     de77542d20244bacb664a433c84efeb7c89375982a69dd42b1390bcb76c02db3
local     ed7f90fb393d15f1be09d18d82671d377824c99d8179f1708b48d57ff63697dd
# 这种就是匿名挂载,-v只写了容器内的路径

# 具名挂载
[smile@hadoop101 data]$ sudo docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx nginx
239b826e7f9f9c318cb30bc549c687678e54270f30738eb3a87ce0bf3821751b
[smile@hadoop101 data]$ sudo docker volume ls
DRIVER    VOLUME NAME
local     de77542d20244bacb664a433c84efeb7c89375982a69dd42b1390bcb76c02db3
local     ed7f90fb393d15f1be09d18d82671d377824c99d8179f1708b48d57ff63697dd
local     juming-nginx
[smile@hadoop101 home]$ sudo docker volume inspect juming-nginx
[
    {
        "CreatedAt": "2021-03-16T08:03:25-04:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]

# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载
-v 容器内路径		# 匿名挂载
-v 卷名:容器内路径		# 具名挂载
-v 宿主机路径:容器内路径	# 指定路径挂载

# 通过 -v 容器内路径:ro rw 改变读写权限
ro	readonly	# 只读
rw	readwrite	# 读写
# 一旦这个设置了容器权限,容器对挂载出来的内容就有限定了
docker run -d -P --name nginx04 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx04 -v juming-nginx:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作。

Dokcerfile 初识

​ Dockerfile 就是用来构建 docker 镜像的构建文件!命令脚本!

# 一:创建一个 dockerfile 文件
# 文件中的内容(指令[大写],参数)
# 通过这个脚本可以生产镜像,镜像是一层一层的
# 脚本一个个的命令,每个命令都是一层
FROM centos
VOLUME ["volume01","volume02"]		# 匿名挂载
CMD echo "--------end--------"
CMD /bin/bash

[smile@hadoop101 docker-test-volume]$ sudo docker run -it 607ed0af1745 /bin/bash
[root@37af30721b9f /]# ls
bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var	   volume02
dev  home  lib64  media       opt  root  sbin  sys  usr  volume01
# volume01 和 volume02 就是生成镜像的时候自动挂载的 数据卷的目录
"Mounts": [
            {
                "Type": "volume",
                "Name": "c865995f3ceb0a14c16d38ab705291ca95f14fc803f67903e5487c9e8cf99267",
                "Source": "/var/lib/docker/volumes/c865995f3ceb0a14c16d38ab705291ca95f14fc803f67903e5487c9e8cf99267/_data",
                "Destination": "volume02",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "b4a2e76fc793102cdaf03b1b63abb061662231db65be414c7d9f331241a99dbb",
                "Source": "/var/lib/docker/volumes/b4a2e76fc793102cdaf03b1b63abb061662231db65be414c7d9f331241a99dbb/_data",
                "Destination": "volume01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ]

数据卷容器

两个(多个)mysql 同步数据

image-20210316211028906

# 启动三个容器,通过刚才自己写的镜像
sudo docker run -it --name mycentos01 smile/centos:1.0
# 通过 --volumes-from 继承挂载 mycentos01,mycentos01就是数据卷容器
sudo docker run -it --name mycentos02 --volumes-from mycentos01 smile/centos:1.0

# 删除一个容器之后,其他容器不受影响
# 共享卷是双向拷贝,并不是同一份文件

# 所以 多个 mysql 实现数据共享
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 mysql01 mysql

docker run -d -p 3311:3306 --volumes-from mysql01 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 mysql

结论:

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

​ 但是一旦持久化到了本地,本地的数据是不会删除的