1.Docker镜像(images)概念

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

2.UnionFS(联合文件系统)

镜像是一种文件,也是文件系统(联合文件系统)

UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

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

3.Docker镜像加载原理

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

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这里才200M??

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

4.分层的镜像

以我们的pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载。

[root@localhost ~]# docker pull mongo
Using default tag: latest
Trying to pull repository docker.io/library/mongo ...
latest: Pulling from docker.io/library/mongo
f7277927d38a: Extracting [=>                                                 ] 1.376 MB/43.92 MB
8d3eac894db4: Download complete
edf72af6d627: Download complete
3e4f86211d23: Download complete
5747135f14d2: Download complete
f56f2c3793f6: Download complete
f8b941527f3a: Download complete
4000e5ef59f4: Download complete
ad518e2379cf: Download complete
919225fc3685: Download complete
45ff8d51e53a: Downloading [=====>                                             ] 12.43 MB/104.8 MB
4d3342ddfd7b: Download complete
26002f176fca: Download complete

5.为什么Docker镜像要采用这种分层结构呢

最大的一个好处就是 - 共享资源
比如:有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,
同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

6.Docker镜像特点

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

7.Docker镜像commit

镜像----->run----->容器
容器---->commit---->镜像

docker commit提交容器副本使之成为一个新的镜像

docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]

案例演示:

  • 从Hub上下载tomcat镜像到本地并成功运行

docker pull tomcat:7-jre7

[root@localhost ~]# docker pull tomcat:7-jre7
Trying to pull repository docker.io/library/tomcat ...
7-jre7: Pulling from docker.io/library/tomcat
db0035920883: Pull complete
a9ebd83b4a47: Pull complete
02ef9e65a664: Pull complete
b2786dccb0cc: Pull complete
1b809e89f352: Pull complete
bf313a79ccc8: Pull complete
e03e64e40a06: Pull complete
aec2911e85ab: Pull complete
b7b5b93b2e01: Pull complete
e1a8ee44b3b9: Pull complete
5f6f66788a60: Pull complete
Digest: sha256:d5bad6dde416e3214c88850ff1184de32d41afb10735b2594dd9e2d8f001fdcd
Status: Downloaded newer image for docker.io/tomcat:7-jre7
  • 查看下载好的镜像
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/tomcat    7-jre7              47c156f4d4e3        4 weeks ago         359 MB
docker.io/mysql     latest              7bb2586065cd        2 months ago        477 MB
docker.io/centos    7                   9f38484d220f        3 months ago        202 MB
  • 通过下载好的镜像启动容器
[root@localhost ~]# docker run -it -d -p 8888:8080  tomcat:7-jre7
2a0288c8cf76305ac9268073f4e7cc30d47fee4033d8944675fa864ddb0f2b02
  • 查看运行中的容器
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS                    NAMES
2a0288c8cf76        tomcat:7-jre7       "catalina.sh run"   About a minute ago   Up About a minute   0.0.0.0:8888->8080/tcp   optimistic_nobel
  • 访问测试

  • 故意删除上一步镜像生产tomcat容器的文档,对容器进行修改!
[root@localhost ~]# docker exec -it 2a0288c8cf76 /bin/bash
root@2a0288c8cf76:/usr/local/tomcat# ls -l
total 132
-rw-r--r--. 1 root root  18099 Apr 10 16:57 BUILDING.txt
-rw-r--r--. 1 root root   6090 Apr 10 16:57 CONTRIBUTING.md
-rw-r--r--. 1 root root  56846 Apr 10 16:57 LICENSE
-rw-r--r--. 1 root root   1241 Apr 10 16:57 NOTICE
-rw-r--r--. 1 root root   3255 Apr 10 16:57 README.md
-rw-r--r--. 1 root root   9365 Apr 10 16:57 RELEASE-NOTES
-rw-r--r--. 1 root root  16978 Apr 10 16:57 RUNNING.txt
drwxr-xr-x. 2 root root   4096 May 14 01:12 bin
drwxr-xr-x. 1 root root     22 Jun 17 14:10 conf
drwxr-sr-x. 2 root staff    78 May 14 01:11 include
drwxr-xr-x. 2 root root   4096 May 14 01:10 lib
drwxrwxrwx. 1 root root    177 Jun 17 14:10 logs
drwxr-sr-x. 3 root staff   151 May 14 01:11 native-jni-lib
drwxr-xr-x. 2 root root     30 May 14 01:10 temp
drwxr-xr-x. 7 root root     81 Apr 10 16:57 webapps
drwxrwxrwx. 1 root root     22 Jun 17 14:10 work
root@2a0288c8cf76:/usr/local/tomcat# cd webapps/
root@2a0288c8cf76:/usr/local/tomcat/webapps# ls -l
total 8
drwxr-xr-x.  3 root root 4096 May 14 01:10 ROOT
drwxr-xr-x. 14 root root 4096 May 14 01:10 docs
drwxr-xr-x.  7 root root  111 May 14 01:10 examples
drwxr-xr-x.  5 root root   87 May 14 01:10 host-manager
drwxr-xr-x.  5 root root  103 May 14 01:10 manager
root@2a0288c8cf76:/usr/local/tomcat/webapps# rm -rf docs/
root@2a0288c8cf76:/usr/local/tomcat/webapps#
  • 测试删除之后的效果

也即当前的tomcat运行实例是一个没有文档内容的容器,
以它为模板commit一个没有doc的tomcat新镜像bruceliu/tomcat02

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
2a0288c8cf76        tomcat:7-jre7       "catalina.sh run"   2 hours ago         Up 2 hours          0.0.0.0:8888->8080/tcp   optimistic_nobel
[root@localhost ~]# docker commit -a="bruce" -m="delete the tomcat docs" 2a0288c8cf76 bruceliu/tomcat:7-jre7
sha256:a66f9aba334d3a7252d0b9114aa14eff31f3a1641946b5b08cbcd86b5632d84e
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
bruceliu/tomcat     7-jre7              a66f9aba334d        9 seconds ago       359 MB
docker.io/tomcat    7-jre7              47c156f4d4e3        4 weeks ago         359 MB
docker.io/mysql     latest              7bb2586065cd        2 months ago        477 MB
docker.io/centos    7                   9f38484d220f        3 months ago        202 MB

启动我们的新镜像并和原来的对比,启动bruceliu/tomcat02,它没有docs

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
bruceliu/tomcat     7-jre7              a66f9aba334d        2 minutes ago       359 MB
docker.io/tomcat    7-jre7              47c156f4d4e3        4 weeks ago         359 MB
docker.io/mysql     latest              7bb2586065cd        2 months ago        477 MB
docker.io/centos    7                   9f38484d220f        3 months ago        202 MB
[root@localhost ~]# docker run -it -p 7777:8080 bruceliu/tomcat
Unable to find image 'bruceliu/tomcat:latest' locally
Trying to pull repository docker.io/bruceliu/tomcat ...
^C
[root@localhost ~]# ^C
[root@localhost ~]# docker run -it -p -d 7777:8080 bruceliu/tomcat:7-jre7
/usr/bin/docker-current: Invalid containerPort: -d.
See '/usr/bin/docker-current run --help'.
[root@localhost ~]# docker run -it -d -p 7777:8080 bruceliu/tomcat:7-jre7
9dfea93d6a81136e1b8b517313aeec129fe973008af07d4d6dd30de9e829775f

运行效果

新启动原来的tomcat,它有docs

[root@localhost ~]# docker run -it -d -p 8888:8080 docker.io/tomcat:7-jre7
51a4fdbd61d412200917b54a247f983e311ac8a5b498b8f9821b9c2f706e4d69

Docker专题(六)-Docker镜像详解相关推荐

  1. docker制作mysql5.7镜像详解

    docker制作mysql5.7的镜像难点在于,当mysql安装完成后需要手工初始化.我在其他博客查了下做法大多是用脚本初始化配置启动,但这种模式做出来的父进程不是mysql,是以/bin/bash启 ...

  2. 图形化管理工具Portaniner安 以及 Docker镜像详解(三)

    文章目录 图形化管理工具Portaniner安装 Docker镜像详解 1 什么是镜像 2 Docker镜像加载原理 3 分层理解 提交镜像 常用容器部署 Nginx部署 图形化管理工具Portani ...

  3. Docker - Docker Container及Container命令详解

    Docker - Docker Container及Container命令详解 什么是Docker容器(Docker Container) 上一篇博客介绍了Docker镜像(Docker Image) ...

  4. Docker - Docker Volume及Volume命令详解

    Docker - Docker Volume及Volume命令详解 什么是数据卷(Volume) Docker镜像被存储在一系列的只读层中.当我们创建一个容器时,Docker会读取镜像(只读),并在其 ...

  5. Docker系列(二十四)——Docker实例六Docker安装Redis实例

    < Docker实例三Docker安装Redis实例 > 前言 在前面一篇文章种,完成了 < Docker安装MongoDB实例 >,本篇将继续镜像安装教程,并完成Docker ...

  6. 【卷积神经网络结构专题】一文详解AlexNet(附代码实现)

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! [导读]本文是卷积神经网络结构系列专题第二篇文章,前面我们已经介绍了第一个真正意义 ...

  7. C++11 并发指南六(atomic 类型详解四 C 风格原子操作介绍)

    前面三篇文章<C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍)>.<C++11 并发指南六( <atomic> 类型详解二 std::at ...

  8. C++11 并发指南六(atomic 类型详解三 std::atomic (续))

    C++11 并发指南六( <atomic> 类型详解二 std::atomic ) 介绍了基本的原子类型 std::atomic 的用法,本节我会给大家介绍C++11 标准库中的 std: ...

  9. C++11 并发指南六( atomic 类型详解二 std::atomic )

    C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍)  一文介绍了 C++11 中最简单的原子类型 std::atomic_flag,但是 std::atomic_flag ...

最新文章

  1. 从opensuse 12.3 升级到 opensuse13.1体验
  2. 基于python opencv实现广角相机标定和图像畸变矫正
  3. 管理组、路由组、用户邮箱,数据库他们之间的关系和区别
  4. 在python是什么意思_python 的 表示什么
  5. appium===setup/setupclass的区别,以及@classmathod的使用方法
  6. python md5解密_python 生成文件MD5码
  7. 关于“幽灵架构”的补充说明5:改造控制器
  8. MySql数据类型分析(银行家舍入法) Part3
  9. 配置web.xml和glassfish容器实现javaEE表单验证
  10. ubuntu lvs keepalived mysql_ubuntu下LVS + Keepalived 实现mysql高可用负载均衡实现
  11. 一线大厂都在跑的微服务,真有这么香吗?
  12. OpenGL超级宝典 渲染管线(二)
  13. 电子通信协议之SPI通信协议篇
  14. 最新服务器处理器天梯,至强cpu天梯图2020_intel服务器cpu排行榜2020
  15. iPhone真机测试Crash信息分析
  16. 关于阿里云域名购买与DNS解析教程
  17. Ubuntu使用火狐浏览器下载安装AdobeFlashPlayer
  18. linux系统 ubuntu 使用GWE图形用户界面调整显卡风扇转速曲线
  19. Inception-V3论文翻译——中文版
  20. P2916 [USACO08NOV]Cheering up the Cow G 题解

热门文章

  1. office快捷键设置
  2. label smooth标签平滑【ConvE(知识图谱补全-链接预测)中使用到】
  3. 【Linux】常用命令:网络、内存、cron 超详细介绍
  4. 凸优化学习笔记 6:共轭函数
  5. 三次方分解因式重要公式
  6. jQuery TreeGrid
  7. 解决:ActiveX控件不能使用
  8. 2023年全国最新工会考试精选真题及答案10
  9. AR体感互动产品大合集
  10. 计算机黑屏无法启动,电脑黑屏无法启动