Docker学习 (二) 镜像与容器数据卷详解

7、图形化管理工具

本文内容承接Docker快速入门(一)的内容进行总结;

Portaniner是Docker的图形化管理工具,它提供一个后台面板供我们进行操作,类似于数据库可视化面板SQLyog之类的工具。

1. 下载与安装

# -p 8088:9000  			 # 内部9000端口映射外部端口为8088
# -v /var/run/docker.sock:/var/run/docker.sock 	(这是挂载技术,后面再学习)
# --privileged=true 		# 授权可以访问
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer


[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
Unable to find image 'portainer/portainer:latest' locally
latest: Pulling from portainer/portainer
94cfa856b2b1: Already exists 
49d59ee0881a: Already exists 
a2300fd28637: Already exists 
Digest: sha256:fb45b43738646048a0a0cc74fcee2865b69efde857e710126084ee5de9be0f3f
Status: Downloaded newer image for portainer/portainer:latest
3cad49e5d24c55ba9aebbcde2d593f948e7aba91751ae27148dac709314fab14
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND             CREATED         STATUS         PORTS                    NAMES
3cad49e5d24c   portainer/portainer   "/portainer"        8 seconds ago   Up 8 seconds   0.0.0.0:8088->9000/tcp   jovial_perlman
3e7fc95c278a   tomcat                "catalina.sh run"   9 hours ago     Up 9 hours     0.0.0.0:3355->8080/tcp   tomcat01
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# 

2. 通过外网访问,http://服务器ip地址:8088

阿里云服务器设置安全组,第一次登录时,需设置admin用户的密码
在这里插入图片描述

设置完密码创建用户之后,进入下方页面,选择本地连接即可。

在这里插入图片描述

这便是可视化的整体界面预览:

在这里插入图片描述

在这里插入图片描述

8、docker 镜像详解

8.1、镜像是什么

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码,运行时依赖、库,环境变量和配置文件。

8.2、docker镜像的加载原理

8.2.1、联合文件系统(UnionFS)

联合文件系统(UnionFS):

  • 2004年由纽约州立大学开发,它可以把多个目录内容联合挂载到同一个目录下,而目录的物理位置是分开的。UnionFS可以把只读和可读写文件系统合并在一起,具有写时复制功能,允许只读文件系统的修改可以保存到可写文件系统当中。

  • 它是一种分层、轻量级、高性能的文件系统,它支持对文件系统的修改作为一次提交来进行一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。

  • 它是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性: 一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

8.2.2、docker镜像加载

在这里插入图片描述

bootfs(boot file system)主要包含 bootloader 和 Kernel , bootloader 主要是引导加 kernel, Linux刚启动时会加载 bootfs 文件系统,在 Docker 镜像的最底层是 bootfs 。这一层与我们典型的 Linux/Unix系统是一样的,包含 boot 加载器和内核。当 boot 加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs 转交给内核,此时系统也会卸载 bootfs 。

rootfs(root file system),在 bootfs之上。包含的就是典型 Linux系统中 的 /dev,/proc,/bin,/etc 等标准目录和文件。 rootfs就是各种不同的操作系统发行版,比如 Ubuntu, Centos 等等。

在这里插入图片描述

平时我们安装进虚拟机的CentOS都是好几个G,为什么Docker这里才230M?

对于精简的 OS,rootfs 可以很小,只需要包合最基本的命令,工具和程序库就可以了,因为底层直接用宿主机的kernel,自己只需要提供 rootfs 就可以了。由此可见对于不同的Linux发行版, bootfs 基本是一致的,rootfs会有差別,因此不同的发行版可以公用 bootfs。

8.3、分层的理解

docker的镜像其实是有一层一层的文件系统组成的,前文中,在对镜像通过docker pull进行下载的时候,可以看到docker的镜像好像是在一层一层的在下载。当下载一个镜像的不同版本到本地时,不同版本的镜像之间有公共的文件部分,如果此部分已经存在于你的本地,则不会进行重复下载,直接进行共用。

分层的原因:

  1. 分层最大的优点就是==共享资源==
  2. 有多个镜像都从相同的base镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像;
  3. 同时内存中也只需加载一份base镜像,就可以为所有容器服务了,而且镜像的每一层都可以被共享。

去虚拟机中下载一个mysql 5.7版本的镜像,观察下载的日志输出,如下图所示,下载的过程是一层层进行下载,当前面的这些层已经存在于本地的情况是,就无需再次下载了。

在这里插入图片描述

在这里插入图片描述

查看镜像分层: docker image inspect 镜像名字

在这里插入图片描述

在这里插入图片描述

分层的理解:

所有的Docker镜像都起始于一个基础的镜像层,当对内容进行修改或增加新内容时,就会在当前镜像层之上,创建新的镜像层。譬如基于Ubuntu Linux 16.04创建一个新的镜像,这就是新镜像的第一层,之后再这个镜像中添加python的相关内容时,就会在第一层之上新建第二层镜像。继续添加安全补丁(Security Patch)时,就会创建第三层镜像。

在这里插入图片描述

又譬如,第一层镜像中包含文件1,2,3,后来创建了第二层镜像,里面包含文件4,5,6,再后来需要对镜像内容进行修改,将文件5升级更新成文件7,新的更新和修改需要创建第三层镜像。这种情况下,上层镜像中的文件覆盖了下层镜像中的文件。就使得文件的更新版本需要作为一个新的镜像层,添加到镜像当中。所以在外部看来,真个镜像分为三层,总共包含6个文件,其中文件7是文件5的更新版本。

在这里插入图片描述

Dokcer 镜像都是只读的,当容器启动时,一个新的可写层会被加载到镜像的顶部,这一个新的层就是通常说的容器层,容器之下的为镜像层。

8.4、Commit提交镜像

构建镜像有两种方式:

  • 一种是通过commit提交创建镜像
  • 另一种是通过dockerfile构建镜像 (dockerfile构建方法稍后学习)

容器通过commit提交之后,可将容器提交成为一个新的镜像版本

# docker commit -m=“提交的描述信息” -a=“作者信息” 容器id 目标镜像名:[TAG]

上面关于tomcat的部署方面提到,默认下载的tomcat镜像是最小的镜像,保证最小的运行环境。镜像中的webapps目录为空,需要进入容器内部,将webapps.dist目录中的内容先拷贝到webapps之后,才能从外网通过端口映射进行访问。为此,下面制作新的tomcat镜像:将能够完全运行的tomcat容器提交作为一个新的镜像。使得该镜像下载下来之后就可以直接使用,无需再去进行拷贝。

制作tomcat镜像步骤:

# 1. 下载默认的tomcat镜像
docker pull tomcat
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker pull tomcat  # 下载tomcat镜像
Using default tag: latest
latest: Pulling from library/tomcat
0e29546d541c: Already exists 
9b829c73b52b: Already exists 
cb5b7ae36172: Already exists 
6494e4811622: Already exists 
668f6fcc5fa5: Already exists 
dc120c3e0290: Already exists 
8f7c0eebb7b1: Already exists 
77b694f83996: Already exists 
0f611256ec3a: Already exists 
4f25def12f23: Already exists 
Digest: sha256:9dee185c3b161cdfede1f5e35e8b56ebc9de88ed3a79526939701f3537a52324
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker images		#查看是否下载成功
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
elasticsearch         8.2.0     f75ee9faf718   3 weeks ago     1.21GB
nginx                 latest    605c77e624dd   4 months ago    141MB
tomcat                latest    fb5657adc892   4 months ago    680MB
redis                 latest    7614ae9453d1   4 months ago    113MB
mysql                 latest    3218b38490ce   4 months ago    516MB
hello-world           latest    feb5d9fea6a5   7 months ago    13.3kB
centos                latest    5d0da3dc9764   7 months ago    231MB
portainer/portainer   latest    580c0e4e98b0   13 months ago   79.1MB
# 2. 启动这个tomcat镜像,
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker run -it -p 8023:8080 tomcat
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/openjdk-11
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
# 3. 查看正在运行的容器
docker ps
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND             CREATED         STATUS         PORTS                    NAMES
e315dfa9c866   tomcat                "catalina.sh run"   2 minutes ago   Up 2 minutes   0.0.0.0:8023->8080/tcp   strange_brown
3cad49e5d24c   portainer/portainer   "/portainer"        14 hours ago    Up 14 hours    0.0.0.0:8088->9000/tcp   jovial_perlman
# 4。 进入tomcat容器内部,查看webapps目录,没有内容,将webapps.dist目录中的内容拷贝到webapps目录中
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker exec -it e315dfa9c866 /bin/bash
root@e315dfa9c866:/usr/local/tomcat# ls
BUILDING.txt  CONTRIBUTING.md  LICENSE	NOTICE	README.md  RELEASE-NOTES  RUNNING.txt  bin  conf  lib  logs  native-jni-lib  temp  webapps  webapps.dist  work
root@e315dfa9c866:/usr/local/tomcat# cd webapps
root@e315dfa9c866:/usr/local/tomcat/webapps# ls
root@e315dfa9c866:/usr/local/tomcat/webapps# cd ..
root@e315dfa9c866:/usr/local/tomcat# cd webapps.dist
root@e315dfa9c866:/usr/local/tomcat/webapps.dist# ls
ROOT  docs  examples  host-manager  manager
root@e315dfa9c866:/usr/local/tomcat/webapps.dist# cd ..
root@e315dfa9c866:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@e315dfa9c866:/usr/local/tomcat# cd webapps
root@e315dfa9c866:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager
root@e315dfa9c866:/usr/local/tomcat/webapps# 

# 4. 将操作之后的容器通过commit提交成一个新的tomcat镜像,以后便可以直接下载这个新的镜像使用。
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker commit -m="new tomcat that added app to webapps" -a="Kevin-Ding" e315dfa9c866 mytomcat:1.0
sha256:fae635bb688d1260244034fe2ed158f28de3bd0fa5cc7269cb77edcc0d5b6931
# 5. docker images 便可查看到自己提交的镜像 mytomcat
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
mytomcat              1.0       fae635bb688d   28 seconds ago   684MB
elasticsearch         8.2.0     f75ee9faf718   3 weeks ago      1.21GB
nginx                 latest    605c77e624dd   4 months ago     141MB
tomcat                latest    fb5657adc892   4 months ago     680MB
redis                 latest    7614ae9453d1   4 months ago     113MB
mysql                 latest    3218b38490ce   4 months ago     516MB
hello-world           latest    feb5d9fea6a5   7 months ago     13.3kB
centos                latest    5d0da3dc9764   7 months ago     231MB
portainer/portainer   latest    580c0e4e98b0   13 months ago    79.1MB

# 6.运行自己制作的镜像
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker run -it mytomcat:1.0 /bin/bash
root@bc1b6aac1bea:/usr/local/tomcat# cd webapps	
root@bc1b6aac1bea:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager
root@bc1b6aac1bea:/usr/local/tomcat/webapps# cd ..
root@bc1b6aac1bea:/usr/local/tomcat# exit

9、容器数据卷

9.1、数据卷介绍

Docker可以将应用和运行环境打包成一个镜像。

如果数据库MySQL部署在docker,docker不小心被误删,岂不是删库跑路。那么docker中的数据如何保存?

  1. 通过docker commit生成新的镜像,保存部分数据,数据每次变动都进行commit成新的镜像,有些太过繁杂;
  2. 容器中的数据是否可以存储在本地,持久化存储呢?

这就是数据卷的技术,通过挂载,将容器中的目录挂载到Linux上面,从而实现数据同步到本地,便于持久化保存,毕竟数据无价。

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

数据卷:实现容器的持久化和同步操作,也可以实现容器之间的数据共享!

9.2、基本使用

方式一:使用命令的方式进行挂载 -v

# docker run -it -v 主机目录:容器内目录		# 路径映射
# docker run -it -p 主机端口:容器端口		 # 端口映射

# 1.查看home目录下的目录结构
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# cd home
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# ls
kevin  test.java
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# cd ..

# 2. 运行centos,并将centos的home目录挂载到虚拟机home目录的testcentos下 
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker run -it -v /home/testcentos:/home centos /bin/bash
[root@fc3e6a5f86ad /]# 

# 3. 新开窗口连接,查看虚拟机的home目录,发现testcentos目录
[root@iZ2ze1dg1xkfc3i15ybixmZ /]# cd home
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# ls
redis  test1.java  testcentos  test.java  www
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# 

内部查看挂载信息
[root@iZ2ze1dg1xkfc3i15ybixmZ testcentos]# docker inspect fc3e6a5f86ad
挂载信息:显示已经将/home 目录挂载到 /home/testcentos

在这里插入图片描述

在容器的home目录中新建一个test.java文件,在虚拟机testcentos的目录下便可同步查看到该文件

在这里插入图片描述

随后,在虚拟机对应的这个文件中进行修改,查看在容器中是否能够正常显示这一修改后的文件

# 1. 先停止容器并退出,
[root@fc3e6a5f86ad /]# exit
exit
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# clear
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND        CREATED        STATUS        PORTS                    NAMES
3cad49e5d24c   portainer/portainer   "/portainer"   25 hours ago   Up 11 hours   0.0.0.0:8088->9000/tcp   jovial_perlman
# 2.在主机中修改testcentos目录下的test.java
# vim操作,i进入插入模式; :wq保存并退出
[root@iZ2ze1dg1xkfc3i15ybixmZ testcentos]# vim test.java

# 3.重新启动刚才的centos,进入容器里面查看test.java发现内容已经被修改成功
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker start fc3e6a5f86ad
fc3e6a5f86ad
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker attach fc3e6a5f86ad
[root@fc3e6a5f86ad /]# cd home
[root@fc3e6a5f86ad home]# ls
test.java
[root@fc3e6a5f86ad home]# cat test.java
hello, Linux update			#成功显示修改信息

数据卷的挂载绑定是一个双向的过程。以后对于挂载绑定部分的内容,只需要在虚拟机上就可以进行修改,无需再进入容器!

9.3、练习-安装部署MySQL

MySQL数据的持久化,可以通过挂载的方式将MySQL中的data目录挂载到虚拟机中

  1. 下载mysql镜像
# docker pull 命令下载 mysql 5.7版本
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
72a69066d2fe: Pull complete 
93619dbc5b36: Pull complete 
99da31dd6142: Pull complete 
626033c43d70: Pull complete 
37d5d7efb64e: Pull complete 
ac563158d721: Pull complete 
d2ba16033dad: Pull complete 
0ceb82207cd7: Pull complete 
37f2405cae96: Pull complete 
e2482e017e53: Pull complete 
70deed891d42: Pull complete 
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
# 查看本地镜像中是否下载了mysql 5.7
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
mytomcat              1.0       fae635bb688d   2 days ago      684MB
elasticsearch         8.2.0     f75ee9faf718   3 weeks ago     1.21GB
nginx                 latest    605c77e624dd   4 months ago    141MB
tomcat                latest    fb5657adc892   4 months ago    680MB
redis                 latest    7614ae9453d1   4 months ago    113MB
mysql                 5.7       c20987f18b13   4 months ago    448MB
hello-world           latest    feb5d9fea6a5   7 months ago    13.3kB
centos                latest    5d0da3dc9764   8 months ago    231MB
portainer/portainer   latest    580c0e4e98b0   14 months ago   79.1MB
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]#
  1. 运行镜像,完成路径挂载
# 运行镜像
-d 后台运行
--name 指定名字
-v 主机目录:容器内目录	# 需要挂载多个路径时,每个挂载用一个-v即可
-p 主机端口:容器内端口	
-e MYSQL_ROOT_PASSWORD=123454321 初始化mysql的登录密码
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker run -d --name mysql_5_7 -v /home/mysql/config:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123454321 mysql:5.7
  1. 启动成功后 本地连接MySQL数据库 增加数据库表,便可在虚拟机的目录中查看到对应的挂载目录

温馨提示:命令行连接默认端口为3306,当端口映射修改之后,命令行中需要添加 -P 端口的命令

[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# mysql -h 39.107.241.179 -P 3307 -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.36 MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

# 成功通过命令行进入到数据库

当我们将虚拟机中的mysql容器删除之后,原先挂载在虚拟机中的目录,依旧保留,保证了数据没有丢失

9.4、匿名挂载和具名挂载

9.4.1、匿名挂载

匿名挂载,从字面意思看,就是在挂载数据卷的时候,没有指定挂载在宿主机上的路径,这样挂载就会在宿主机的默认路径:/var/lib/docker/volumes/中随机命名一个文件夹作为挂载路径。

测试:运行nginx容器,匿名挂载 容器内的路径为: /etc/nginx

# -P(大写P) 随机映射端口
docker run -d -P --name nginx01 -v /etc/nginx nginx
# docker run 后台运行nginx,随机映射端口,匿名挂在
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker run -d -P -v /etc/nginx nginx
f7d28a8dc9ea221c0a8d192d8079b28166151d11890ac432b75b0389b4005f5f
# 运行成功之后,进入home目录
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# cd home
# 通过docker volume ls 查看所有的volumes
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# docker volume ls
DRIVER    VOLUME NAME
local     e0d7fd0fa4fea35d21a8ee229d058812ff1607e6e81c1bb7f390b2f05fa4f88e
local     e46617b607b5c2cd660cbe1b222e7b7b083787af73e8bcac18a4115c9c698971
local     f4b46eeb747bf12180df6eb2a523b0acdcb48725c9137aab594fd0d9719a40df
# 看到volums的名字为随机生成的,此为匿名挂载
9.4.2、具名挂载

具名挂载,顾名思义,就是在挂载的时候,指定卷名。与指定路径挂载不同,具名挂载中指定的卷名所在的路径默认为数据卷下的路径。

测试:重新启动一个nginx容器,具名挂载,重命名为nginx02

# 随机指定端口,重命名为nginx02, 具名挂载,卷名设置为juming-nginx
docker run -d -P -name nginx02 -v juming-nginx:/etc/nginx nginx
# 重新启动一个具名挂载的nginx
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
206217bd55b69753a7788d1a9872bab2500e146e2c962394da3ddd0b600d9fd3
# 查看卷列表,可以看到有名为 juming-nginx的卷信息
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# docker volume ls
DRIVER    VOLUME NAME
local     e0d7fd0fa4fea35d21a8ee229d058812ff1607e6e81c1bb7f390b2f05fa4f88e
local     e46617b607b5c2cd660cbe1b222e7b7b083787af73e8bcac18a4115c9c698971
local     f4b46eeb747bf12180df6eb2a523b0acdcb48725c9137aab594fd0d9719a40df
local     juming-nginx
# 通过docker volume inspect 卷名   查看指定卷的相关信息
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# docker volume inspect juming-nginx
[
    {
    
    
        "CreatedAt": "2022-05-15T23:49:34+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]
# 查询出来的信息为:MountPoint为卷的默认挂载路径

可以看到指定的juming-nginxde卷在主机数据卷中的挂载路径为:/var/lib/docker/volumes/卷名/_data中;

Docker所有的数据卷默认在/var/lib/docker/volumes/ 目录下

9.4.3、区别

如何对匿名挂载和具名挂载进行区分呢?

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

综上所述,通过具名挂载可以方便的找到我们所挂载的数据卷,建议使用具名挂载。

补充一点:关于在进行挂载时的ro和rw的说明

  • ro readonly 只读,当设置成只读权限时,表示不能操作容器中对应的路径了,只能通过宿主机的路径进行操作。
  • rw readwrite可读可写,卷挂载的默认权限。

表示方式:

# ro(只读)的表示
docker run -d -P -name nginx02 -v juming-nginx:/etc/nginx:ro nginx
#rw(可读可写)的表示
docker run -d -P -name nginx02 -v juming-nginx:/etc/nginx:rw nginx

9.5、DockerFile方式创建镜像

dockerfile就是用来构建docker镜像的构建文件,是一个脚本命令。

创建镜像的第二种方式:通过dockerfile来创建镜像

  1. 首先在home目录下新建一个docker-test-volume文件夹,里面新建一个dockerfile1文件,并编写如下脚本:
FROM centos

VOLUME ["volume01", "volume02"]

CMD echo "----end----"

CMD /bin/bash 
  1. 创建完毕之后,docker build方法执行构建镜像

    # docker build -f dockerfile的全路径 -t 镜像名:tag .
    [root@kevinDing docker_test_volume]# docker build -f /home/docker_test_volume/dockerfile1 -t kevin/mycentos:1.0 .
    Sending build context to Docker daemon  2.048kB
    Step 1/4 : FROM centos
     ---> 5d0da3dc9764
    Step 2/4 : VOLUME ["volume01", "volume02"]
     ---> Running in b860235245ea
    Removing intermediate container b860235245ea
     ---> 0bc3ac498d5f
    Step 3/4 : CMD echo "----end----"
     ---> Running in 324159180d29
    Removing intermediate container 324159180d29
     ---> 0a3ee43af21b
    Step 4/4 : CMD /bin/bash
     ---> Running in b3263513fb82
    Removing intermediate container b3263513fb82
     ---> f520432b291f
    Successfully built f520432b291f
    Successfully tagged kevin/mycentos:1.0
    [root@kevinDing docker_test_volume]# docker images
    REPOSITORY       TAG       IMAGE ID       CREATED         SIZE
    kevin/mycentos   1.0       f520432b291f   6 seconds ago   231MB
    hello-world      latest    feb5d9fea6a5   7 months ago    13.3kB
    centos           latest    5d0da3dc9764   8 months ago    231MB
    [root@kevinDing docker_test_volume]# 
    
    

在这里插入图片描述

  1. 运行自己构建的镜像,并查看镜像内的目录信息

    [root@kevinDing docker_test_volume]# docker run -it f520432b291f /bin/bash
    # 查看列表信息,可以看到最后两个文件为挂载的目录volume01和volume02
    [root@8ebf26cff30f /]# ls -l
    total 56
    lrwxrwxrwx  1 root root    7 Nov  3  2020 bin -> usr/bin
    drwxr-xr-x  5 root root  360 May 20 15:17 dev
    drwxr-xr-x  1 root root 4096 May 20 15:17 etc
    drwxr-xr-x  2 root root 4096 Nov  3  2020 home
    lrwxrwxrwx  1 root root    7 Nov  3  2020 lib -> usr/lib
    lrwxrwxrwx  1 root root    9 Nov  3  2020 lib64 -> usr/lib64
    drwx------  2 root root 4096 Sep 15  2021 lost+found
    drwxr-xr-x  2 root root 4096 Nov  3  2020 media
    drwxr-xr-x  2 root root 4096 Nov  3  2020 mnt
    drwxr-xr-x  2 root root 4096 Nov  3  2020 opt
    dr-xr-xr-x 94 root root    0 May 20 15:17 proc
    dr-xr-x---  2 root root 4096 Sep 15  2021 root
    drwxr-xr-x 11 root root 4096 Sep 15  2021 run
    lrwxrwxrwx  1 root root    8 Nov  3  2020 sbin -> usr/sbin
    drwxr-xr-x  2 root root 4096 Nov  3  2020 srv
    dr-xr-xr-x 13 root root    0 May 17 01:11 sys
    drwxrwxrwt  7 root root 4096 Sep 15  2021 tmp
    drwxr-xr-x 12 root root 4096 Sep 15  2021 usr
    drwxr-xr-x 20 root root 4096 Sep 15  2021 var
    drwxr-xr-x  2 root root 4096 May 20 15:17 volume01
    drwxr-xr-x  2 root root 4096 May 20 15:17 volume02
    [root@8ebf26cff30f /]# 
    
  2. 另开连接,通过docker inspect查看镜像内部信息

    # 新开连接,查看运行的镜像
    [root@kevinDing /]# docker ps
    CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS         PORTS     NAMES
    8ebf26cff30f   f520432b291f   "/bin/bash"   2 minutes ago   Up 2 minutes             suspicious_stonebraker
    # 进入到镜像内部查看
    [root@kevinDing /]# docker inspect f520432b291f
    
    [
        {
          
          
            "Id": "8ebf26cff30fd0eb9c75e144eb7c8b18bd07def9faa1d413fa12ad7f5c8efc90",
            "Created": "2022-05-20T15:17:29.740198902Z",
            "Path": "/bin/bash",
            "Args": [],
           ......   中间内容省略
            "Mounts": [
                {
          
          
                    "Type": "volume",
                    "Name": "de516c45849d34553a8e9ee1c76ca4c3949aeebdfd9cb07d7a08e4d8f78a3273",
                    "Source": "/var/lib/docker/volumes/de516c45849d34553a8e9ee1c76ca4c3949aeebdfd9cb07d7a08e4d8f78a3273/_data",
                    "Destination": "volume01",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                },
                {
          
          
                    "Type": "volume",
                    "Name": "7f18328f873a7760294840e4fef2e9688d2303c071a695736fc0b41a802abb73",
                    "Source": "/var/lib/docker/volumes/7f18328f873a7760294840e4fef2e9688d2303c071a695736fc0b41a802abb73/_data",
                    "Destination": "volume02",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                }
            ]
        }
    ]
    
    
    
    

在这里插入图片描述

  1. 验证挂载是否成功

    在镜像内部进入挂载目录volume01目录,创建一个container_test.txt文件,在volume01的挂载路径中查看是否生成了该文件。

    [root@8ebf26cff30f /]# cd volume01
    [root@8ebf26cff30f volume01]# touch container_test.txt
    [root@8ebf26cff30f volume01]# ls
    container_test.txt
    [root@8ebf26cff30f volume01]# 
    # 在新开的连接中,进入到volume01的挂载路径中,可以查看到创建的文件
    [root@kevinDing volumes]# cd /var/lib/docker/volumes/de516c45849d34553a8e9ee1c76ca4c3949aeebdfd9cb07d7a08e4d8f78a3273/_data
    [root@kevinDing _data]# ls
    container_test.txt
    [root@kevinDing _data]# 
    

在这里插入图片描述

9.6、容器数据卷

容器数据卷是指建立数据卷,实现容器与容器之间的数据同步。

在这里插入图片描述

将上面制作的centos镜像启动,启动centos01centos02, centos01为父容器:

[root@kevinDing ~]# docker images
REPOSITORY       TAG       IMAGE ID       CREATED          SIZE
kevin/mycentos   1.0       f520432b291f   52 minutes ago   231MB
hello-world      latest    feb5d9fea6a5   7 months ago     13.3kB
centos           latest    5d0da3dc9764   8 months ago     231MB
# 启动一个centos01容器
[root@kevinDing ~]# docker run -it --name centos01 kevin/mycentos:1.0
# ctrl+P+Q退出当前容器
# 再启动一个centos02容器, --volumes-from centos01
[root@kevinDing ~]# docker run -it --name centos02 --volumes-from centos01 kevin/mycentos:1.0

在开启一个连接,分别进入两个容器查看内容:

[root@kevinDing ~]# docker ps
CONTAINER ID   IMAGE                COMMAND                  CS         PORTS     NAMES
5b0deb75f776   kevin/mycentos:1.0   "/bin/sh -c /bin/bash"   4minutes             centos02
b8dcce0bcf25   kevin/mycentos:1.0   "/bin/sh -c /bin/bash"   5minutes             centos01
[root@kevinDing ~]# docker attach b8dcce0bcf25
[root@b8dcce0bcf25 /]# ls -l
total 56
lrwxrwxrwx  1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x  5 root root  360 May 20 16:04 dev
drwxr-xr-x  1 root root 4096 May 20 16:04 etc
drwxr-xr-x  2 root root 4096 Nov  3  2020 home
lrwxrwxrwx  1 root root    7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx  1 root root    9 Nov  3  2020 lib64 -> usr/lib64
drwx------  2 root root 4096 Sep 15  2021 lost+found
drwxr-xr-x  2 root root 4096 Nov  3  2020 media
drwxr-xr-x  2 root root 4096 Nov  3  2020 mnt
drwxr-xr-x  2 root root 4096 Nov  3  2020 opt
dr-xr-xr-x 97 root root    0 May 20 16:04 proc
dr-xr-x---  2 root root 4096 Sep 15  2021 root
drwxr-xr-x 11 root root 4096 Sep 15  2021 run
lrwxrwxrwx  1 root root    8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x  2 root root 4096 Nov  3  2020 srv
dr-xr-xr-x 13 root root    0 May 17 01:11 sys
drwxrwxrwt  7 root root 4096 Sep 15  2021 tmp
drwxr-xr-x 12 root root 4096 Sep 15  2021 usr
drwxr-xr-x 20 root root 4096 Sep 15  2021 var
drwxr-xr-x  2 root root 4096 May 20 16:04 volume01
drwxr-xr-x  2 root root 4096 May 20 16:04 volume02
[root@b8dcce0bcf25 /]# cd volume01
[root@b8dcce0bcf25 volume01]# ls
[root@b8dcce0bcf25 volume01]# touch test01.txt
[root@b8dcce0bcf25 volume01]# ls
test01.txt
[root@b8dcce0bcf25 volume01]# 

在这里插入图片描述
在这里插入图片描述

如果将容器centos01停止并删除之后,容器centos02中的数据不受影响,相当于是在进行volumes-from时,对挂载的目录进行了双向拷贝,实现容器间的数据共享。

同样的,对于多个MySQL的数据库和配置文件实现数据共享时,与上面centos01和centos02的操作相类似,首先启动mySQL01,建立数据卷。然后通过–volumes-from给另一个MySQL容器建立容器数据卷的挂载 :

# 挂载第一个MySQL容器 匿名挂载
[root@KevinDing ~]# docker run -d --name mysql01 -p 3307:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123454321 mysql:5.7

# 挂载第二个MySQL,因为是挂载到mysql01,无需再进行-v的匿名挂载了
[root@KevinDing ~]# docker run -d --name mysql02 --volumes-from mysql01 -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123454321 mysql:5.7

从而可以实现两个MySQL容器的数据同步。

容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
一旦将父容器的内容持久化本地,本地数据不删除便不会丢失了。

猜你喜欢

转载自blog.csdn.net/weixin_43155804/article/details/124892975