Docker 镜像

Docker镜像是什么?

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

1.UnionFS(联合文件系统):
Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同事加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
2. Docker镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,==在docker镜像得最底层是bootfs。==这一层与我们典型得Linux系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs(root file system),在bootfs之上。包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Centos、Ubuntu等。
平时的centos几个G,为什么docker里只有200M?
对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host和kernel,自己只需要提供rootfs就行了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。

3. 分层的镜像
以我们的pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载。
4. 为什么Docker镜像要采用这种分层结构呢?
最大的好处就是:共享资源
比如:有多个镜像都从相同的base镜像构建而来,那么宿主机只需要在磁盘上保存一分base镜像,同时内存中也只需加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

特点

docker镜像都是只读的,当容器启动时,一个新的可写曾被加载到镜像的顶部。这一层通常被称作"容器层",“容器层"之下的都叫"镜像层”。

Docker镜像commit操作补充

docker commit 提交容器副本使之成为一个新的镜像
docker commit -m=“提交的描述信息”-a="作者"容器ID要创建的目标镜像名:[标签名]
案例演示:

  1. 从Hub上下载tomcat镜像到本地并成功运行:
    docker run -it -p 8080:8080 tomcat
    -p主机端口:docker容器端口
    -P随机分配端口
    -i:交互
    -t:终端
[root@hadoop101 ~]# docker run -it -p 8888: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-8
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
26-Sep-2019 02:37:25.317 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name:   Apache Tomcat/8.5.46
26-Sep-2019 02:37:25.453 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Sep 16 2019 18:16:19 UTC
26-Sep-2019 02:37:25.453 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 8.5.46.0
26-Sep-2019 02:37:25.453 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux
26-Sep-2019 02:37:25.453 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            3.10.0-514.el7.x86_64
26-Sep-2019 02:37:25.453 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64
26-Sep-2019 02:37:25.453 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             /usr/local/openjdk-8/jre
26-Sep-2019 02:37:25.453 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version:           1.8.0_222-b10
26-Sep-2019 02:37:25.454 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor:            Oracle Corporation
26-Sep-2019 02:37:25.454 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:         /usr/local/tomcat
26-Sep-2019 02:37:25.454 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:         /usr/local/tomcat
26-Sep-2019 02:37:25.454 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties
26-Sep-2019 02:37:25.454 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
26-Sep-2019 02:37:25.454 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048
26-Sep-2019 02:37:25.454 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
26-Sep-2019 02:37:25.454 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dorg.apache.catalina.security.SecurityListener.UMASK=0027
26-Sep-2019 02:37:25.455 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dignore.endorsed.dirs=
26-Sep-2019 02:37:25.455 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=/usr/local/tomcat
26-Sep-2019 02:37:25.455 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=/usr/local/tomcat
26-Sep-2019 02:37:25.455 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/usr/local/tomcat/temp
26-Sep-2019 02:37:25.455 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded APR based Apache Tomcat Native library [1.2.23] using APR version [1.5.2].
26-Sep-2019 02:37:25.455 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
26-Sep-2019 02:37:25.455 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR/OpenSSL configuration: useAprConnector [false], useOpenSSL [true]
26-Sep-2019 02:37:25.468 INFO [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL successfully initialized [OpenSSL 1.1.0k  28 May 2019]
26-Sep-2019 02:37:25.761 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
26-Sep-2019 02:37:25.794 INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read
26-Sep-2019 02:37:25.834 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["ajp-nio-8009"]
26-Sep-2019 02:37:25.838 INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read
26-Sep-2019 02:37:25.845 INFO [main] org.apache.catalina.startup.Catalina.load Initialization processed in 2121 ms
26-Sep-2019 02:37:25.933 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]
26-Sep-2019 02:37:25.933 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/8.5.46
26-Sep-2019 02:37:25.957 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/tomcat/webapps/ROOT]
26-Sep-2019 02:37:26.696 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/ROOT] has finished in [738] ms
26-Sep-2019 02:37:26.696 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/tomcat/webapps/docs]
26-Sep-2019 02:37:26.741 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/docs] has finished in [44] ms
26-Sep-2019 02:37:26.741 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/tomcat/webapps/examples]
26-Sep-2019 02:37:27.710 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/examples] has finished in [968] ms
26-Sep-2019 02:37:27.710 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/tomcat/webapps/host-manager]
26-Sep-2019 02:37:27.770 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/host-manager] has finished in [60] ms
26-Sep-2019 02:37:27.771 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/tomcat/webapps/manager]
26-Sep-2019 02:37:27.813 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/manager] has finished in [42] ms
26-Sep-2019 02:37:27.833 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
26-Sep-2019 02:37:27.881 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"]
26-Sep-2019 02:37:27.897 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 2051 ms

此时在虚拟机上访问localhost:8888端口

在这里插入图片描述

[root@hadoop101 ~]# docker run -it -P tomcat
[root@hadoop101 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
c27f13bfe3ab        tomcat              "catalina.sh run"   26 seconds ago      Up 25 seconds       0.0.0.0:32768->8080/tcp   dreamy_keldysh

如果使用大-P 的户就是自动分配端口32768,同样是可以访问到tomcat的
在这里插入图片描述

  1. 故意删除上一步镜像产生tomcat容器的文档
[root@hadoop101 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
ef7410c430cd        tomcat              "catalina.sh run"   21 seconds ago      Up 20 seconds       0.0.0.0:8888->8080/tcp   musing_leakey
[root@hadoop101 ~]# docker exec -it ef7410c430cd /bin/bash
root@ef7410c430cd:/usr/local/tomcat# ls
BUILDING.txt  CONTRIBUTING.md  LICENSE NOTICE README.md  RELEASE-NOTES  RUNNING.txt  bin  conf  include  lib logs  native-jni-lib  temp  webapps  work
root@ef7410c430cd:/usr/local/tomcat# ls -l
total 124
-rw-r--r--. 1 root root  19318 Sep 16 18:19 BUILDING.txt
-rw-r--r--. 1 root root   5407 Sep 16 18:19 CONTRIBUTING.md
-rw-r--r--. 1 root root  57011 Sep 16 18:19 LICENSE
-rw-r--r--. 1 root root   1726 Sep 16 18:19 NOTICE
-rw-r--r--. 1 root root   3255 Sep 16 18:19 README.md
-rw-r--r--. 1 root root   7139 Sep 16 18:19 RELEASE-NOTES
-rw-r--r--. 1 root root  16262 Sep 16 18:19 RUNNING.txt
drwxr-xr-x. 2 root root   4096 Sep 20 01:40 bin
drwxr-sr-x. 1 root root     22 Sep 26 03:35 conf
drwxr-sr-x. 2 root staff    78 Sep 20 01:40 include
drwxr-xr-x. 2 root root   4096 Sep 20 01:40 lib
drwxrwxrwx. 1 root root    177 Sep 26 03:35 logs
drwxr-sr-x. 3 root staff   151 Sep 20 01:40 native-jni-lib
drwxrwxrwx. 2 root root     30 Sep 20 01:40 temp
drwxr-xr-x. 7 root root     81 Sep 16 18:17 webapps
drwxrwxrwx. 1 root root     22 Sep 26 03:35 work
root@ef7410c430cd:/usr/local/tomcat# cd webapps/
root@ef7410c430cd:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager
root@ef7410c430cd:/usr/local/tomcat/webapps# rm -rf docs/
root@ef7410c430cd:/usr/local/tomcat/webapps# ls
ROOT  examples host-manager  manager

在这里插入图片描述

  1. 也即当前的tomcat运行实例是一个没有文档内容的容器,以它为模板commit一个没有doc的tomcat新镜像atdixin/tomcat02
[root@hadoop101 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
ef7410c430cd        tomcat              "catalina.sh run"   2 hours ago         Up 2 hours          0.0.0.0:8888->8080/tcp   musing_leakey
[root@hadoop101 ~]# docker commit -a="ghj" -m="del tomcat docs" ef7410c430cd atdixin/mytomcat:7.0
sha256:38d1e8f0474010d80b8d3cd8519b3a970d96d010c08c3675989b9039985f8a74
[root@hadoop101 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
atdixin/mytomcat    7.0                 38d1e8f04740        15 seconds ago      508MB
nginx               latest              f949e7d76d63        30 hours ago        126MB
tomcat              latest              8973f493aa0a        6 days ago          508MB
centos              latest              67fa590cfc1c        5 weeks ago         202MB
hello-world         latest              fce289e99eb9        8 months ago        1.84kB
training/webapp     latest              6fae60ef3446        4 years ago         349MB
[root@hadoop101 ~]# docker run -it -p 7777:8080 atdixin/mytomcat:7.0

在这里插入图片描述
在这里插入图片描述
很明显的发现我们用之前生成的新的镜像是不含有文档的。

  1. 启动我们的新镜像并和原来的对比
    启动atdixin/mytomcat:7.0,它没有/docs
    新启动原来的tomcat,它有/docs
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值