【六、Docker容器卷详解】

【六、Docker容器卷详解】,第1张

🎉作者简介:👓 博 主 在 读 机 器 人 研 究 生 , 目 前 研 一 。 对 计 算 机 后 端 感 兴 趣 , 喜 欢 c + + , g o , p y t h o n , 目 前 熟 悉 c + + , g o 语 言 , 数 据 库 , 网 络 编 程 , 了 解 分 布 式 等 相 关 内 容 \textcolor{orange}{博主在读机器人研究生,目前研一。对计算机后端感兴趣,喜欢c++,go,python,目前熟悉c++,go语言,数据库,网络编程,了解分布式等相关内容} c++,go,python,c++go
📃 个 人 主 页 : \textcolor{gray}{个人主页:} 小呆鸟_coding
🔎 支 持 : \textcolor{gray}{支持:} : 如 果 觉 得 博 主 的 文 章 还 不 错 或 者 您 用 得 到 的 话 , 可 以 免 费 的 关 注 一 下 博 主 , 如 果 三 连 收 藏 支 持 就 更 好 啦 \textcolor{green}{如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦} 👍 就 是 给 予 我 最 大 的 支 持 ! \textcolor{green}{就是给予我最大的支持!} 🎁
💛本文摘要💛

本专栏将非常细致的讲解docker原理、安装、用docker部署相关服务器以及使用docker部署自己的镜像,非常简单易懂。 本文主要讲解docker数据卷概念以及使用数据卷挂载,实现容器与容器,容器与宿主机之间文件的同步以及相关理论知识。

文章目录 🍭1.数据卷介绍🍪1.什么是数据卷🍪2.为什么需要数据卷 🍭2.数据卷的使用🍦方式1:直接使用命令来挂载 -v 🍭3. 实战:安装MySQL实现数据卷挂载🍭4.具名和匿名挂载🍪1.匿名挂载🍪2.具名挂载🍪3.如何确定是具名挂载还是匿名挂载,还是指定路径挂载🍪4.扩展 🍭5.初识Dockerfile🍪1.使用Dockerfile构建一个新的镜像🍪2.执行构建镜像🍪3.启动自己写的容器🍪4.查看卷挂载路径🍪5.测试容器创建的container.txt文件是否同步到宿主机上 🍭6.容器数据卷🍦多个mysql实现数据共享

🍭1.数据卷介绍 🍪1.什么是数据卷

数据卷(Data Volumes)是宿主机中的一个目录或文件,数据卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。当容器目录和数据卷目录绑定后,对方的修改会立即同步,一个数据卷可以被多个容器同时挂载,一个容器也可以被挂载多个数据卷。

🍪2.为什么需要数据卷

docker是将应用和环境打包成一个镜像。
如果数据都存在容器中,那么我们将容器删除,此时数据就会丢失!需求:数据可持久化!

例如: 容器当中下载了mysql,你把容器删了,此时mysql中的数据也被删了。需求:MySQL数据可以保存在本地!

方法: 容器之间可以有一个数据共享技术!Docker容器中产生的数据,同步到本地!---->这就是卷技术!目录的挂载,将容器内的目录,挂载到linux版本!

卷的设计目的就是数据的持久化,和同步 *** 作完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

数据卷特性

数据卷可以在容器之间共享和重用,本地与容器间传递数据更高效

对数据卷的修改会立马有效,在容器内部与本地目录均可对数据卷进行修改

对数据卷的更新,不会影响镜像,对数据与应用进行了解耦 *** 作

卷会一直存在,直到没有容器使用

总结: 容器的持久化和同步 *** 作!容器间,容器与主都是可以数据共享的

🍭2.数据卷的使用 🍦方式1:直接使用命令来挂载 -v
docker run -it -v 主机目录:容器目录

#之前端口映射docker run -it -p 主机端口:容器端口

(1)查看主机home目录下只有一个lighthouse文件

(2)打开新的连接,查看主机home下多出测试文件

(3)查看挂载信息,通过查看Mounts

# docker inspect  容器id

[root@VM-16-15-centos home]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
02ea0bceb2c1   centos    "/bin/bash"   7 minutes ago   Up 7 minutes             priceless_bassi
[root@VM-16-15-centos home]# docker inspect 02ea0bceb2c1
[
    //..............................
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/home/ceshi",
                "Destination": "/home",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
    //...............................


即使容器停止运行或者容器删除,仍然可以实现数据同步,本地的数据卷不会丢失。
(4)正式测试(容器与本机都启动,通过在容器中创建文件,同步到本机中)

启动容器启动宿主机在容器中创建文件宿主机上同步相同的文件

(5)容器停掉,在本地test.go中输入hell linux update!!!,此时启动容器,发现home目录下文件已更新。停止容器宿主机上修改文件启动容器容器内的数据依旧是同步的!

以后我们修改只需要在本地修改即可,容器内会自动同步!!! 🍭3. 实战:安装MySQL实现数据卷挂载

MySQL的数据持久化的问题!

# 获取镜像
[root@VM-16-15-centos /]# docker pull mysql:5.7

#运行容器,需要做数据卷挂载!!! 安装启动mysql,需要配置密码。!!!
#官方文档:docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

#启动mysql
-d 后台启动
-p 端口映射
-v 卷挂载
-e 环境变量
--name 容器名字
[root@VM-16-15-centos /]# docker run -d -p 6666: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

#启动成功之后,在本地使用sqlyog来测试一下
#sqlyog-连接到服务器的6666 ----映射到容器的3306 ,这个时候我们就可以连接上了!!

#在本地测试创建一个数据库,查看一下我们映射的路径是否ok!
#在sqlyog中创建一个test1数据库,用服务器查看一下,发现里面多个一个test1数据库


假设将容器删除,发现我们挂载到本地的数据库依旧没有丢失,这就实现了容器的持久化功能!!!

🍭4.具名和匿名挂载 🍪1.匿名挂载

匿名挂载就是在指定数据卷的时候,不指定容器路径对应的主机路径,这样对应映射的主机路径就是默认的路径/var/lib/docker/volumes/中自动生成一个随机命名的文件夹。

匿名挂载Nginx容器

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

[root@VM-16-15-centos /]# docker run -d -P --name nginx02 -v /etc/nginx nginx
fc8882b1c63eeab2747c1f73de277cd17ec6adce03f3858ae80f987a89d78ffb


查看所有的volume的情况


[root@VM-16-15-centos /]# docker volume ls
DRIVER    VOLUME NAME
local     6d6823cbffcdc5309333df94acf6646c8e3b49998b17b9da58fd74694ce0b061
local     c393f55a28b9e8cd929cc57479c11a48290d74892ed481bc208cb8e881c1d7be

#  这种就是匿名挂载,我们在 -v 只写了容器内的路径,没有写容器外的路径!
🍪2.具名挂载

具名挂载,就是指定文件夹名称。

# 通过 -v 卷名:容器内路径
[root@VM-16-15-centos /]# docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx nginx
de989ab4da904d4485d09134ef75fbbdc902a17eb1f1ce088161e1331d04e1d1

[root@VM-16-15-centos /]# docker volume ls
DRIVER    VOLUME NAME
local     6d6823cbffcdc5309333df94acf6646c8e3b49998b17b9da58fd74694ce0b061
local     c393f55a28b9e8cd929cc57479c11a48290d74892ed481bc208cb8e881c1d7be
local     juming-nginx


查看指定卷信息

[root@VM-16-15-centos /]# docker volume inspect juming-nginx
[
    {
        "CreatedAt": "2022-06-13T22:29:41+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]

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

查看宿主机中的nginx信息

[root@VM-16-15-centos /]# cd /var/lib/docker/volumes
[root@VM-16-15-centos volumes]# ls
6d6823cbffcdc5309333df94acf6646c8e3b49998b17b9da58fd74694ce0b061  juming-nginx
backingFsBlockDev                                                 metadata.db
c393f55a28b9e8cd929cc57479c11a48290d74892ed481bc208cb8e881c1d7be

#为了方便找到一个卷,通常使用具名挂载

🍪3.如何确定是具名挂载还是匿名挂载,还是指定路径挂载
-v 容器内路径                   #匿名挂载
-v 卷名:容器内路径               #具名挂载
-v /宿主机路径:容器内路径         #指定路径挂载
🍪4.扩展
# 通过 -v 容器内路径 ,ro  rw 改变读写权限
ro    readonly   #只读
rw   readwrite   #可读可写

# 一旦这个设置了容器权限,容器 对我们挂载出来就有限制了!!
 docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
 docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

# ro只要看到ro说明这个路径只能通过宿主机来 *** 作,容器内部无法 *** 作
🍭5.初识Dockerfile

Dockerfile就是用来构建docker镜像的文件!之前使用commint生成过dockerfile文件!相当于命令脚本,执行一下就可以!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个一个命令,每一个命令都是一层。

之前是通过 -v具名和匿名挂载,现在通过生成一个镜像,在创建镜像的时候,就实现了挂载 🍪1.使用Dockerfile构建一个新的镜像

使用Dockerfile构建一个新的镜像,dockerfile1文件的内容,匿名挂载了volume01和volume02两个目录:

# 创建一个dockerfile1文件,文件中的内容,指令(大写) 参数
FORM centos
VOLUME ["volume01","volume02"]

CMD echo "----end-----"
CMD /bin/bash              
#这里的每个命令,相当于镜像的每一层!!     
[root@VM-16-15-centos home]# ls
ceshi  lighthouse  mysql

[root@VM-16-15-centos home]# mkdir docker-test-volume
[root@VM-16-15-centos home]# ls
ceshi  docker-test-volume  lighthouse  mysql

[root@VM-16-15-centos home]# cd docker-test-volume/

[root@VM-16-15-centos docker-test-volume]# pwd
/home/docker-test-volume

[root@VM-16-15-centos docker-test-volume]# vim dockerfile1

[root@VM-16-15-centos docker-test-volume]# cat dockerfile1 
FROM centos

VOLUME ["volume01","volume02"]

CMD echo "----end-----"
CMD /bin/bash



🍪2.执行构建镜像
[root@VM-16-15-centos docker-test-volume]#  docker build -f /home/docker-test-volume/dockerfile1 -t dainiao/centos:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 5d0da3dc9764
Step 2/4 : VOLUME ["volume01","volume02"]
 ---> Running in 6c7c6458686b
Removing intermediate container 6c7c6458686b
 ---> 54d3b2a0f91f
Step 3/4 : CMD echo "----end-----"
 ---> Running in 86c3cdc908f3
Removing intermediate container 86c3cdc908f3
 ---> 2e803cd56d51
Step 4/4 : CMD /bin/bash
 ---> Running in 4cfe823935ab
Removing intermediate container 4cfe823935ab
 ---> 1195689ed478
Successfully built 1195689ed478
Successfully tagged dainiao/centos:1.0

🍪3.启动自己写的容器


这个卷和外部一定是有一个同步的目录!!,既然是匿名挂载,说明它是一个很长的乱码

[root@VM-16-15-centos ~]# docker inspect 78ce864e3f51
[
   //..............................................
        "Mounts": [
            {
                "Type": "volume",
                "Name": "26ae14e541828174ac5cdf92c52f3a5d49c54178e88652530f2211ddc1b6b82a",
                "Source": "/var/lib/docker/volumes/26ae14e541828174ac5cdf92c52f3a5d49c54178e88652530f2211ddc1b6b82a/_data",
                "Destination": "volume01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "cd929119db2de76e2502990643d82d147f512503ca8f0ae92d4aadee8146e54e",
                "Source": "/var/lib/docker/volumes/cd929119db2de76e2502990643d82d147f512503ca8f0ae92d4aadee8146e54e/_data",
                "Destination": "volume02",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
 //...........................................

可以看到Mounts下有宿主机的挂载目录。因为dockerfile中没有指定宿主机目录,所以属于匿名挂载,在/var/lib/docker/volumes/目录下生成了随机命名的路径。

🍪4.查看卷挂载路径

查看卷挂载路径,发现之前的volume01和volume02挂载成功

这种方式使用次数多,因为在构建自己镜像的时候,就直接挂载卷,如果构建镜像的时候,没有挂载卷,就要手动镜像挂载(具名或者匿名挂载) -v 卷名:容器内路径

🍪5.测试容器创建的container.txt文件是否同步到宿主机上
[root@VM-16-15-centos ~]# cd /var/lib/docker/volumes/26ae14e541828174ac5cdf92c52f3a5d49c54178e88652530f2211ddc1b6b82a/_data
[root@VM-16-15-centos _data]# ls
container.txt

🍭6.容器数据卷

容器数据卷是指建立数据卷,来同步多个容器间的数据,实现容器间的数据同步。

(1)首先启动容器1,volume01、volume02为挂载目录。
注意:这里在使用名字启动的话,后面要带着标签也就是dainiao/centos:1.0,或者你直接用id启动 docker run -it --name docker01 1195689ed478

 docker run -it --name docker01 dainiao/centos:1.0


(2)启动容器2,通过参数--volumes-from,设置容器2和容器1建立数据卷挂载关系

docker run -it --name docker02 --volumes-from docker01 dainiao/centos:1.0


(3)验证在docker01中加文件,看看docker02中是否增加文件


(4)目前docker02和docker01挂载成功,现在创建一个docker03,实现和docker01挂载
docker02和docker03都是继承于docker01的


(5)删除docker01,查看docker02和docker03依旧可以访问这个文件

这是一个拷贝的概念,docker02和docker03将共享的数据拷贝到自己上面,当docker01挂掉后,docker02和docker03仍然数据存在

🍦多个mysql实现数据共享
[root@VM-16-15-centos /]# docker run -d -p 6666:3306 -v /home/mysql/conf  -v /home/mysql/data  -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

[root@VM-16-15-centos /]# docker run -d -p 6666:3306   -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
#这个时候可以实现俩个数据同步!!

结论:容器之间的配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止,但是一旦持久化到了本地,这个时候,本地数据是不会删除的

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/1499094.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-25
下一篇 2022-06-25

发表评论

登录后才能评论

评论列表(0条)

保存