1. 镜像的概念

镜像可以理解为应用程序的集装箱,而docker用来装卸集装箱。
docker镜像含有启动容器所需要的文件系统及其内容,因此,其用于创建并启动容器。
docker镜像采用分层构建机制,最底层为bootfs,其上为rootfs
 bootfs:用于系统引导的文件系统,包括bootloader和kernel,容器启动完成后会被卸载以节约内存资源
 rootfs:位于bootfs之上,表现为docker容器的根文件系统
  传统模式中,系统启动之时,内核挂载rootfs会首先将其
 挂载为“只读”式,完整性自检完成后将其重新挂载为读写模
 式
   docker中,rootfs由内核挂载为“只读”模式,而后通过“
 联合挂载”技术额外挂载一个“可写”层

注意:当删除容器时,这个容器自有的“可写”层会一起被删除

2. docker镜像层

位于下层的镜像称为父镜像(parrent image),最底层的称为基础镜像(base image);
最上层为“可读写”层,其下的均为“只读”层。

3. docker存储驱动

docker提供了多种存储驱动来实现不同的方式存储镜像,下面是常用的几种存储驱动:
  ★ AUFS
  ★ OverlayFS
  ★ Devicemapper
  ★ Btrfs
  ★ VFS

4. AUFS

AUFS(AnotherUnionFS):
   是一种Union FS,是文件级的存储驱动。AUFS是一个能透明覆盖一个或多个现有文件系统的层状文件系统,把多层合并成文件系统的单层表示。简单来说就是支持将不同目录挂载到同一个虚拟文件系统下的文件系统。这种文件系统可以一层一层地叠加修改文件。无论底下有多少层都是只读的,只有最上层的文件系统是可写的。当需要修改一个文件时,AUFS创建该文件的一个副本,使用CoW将文件从只读层复制到可写层进行修改,结果也保存在可写层。在Docker中,底下的只读层就是image,可写层就是Container。
   AUFS文件系统据说有3W行代码,而ext4文件系统却只有4000-5000行左右代码,这些代码是要被整合进内核的,后来AUFS申请要被合并进内核代码的时候,linuz觉得它这代码太过臃肿,于是拒绝了。因此AUFS这个文件系统一直以来就不是linux内核中自有的文件系统,想用AUFS这个文件系统的话,必须自己向内核打补丁并去编译使用它,但redhat系列的操作系统一向以稳定著称,不会干这种出格的事,所以在redhat系列操作系统中使用AUFS并无可能。而ubuntu上的docker默认使用的就是AUFS。

5. OverlayFS

Overlay是Linux内核3.18后支持的,也是一种Union FS,和AUFS的多层不同的是Overlay只有两层:一个upper文件系统和一个lower文件系统,分别代表Docker的镜像层和容器层。当需要修改一个文件时,使用CoW将文件从只读的lower复制到可写的upper进行修改,结果也保存在upper层。在Docker中,底下的只读层就是image,可写层就是Container。目前最新的OverlayFS为Overlay2。

AUFS和Overlay都是联合文件系统,但AUFS有多层,而Overlay只有两层,所以在做写时复制操作时,如果文件比较大且存在比较低的层,则AUSF会慢一些。而且Overlay并入了linux kernel mainline,AUFS没有。目前AUFS已基本被淘汰。

6. DeviceMapper

Device mapper是Linux内核2.6.9后支持的,提供的一种从逻辑设备到物理设备的映射框架机制,在该机制下,用户可以很方便的根据自己的需要制定实现存储资源的管理策略。AUFS和OverlayFS都是文件级存储,而Device mapper是块级存储,所有的操作都是直接对块进行操作,而不是文件。Device mapper驱动会先在块设备上创建一个资源池,然后在资源池上创建一个带有文件系统的基本设备,所有镜像都是这个基本设备的快照,而容器则是镜像的快照。所以在容器里看到文件系统是资源池上基本设备的文件系统的快照,并没有为容器分配空间。当要写入一个新文件时,在容器的镜像内为其分配新的块并写入数据,这个叫用时分配。当要修改已有文件时,再使用CoW为容器快照分配块空间,将要修改的数据复制到在容器快照中新的块里再进行修改。

OverlayFS是文件级存储,Device mapper是块级存储,当文件特别大而修改的内容很小,Overlay不管修改的内容大小都会复制整个文件,对大文件进行修改显然要比小文件要消耗更多的时间,而块级无论是大文件还是小文件都只复制需要修改的块,并不是整个文件,在这种场景下,显然device mapper要快一些。因为块级的是直接访问逻辑盘,适合IO密集的场景。而对于程序内部复杂,大并发但少IO的场景,Overlay的性能相对要强一些。

7. docker registry

启动容器时,docker daemon会试图从本地获取相关的镜像,本地镜像不存在时,其将从Registry中下载该镜像并保存到本地。
Registry用于保存docker镜像,包括镜像的层次结构和元数据。用户可以自建Registry,亦可使用官方的Docker Hub。

docker registry的分类:
  ★ Sponsor Registry:第三方的Registry,供客户和Docker社区使用
  ★ Mirror Registry:第三方的Registry,只让客户使用
  ★ Vendor Registry:由发布docker镜像的供应商提供的registry
  ★ Private Registry:通过设有防火墙和额外的安全层的私有实体提供的registry

docker registry的组成:
  ★ Repository
   ☆ 由某特定的docker镜像的所有迭代版本组成的
   镜像仓库
   ☆ 一个Registry中可以存在多个Repository
     △ Repository可分为“顶层仓库”和“用户仓库”
     △ 用户仓库名称格式为“用户名/仓库名”
   ☆ 每个仓库可包含多个Tag(标签),每个标签对应
   一个镜像
  ★ Index
   ☆ 维护用户帐户、镜像的检验以及公共命名空间的信息
   ☆ 相当于为Registry提供了一个完成用户认证等功能的
   检索接口

Docker Registry中的镜像通常由开发人员制作,而后推送至“公共”或“私有”Registry上保存,供其他人员使用,例如“部署”到生产环境。

8. docker镜像的制作

多数情况下,我们做镜像是基于别人已存在的某个基础镜像来实现的,我们把它称为base image。比如一个纯净版的最小化的centos、ubuntu或debian。
  那么这个最小化的centos镜像从何而来呢?其实这个基础镜像一般是由Docker Hub的相关维护人员,也就是Docker官方手动制作的。这个基础镜像的制作对于Docker官方的专业人员来说是非常容易的,但对于终端用户来说就不是那么容易制作的了。

9. Docker Hub

Docker Hub is a cloud-based registry service which allows you to link to code repositories, build your images and test them, stores manually pushed images, and links to Docker Cloud so you can deploy images to your hosts.
  It provides a centralized resource for container image discovery, distribution and change management, user and team collaboration, and workflow automation throughout the development pipeline.

Docker Hub provides the following major features:
  ★ Image Repositories
    ☆ Find and pull images from community and official libraries, and manage, push to, and pull from private images libraries to which you have access.
  ★ Automated Builds
    ☆ Automatically create new images when you make changes to a source code repository.
  ★ Webhooks
    ☆ A feature of Automated Builds, Webhooks let you trigger actions after a successful push to a repository.
  ★ Organizations
    ☆ Create work groups to manage access to image repositories.
  ★ GitHub and Bitbucket Integration
    ☆ Add the Hub and your Docker Images to your current workflows.

10. docker镜像的获取

To get Docker images from a remote registry(such as your own Docker registry)and add them to your local system, use the docker pull command:

docker pull <registry>[:<port>]/[<namespace>/]<name>:<tag>

The is a host that provides the docker-distribution service on TCP (default:5000)

Together, and identify a particular image controlled by at the registry
   ★ Some registries also support raw ;for those, is optional
   ★ When it is included, however, the additional level of hierarchy that provides is usefull to distinguish between images with the same

The additional level of hierarchy of

Namespace Examples(< namespace >/< name >)
organization redhat/kubernetes, google/kubernetes
ogin(username) Alice/application, bob/application
role devel/database, test/database, prod/database

11. 镜像的生成

镜像的生成途径:
  ★ Dockerfile
  ★ 基于容器制作
  ★ Docker Hub automated builds

12. 基于容器制作镜像

Create a new image from container’s changes

Usage:

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Options Default Description
—author, -a Author (e.g., “John Hannibal Smith hannibal@a-team.com”)
-c, --change list Apply Dockerfile instruction to the created image
-m, --message string Commit message
-p, --pause true Pause container during commit

12.1 下载镜像并修改

//下载busybox
[root@WangJiayue ~]# docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
61c5ed1cbdf8: Pull complete
Digest: sha256:4f47c01fa91355af2865ac10fef5bf6ec9c7f42ad2321377c21e844427972977
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest//命名并进入容器,创建文件
[root@WangJiayue ~]# docker run -it busybox
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # mkdir data
/ # echo 'test' > data/index.html
/ # cat data/index.html
test

12.2 在创建镜像时,我们不能关闭容器,必须使其处于运行状态,所以我们必须要另起一个终端,然后执行

[root@WangJiayue ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
936b8eaaf0b0        busybox             "sh"                2 minutes ago       Up 2 minutes                                    jovial_einstein
159fb257a2c4        busybox             "sh"                5 minutes ago       Exited (0) 3 minutes ago                        confident_williamson
938e1733abad        busybox             "sh"                17 minutes ago      Exited (0) 11 minutes ago                       pensive_black
[root@WangJiayue ~]# docker commit -p 936b8eaaf0b0
sha256:43ee63878e42805e4e83d3291d043cf61bf1af32e1fc721167e3194a68cd0663
[root@WangJiayue ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              43ee63878e42        21 seconds ago      1.22MB
busybox             latest              018c9d7b792b        4 weeks ago         1.22MB

12.3 在Docker Hub上创建一个仓库,然后再将我们做好的镜像push上去


12.4 给镜像命名

[root@WangJiayue ~]# docker tag 43ee63878e42 WangJiayue/httpd:v1.0
[root@WangJiayue ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
WangJiayue/httpd    v1.0                43ee63878e42        35 minutes ago      1.22MB
busybox             latest              018c9d7b792b        4 weeks ago         1.22MB

12.5 登陆docker hub,将镜像上传至docker hub

[root@WangJiayue ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: WangJiayue
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded
[root@WangJiayue ~]# docker push WangJiayue/httpd:v1.0
The push refers to repository [docker.io/WangJiayue/httpd]
81b8b053d9b5: Pushed
514c3a3e64d4: Mounted from library/busybox
v1.0: digest: sha256:708cab1fb314cc31315b43c66548cde6507103fd19f70906e3a3d76f3a206683 size: 734

12.6 使用新生成的镜像创建容器

[root@WangJiayue ~]# docker run -it WangJiayue/httpd:v1.0
/ # ls
bin   data  dev   etc   home  proc  root  sys   tmp   usr   var
/ # cat data/index.html
test

由此可见,新生成的镜像中是包含了新增的内容的,但是此时有一个问题,那就是容器默认要启动的进程是什么?在这里,默认情况下是启动的sh进程,但我们是要启动一个http站点,所以我们要在创建镜像时将容器默认启动的进程设为httpd,这样一来我们就可以通过新生成的镜像来快速构建一个简单的http站点了。

使用docker inspect命令查看容器vi启动的默认进程是什么

[root@WangJiayue ~]# docker inspect 43ee63878e42
"Cmd": ["sh""Gateway": "172.17.0.1","IPAddress": "172.17.0.3",

12. 7 重新生成镜像并上传

[root@WangJiayue ~]# docker commit -p -c 'CMD ["/bin/httpd","-f","-h","/data"]' 96446a2fc4fd  WangJiayue/httpd:v0.2
sha256:0de58e49f9da074c12f381adeb914de563ac486b82d5489d4e58af49c2812c2b
[root@WangJiayue ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
WangJiayue/httpd     v0.2                0de58e49f9da        10 seconds ago      1.22MB
WangJiayue/httpd    v1.0                43ee63878e42        12 hours ago        1.22MB
busybox             latest              018c9d7b792b        4 weeks ago         1.22MB

12.8 使用新生成的镜像创建容器

[root@WangJiayue ~]# docker run -d WangJiayue/httpd:v0.2
602974b6043d60d7bf36d8ddeb68d6b93661f4ed8dcce910764801901f580178
[root@WangJiayue ~]# docker container ls
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS               NAMES
602974b6043d        WangJiayue/httpd:v0.2   "/bin/httpd -f -h /d…"   14 seconds ago      Up 13 seconds                           romantic_swirles
96446a2fc4fd        busybox                "sh"                     9 minutes ago       Up 9 minutes                            competent_taussig

使用docker inspect命令查看t2容器启动的默认进程是什么,以及其IP地址,然后用curl命令访问该IP,看是否能访问到网页

[root@WangJiayue ~]# docker inspect 602974b6043d"Path": "/bin/httpd""Gateway": "172.17.0.1","IPAddress": "172.17.0.3",
[root@WangJiayue ~]# curl http://172.17.0.3
test

13. 镜像的导入与导出

docker中我们使用docker save进行导出,使用docker load进行导入。

13.1 在已生成镜像的主机上执行docker save导出镜像

[root@WangJiayue ~]# docker save -o images.gz WangJiayue/httpd:v0.2
[root@WangJiayue ~]# ls
anaconda-ks.cfg  images.gz

13.2 在另一台没有镜像的主机上执行docker load导入镜像

root@WangJiayue-2 ~]# docker load -i images.gz

docker镜像管理基础相关推荐

  1. docker镜像管理基础和操作

    #docker镜像管理基础 镜像的概念 镜像可以理解为应用程序的集装箱,而docker用来装卸集装箱. docker镜像含有启动容器所需要的文件系统及其内容,因此,其用于创建并启动容器. docker ...

  2. Docker镜像管理

    Docker镜像管理 一.Docker镜像的基本操作 1.查看本地镜像 2.搜索镜像仓库镜像 3.拉取镜像 4.导出镜像 5.导入镜像 6.删除镜像 二.docker的操作系统 1.Linux系统构成 ...

  3. Docker 2.3:Docker 镜像管理

    2.3:Docker 镜像管理 2.3.1:docker search - 搜索镜像 如果要搜索镜像,更好的方式是直接在 Dockerhub 网页上进行搜索,命令行搜索结果并不直观: 基本搜索 会将含 ...

  4. docker镜像原理基础与dockerfile部署springboot项目

    一.docker镜像原理 1.操作系统组成部分 进程调度子系统 进程通信子系统 内存管理子系统 设备管理子系统 文件管理子系统 网络通信子系统 作业控制子系统 Linux文件系统由bootfs和roo ...

  5. ARM架构Docker镜像构建-基础知识

    介绍ARM版本的Docker镜像的构建,包括ARM机器上Docker的安装,在ARM机器上构建镜像,及在amd64机器上使用buildx交叉构建arm版本镜像. 前言 现在很多地方都对服务的国产化适配 ...

  6. 云原生Docker镜像管理

    docker是什么? docker是一个go语言开发的应用容器引擎. docker的作用? ①运行容器里的应用: ②docker是用来管理容器和镜像的一种工具. #容器 与 虚拟机 的区别? 容器 虚 ...

  7. (五)Docker镜像管理1之镜像操作

    这篇文章将介绍镜像的一般操作,包括查看.查找.下载.删除等. 下载镜像 使用下面的命令来下载镜像 1 docker pull 镜像名称或者镜像名称:标签 1 2 #如果不加标签则表示最新的 docke ...

  8. Docker学习之三:docker镜像管理

    Docker镜像 一个host可以启动多个容器,基于镜像可在容器中启动不同的应用.如果本地无此镜像,docker可自动连接到docker registry上下载镜像,存储到本地文件系统(如overla ...

  9. Docker 镜像管理

    什么是镜像 简单说,Docker镜像是一个不包含Linux内核而又精简的Linux操作系统. Docker运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker会尝试先从默认镜像仓库下载, ...

最新文章

  1. Android笔记之ViewModel的使用示例
  2. 瑞雪时晴,不亦快哉 ——图灵十一月月刊
  3. Android基础教程之五大布局对象------FrameLayout,LinearLayout,AbsoluteLayout,RelativeLayout,TableLayout...
  4. 周五话营销 | 数据分析强势解决营销人三大痛点
  5. Response_案例1_重定向_特点
  6. 友善之臂编linux内核,友善之臂NanoPC-T3 Plus,s5p6818编译Linux内核流程
  7. TCP中recv解阻塞的两种方式
  8. html中js定义的方法无效,javascript中定义函数有几种常用方法?
  9. OpenCV-计算自然对数cv::log
  10. 深入解析软件测试行业!它是否存在前景和出路?
  11. CI 里去掉index.php 并 识别css js 文件 技巧
  12. Code Snippets for Windows Mobile 5 in C#
  13. html 抽奖机 代码,JS实现转动随机数抽奖特效代码
  14. wsimport 的使用
  15. 通过VBA在excel中实现多只股票基金实时交易数据查询(完整的excel原件可以在我的资源中下载)
  16. typecho插件编写教程6 - 调用接口
  17. PointOperation03_Matlab灰度gray图反色(inverting)
  18. 双硬盘分别装windows和linux,双硬盘分别安装windows和Ubuntu20双系统
  19. Android 8.0中各种通知写法汇总
  20. 怎样学好Python

热门文章

  1. 音乐类型是怎么区分的?什么样的才算是摇滚?摇滚应该也是通俗音乐的一种吧?...
  2. 浏览器文件下载和图片显示(流形式)
  3. Vue学习笔记 —— 路径引入
  4. 每日学术速递5.30
  5. 企业实施CMMI中 常见的4大问题
  6. liunx系统文本处理命令
  7. 【Linux】进程管理相关命令
  8. 内置函数:greatest()和least()函数
  9. 计算机组成原理与系统结构实验操作
  10. 2.24波斯顿房价预测线性回归