四、Docker镜像讲解

四、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目录同步
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值