四、Docker镜像讲解
一、镜像是什么
镜像本质上是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基本运行环境开发的软件,它包含运算某个软件所需要的内容和环境,包括代码、运行时库、环境变量和配置文件等。
所有的应用,直接打包docker镜像就可以直接跑起来
如何得到镜像:
- 从远程仓库下载
- 朋友拷贝给你
- 自己制作镜像 —>DockerFile
二、Docker镜像加载原理
UnionFS(联合文件系统)
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持文件系统的修改作为一次提交一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,Union文件系统是Docker镜像的基础。镜像可以通过分层来继承,基于基础镜像(没有父镜像),可以制作各种具体应用。
特性:一次同时加载多个问价那系统,但从外表看起来,只能看到一个文件系统,联合加载会吧各层文件系统叠加起来,这样最终的文件系统包括所有底层的文件和目录
我们pull镜像时看到的一层一层的就是这个!!!
Docker镜像加载原理
三、分层的理解
查看一个ES的Images的分层
docker inspect [容器ID/容器名称] 我这里查看的是我的ES 镜像
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:77b174a6a187b610e4699546bd973a8d1e77663796e3724318a2a4b24cb07ea0",
"sha256:7712f32688d1bef330aa3b4fac2683cec1d7339335ce403483b329423debffb6",
"sha256:1a090720e70c88e61053c89d3ff01932943b198644f4a7e86426e576b721d2e3",
"sha256:0535424758bd9ab49a3d03af52a9fa5447b807198fadc35e9f80123a0929402e",
"sha256:4d2f8f4a58623431cca0ee321bbee273b87070f9e381b3147e4293e83dc146d7",
"sha256:77c5267605c2c7cf2426242d5df50af78931e66403e9d0d06f2b9fd7adc3adc9",
"sha256:537370aeea86be07f79bbcd25464a1df23f347bb5313e0ff7ca15d6aad70e074"
]
}
# 我们可以清楚的看到 ES 的镜像其实是分很多层的
理解
所有的Docker 镜像都是起始于一个基础的镜像,当进行修改或者增加新的内容的时候,就会创建新的镜像成。 举一个简单的例子,加入CentOS 创建了一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加Python 包,就会在基础镜像上创建第二个镜像层;如果继续添加一个安全补丁,就会去常见第三层镜像
特点
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!!
这一层就是我们常说的容器层,容器之下的都叫镜像层!
举例: 当我们pull下来一个tomcat镜像时,我们通过镜像启动了tomcat 容器 那么我们其实操作的并不是tomcat这个镜像本身 在我们将tomcat镜像启动为一个容器的时候,会在镜像层的上方新增一个容器层, 其实在文件分层的概念上来说 tomcat镜像本身是镜像层,是只读的 我们的操作都在镜像层上的容器层进行
四、commit镜像
docker commit #提交一个容器称为新的木本
docker commit -m="提交的描述信息" -a="作者" 容器ID 目标镜像名:[TAG]
#举例 启动一个tomcat
[root@iZhp3do4qhzu84445osa3sZ ~]# docker run -it -p:17501:8080 2eb5a120304e
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
NOTE: Picked up JDK_JAVA_OPTIONS: --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
## 省略tomcat的启动日志
## 查看刚才启动的tomcat 第一个
[root@iZhp3do4qhzu84445osa3sZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
95cfb21f2c7c 2eb5a120304e "catalina.sh run" 41 seconds ago Up 38 seconds 8080/tcp condescending_wilson
d27977b9712c portainer/portainer "/portainer" 8 hours ago Up 8 hours 0.0.0.0:8088->9000/tcp condescending_cori
272b65fe3867 elasticsearch:7.6.2 "/usr/local/bin/do..." 9 hours ago Up 9 hours 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp es01
afbd9cc1bd41 docker.io/tomcat "catalina.sh run" 9 hours ago Up 9 hours 0.0.0.0:17500->8080/tcp tomcat01
48abd2f7180a docker.io/nginx "/docker-entrypoin..." 10 hours ago Up 10 hours 0.0.0.0:17200->80/tcp nginx01
# 新建一个窗口,已交互的方式进入tomcat容器
## docker exec -it 95cfb21f2c7c /bin/bash
[root@iZhp3do4qhzu84445osa3sZ ~]# docker exec -it 95cfb21f2c7c /bin/bash
root@95cfb21f2c7c:/usr/local/tomcat#
## 和上次遇到的问题一样 我们需要将webapps.dist中的文件拷贝到webapps中
root@95cfb21f2c7c:/usr/local/tomcat# ls
BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.dist
CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps work
root@95cfb21f2c7c:/usr/local/tomcat# cp webapps.dist/** -r webapps
root@95cfb21f2c7c:/usr/local/tomcat# cd webapps
root@95cfb21f2c7c:/usr/local/tomcat/webapps# ls
ROOT docs examples host-manager manager
root@95cfb21f2c7c:/usr/local/tomcat/webapps#
# exit
# curl localhost:17501 测试
# 提交镜像 #原本的tomcat是阉割版本的 我们要复制文件到webapps 那么我们复制完文件之后 制作一个自己的镜像就可以了 后面我们就可以使用自己镜像了
# 1. docker ps
[root@iZhp3do4qhzu84445osa3sZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d27977b9712c portainer/portainer "/portainer" 9 hours ago Up 9 hours 0.0.0.0:8088->9000/tcp condescending_cori
272b65fe3867 elasticsearch:7.6.2 "/usr/local/bin/do..." 9 hours ago Up 9 hours 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp es01
afbd9cc1bd41 docker.io/tomcat "catalina.sh run" 10 hours ago Up 10 hours 0.0.0.0:17500->8080/tcp tomcat01
48abd2f7180a docker.io/nginx "/docker-entrypoin..." 11 hours ago Up 10 hours 0.0.0.0:17200->80/tcp nginx01
# 2. 提交镜像
[root@iZhp3do4qhzu84445osa3sZ ~]# docker commit -m="黑知白首的Tomcat镜像" -a="hzbs" afbd9cc1bd41 hzbstomcat:0.0.1
sha256:b3feb81b41264f3760ce9b4fdbe4bdb036326beabceec5891eb3b3ec19dff563
# 3. 查看提交的镜像
[root@iZhp3do4qhzu84445osa3sZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hzbstomcat 0.0.1 b3feb81b4126 14 seconds ago 652 MB
学习方式说明: 理解概念,但一定给要实践,最后实践和理论相结合一次搞定这个知识
如果想保存当前镜像中自己新增的内容,就可以通过commit的方式提交 后面自己使用
到了这里才算是入门了Docker!!!!
后面的内容才是精髓
五、容器数据卷
docker的理念回顾
将应用和环境打包成一个镜像
2.5.1 什么是容器数据卷
我们的项目都会保存一些数据img,所以我们的数据是不会存到容器内的 ,因为一旦容器被删除那么数据也就删除了
需求:数据可以做持久化!!
例如MYSQL ,容器删了 那就相当于是删库跑路了 所以我们的需求就是将mysql的数据保存到本地
容器之间可以有一个数据共享的技术!Docker 容器中产生的数据,同步到本地!
总结:容器中数据的持久化和同步操作!容器之间也是可以数据共享的
2.5.2 使用数据卷
方式一:直接使用命令来进行挂载 -v
docker run -v # 在启动容器时进行数据挂载
# 完整的启动命令
docker run -v [宿主机目录]:[容器目录] -p [宿主机端口]:[容器端口] -d --name yourname [镜像名称/镜像ID]
# 启动一个centos镜像 并且进入
[root@iZhp3do4qhzu84445osa3sZ home]# docker run -it -v /home/ceshi:/home 831691599b88 /bin/bash
# 此时 容器内的/home 目录已经和 宿主机的/home/ceshi目录同步