Docker镜像

一个host可以启动多个容器,基于镜像可在容器中启动不同的应用。如果本地无此镜像,docker可自动连接到docker registry上下载镜像,存储到本地文件系统(如overlay2)中。由于镜像的格式是分层的,因此存储镜像的文件系统必须支持这种特殊的格式,也就是所谓的二层文件系统。

Docker是码头工人的意思,而镜像可形象理解为应用程序的集装箱,码头工人docker负责装卸集装箱(image/application)。

Docker镜像结构

Docker镜像含有启动容器所需的文件系统及其内容,因此,可用于创建并启动docker容器。

  • 镜像采用分层构建机制,最底层为bootfs,其上为rootfs

    • bootfs:用于系统引导的文件系统,包括bootloader和kernel。容器启动完成后,会被卸载以节约内存资源。

    • rootfs:位于bootfs之上,表现为docker容器的根文件系统

      • 传统模式中,系统启动之时,内核挂载rootfs时首先将其挂载为只读模式,完整性自检完成后将其重新挂载为读写模式

      • docker中,rootfs由内核挂载为只读模式,而后通过联合挂载技术额外挂载一个可写层。

  • Docker Image Layer

    位于下层的镜像称为父镜像,最底层的称为基础镜像(base image)

    最上层为可写层,其下的均为“只读”层

举个例子:

在底层纯净的发行版如Debian之上,添加一个emacs层,这是一个独立的应用层,如果需要额外的工具则需要在上面执行安装操作比如安装vim,安装后可理解为附加了一层vim的层级,该层级仅仅包含了vim。然后可再添加一个独立的层级如apache。当启动apache时,从下往上挂载叠加,并且三层都是只读的。如果需要读写操作,则在最上层容器的自有层次(container)进行,而其他层次是共享的。

一旦启动完成,最底下的层(kernel)也将被移除。如果删除容器,则容器自有的可写层也被删除。

镜像的分层构建和联合挂载,依赖专有的文件系统支撑。

Docker镜像的文件系统

早期,使用的专有文件系统为AUFS。而aufs的前身为unionFS,其代码很烂,因此当它申请到内核代码树时被拒绝。因此如果需要使用aufs,则自行打补丁。

而对于以稳定著称的redhat/CentOS而言是不允许使用aufs的。Ubuntu是允许将aufs打包到内核中去,并且它也已经直接提供打好补丁的内核。故而早期如果要使用docker,只能使用ubuntu/debian系。

而overlayfs,也可以通过打补丁或者装载内核模块的方式,让CentOS使用。

Docker还支持dm,不过它性能和稳定性很差,因此不再使用。早期CentOS7使用的是devicemapper,而新版的Docker中,CentOS7装的是overlay2。

在实际使用过程中,为了更大发挥docker的性能和支持更多的内核特性,建议使用ubuntu作为容器的底层基础设施。

Docker registry

Docker注册库,是镜像的统一存储位置。构建镜像时,需要一个统一存储的位置。当启动镜像时,docker daemon先尝试从本地获取镜像,如果本地不存在镜像则到registry中下载镜像并保存到本地。如果没有指定镜像地址,则到docker hub中获取。

一般而言,需要二次定制镜像以符合自身业务需求。

Registry的组成部分:repository(一大堆仓库) index(一个索引)

Repository

由某些特定的docker镜像的所有迭代版本组成的镜像仓库。一个Registry这种可以存在多个Reopsitory

  • Repository分为“顶层仓库”和“用户仓库”
  • 用户层库名称格式为“用户名/仓库名”
  • 每个层库可以包含多个Tag,每个标签对应一个镜像

Index

  • 维护用户账户、镜像的校验以及公共命名空间的信息
  • 相当于为Registry提供了一个完成用户认证等功能的检索接口

一般的流程是,开发人员从公共registry中获取镜像,并定制打包成images并push到私有registry中。一旦push成功,便触发相应的hook,自动deploy到响应的环境中。

云原生 Cloud Native

传统意义上,程序员的程序是针对某个开发环境而写的,针对系统库和编程接口来生成自己的代码,称为系统原生。

如果面向云环境开发的程序,调用云环境提供的接口,为了在云环境上而运行的程序,称为云原生。

容器或者云,是封装好的。它们不方便修改里面的文件,因此可以通过环境变量赋值的方式来向容器传递信息。

而且是当配置文件启动时,从环境变量自动加载并注入到容器中生成的。因此,可以通过环境变量来配置容器的启动。

Docker Hub

镜像的制作一般基于基础镜像(base image)来做的,而base image一般是docker hub官方手动制作的。

默认情况下,docker daemon是从docker hub上pull镜像的,并且能存放用户的第三方镜像。

docker hub 作为镜像仓库而存在。它支持以下功能:

  • auto builds:使用命令基于docker file来制作镜像,定义好file之后通过docker build生成或者放置到自动构建的位置来制作,或者基于容器docker commit来手动制作

    自动构建是通过联动的方式来做的。Docker file可以放置到github的project的仓库中,该仓库和docker hub仓库可建立关联关系。Docker hub仓库持续监控着github仓库,如果github仓库新加了docker file,则docker hub自动拖去并添加到仓库中

  • Webhooks:自动构建功能的特性,触发自动构建的动作

第三方镜像仓库:https://quay.io/

Docker镜像制作

镜像生成途径:

  • Dockerfile
  • 基于容器制作
  • Docker Hub automated builds

基于容器制作镜像

方法:启动一个容器,在容器之上做好自己需要的配置,然后通过docker commit制作镜像。

Usage:docker commit [options] CONTAINER [REPOSITORY[:TAG]]

Name,shorthand Default Description
–author, -a Author
–change, -c Apply Dockerfile instruction to the created image
–message, -m Commit message
–pause, -p true Pause container during commit

例子:将busybox 加上html目录和index.html,将此结果做成镜像。日后每次启动有会存在此文件。

  • 启动容器,提供文件后保存

    root@eto:~# docker run --name b1 -it busybox
    / # mkdir -p /data/html
    / # echo "busybox http server" >> /data/html/index.htmlroot@eto:~# docker commit -p b1
    sha256:0f8cd6de017004598851b75b96fca52fe9bbbcf457701e28455e934edc475315
    

此时即可看到一个新镜像,可以为之打上标签:

root@eto:~# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED              SIZE
<none>                  <none>              0f8cd6de0170        About a minute ago   1.22MBroot@eto:~# docker tag  0f8cd6de0170 jaywin/httpd:v0.1-1
root@eto:~# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
jaywin/httpd            v0.1-1              0f8cd6de0170        3 minutes ago       1.22MB

可以为一个镜像打上多个标签:

root@eto:~# docker tag  0f8cd6de0170 jaywin/httpd:latest
root@eto:~# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
jaywin/httpd            latest              0f8cd6de0170        3 minutes ago       1.22MB
jaywin/httpd            v0.1-1              0f8cd6de0170        3 minutes ago       1.22MB

删除一个镜像,仅删除了指定标签的镜像

root@eto:~# docker image rm jaywin/httpd:latest
Untagged: jaywin/httpd:latest

查看镜像在启动时,默认执行的命令,比如

root@eto:~# docker inspect busybox | grep Cmd -A3"Cmd": ["/bin/sh","-c","#(nop) ",
--"Cmd": ["sh"],

在创建镜像时,改变原来镜像默认运行的命令。可修改原有镜像的基础命令,修改其中的cmd指令

root@eto:~# docker commit -a "jaywin.com" -c 'CMD ["/bin/httpd","-f","-h","/data/html"]' -p b1 jaywin/httpd:v0.2
sha256:f5a014fe42903e6c527249a7a9208d5cb137772a4bdbaed68eca9bc1a9cf0089

运行:

root@eto:~# docker run --name t2 jaywin/httpd:v0.2 root@eto:~# docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
7389ad8062ea        jaywin/httpd:v0.2   "/bin/httpd -f -h /d…"   About a minute ago   Up About a minute   root@eto:~# curl 172.17.0.2
busybox http server

基于dockerfile制作镜像

参考此处

镜像推送

可以将本地制作好的镜像,推送到registry中保存。常用的公有registry有docker hub官方和阿里云提供的registry

docker hub

登录到服务器上,不指定地址,则登录到docker hub

root@eto:~# docker login -u jaywinz
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

注意:本地镜像的名字,必须和docker hub中保持一致

root@eto:~# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
jaywin/httpd            v0.2                f5a014fe4290        17 minutes ago      1.22MBroot@eto:~# docker tag f5a014fe4290 jaywinz/httpd:v0.2-2
root@eto:~# docker push jaywinz/httpd:v0.2-2
The push refers to repository [docker.io/jaywinz/httpd]
bcefc70bb04a: Pushed
5b0d2d635df8: Mounted from library/busybox
v0.2-2: digest: sha256:b12533340a43375ca74fb21d80229d706981b73012095a331e55f1403b5b8d8a size: 734

由于网站在国外,速度较慢。

阿里云

国内访问比较快的镜像地址,是阿里云

可以登录自己的阿里云账号,即可获得专用的加速地址。将此地址写到docker的配置文件中即可。

root@eto:~# cat /etc/docker/daemon.json
{"exec-opts": ["native.cgrounpdriver=systemd"],"registry-mirrors": ["https://e2615hzs.mirror.aliyuncs.com"]}root@eto:~# systemctl daemon-realod
root@eto:~# systemctl restart docker

可以根据操作指南,将镜像托管到阿里云

root@eto:~# docker login --username=15088132158 registry.cn-hangzhou.aliyuncs.com
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@eto:~# docker tag f5a014fe4290 registry.cn-hangzhou.aliyuncs.com/jaywinz/httpd:v0.2-2
root@eto:~# docker push registry.cn-hangzhou.aliyuncs.com/jaywinz/httpd:v0.2-2
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/jaywinz/httpd]
bcefc70bb04a: Pushed
5b0d2d635df8: Pushed
v0.2-2: digest: sha256:b12533340a43375ca74fb21d80229d706981b73012095a331e55f1403b5b8d8a size: 734

推送镜像时,如果不是推送到docker hub,则必须加上服务器地址,名称空间和标签。

镜像的导入和导出

除了可通过docker registry进行镜像分发,也能通过导入导出的方式进行镜像分发。使用两个命令

  • docker save
  • docker load

因此可以在已有镜像的基础上,打包镜像。然后在另外的主机上解压直接使用。

打包两个镜像:

root@eto:~# docker save -o myimages.gz jaywin/httpd:v0.1-1 jaywinz/httpd:v0.2-1
root@eto:~# ls
myimages.gz

传送到另外的主机, 并导入:

root@eto2:~# docker load -i myimages.gz
5b0d2d635df8: Loading layer [==================================================>]  1.437MB/1.437MB
bcefc70bb04a: Loading layer [==================================================>]   5.12kB/5.12kB
Loaded image: jaywin/httpd:v0.1-1
Loaded image: jaywinz/httpd:v0.2-1
root@eto2:~# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
jaywinz/httpd       v0.2-1              f5a014fe4290        48 minutes ago      1.22MB
jaywin/httpd        v0.1-1              0f8cd6de0170        6 days ago          1.22MB

Docker学习之三:docker镜像管理相关推荐

  1. Docker学习(3)-Docker镜像构建和使用

    Docker学习(1)-Docker简介 Docker学习(2)-Docker基础1 Docker 镜像与制作 Docker 镜像内是否包含内核(bootfs)? 首先,从镜像的体积大小来说,一个比较 ...

  2. Docker学习(2)-Docker基础1

    Docker学习(1)-Docker简介 1.2 Docker安装及基础命令介绍 https://www.docker.com/#Docker官网 Docker 运行系统 OS 版本选择: Docke ...

  3. Docker学习1——Docker入门

    Docker学习1--Docker入门 参考资料 1.Docker简介 2.尚硅谷2022版Docker实战教程(docker教程天花板) 1.1 Docker简介 1.1.1 Docker引入 假定 ...

  4. Docker学习2——Docker高级

    Docker学习2--Docker高级 2.1 Dockerfile解析 2.1.1 Dockfile是什么 Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参 ...

  5. Docker学习(三)-----Docker镜像和仓库了解以及加速

    镜像(Image)是构建容器的基础,镜像是一种分层结构的文件系统.我们可以从仓库(Repository)中下载镜像,而仓库又保存在Registry中,Docker Hub是Docker官方提供的Reg ...

  6. Docker学习(三)-----Docker镜像常用命令

    六.Docker镜像 镜像是Docker的三大组件之一 Docker运行容器前需要本地存在对应的镜像,如果本地不存,Docker会从镜像仓库下载 6.1Docker获取镜像 6.1.1查找镜像 我们可 ...

  7. Docker的安装和镜像管理并利用Docker容器实现nginx的负载均衡、动静分离

    Docker的安装 一.Docker的概念 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化 ...

  8. docker学习笔记2--docker镜像命令

    常用命令: login/logout pull push search Images tag rmi save load import 具体用法如下: login/logout: docker log ...

  9. Docker学习(一)-----Docker简介与安装

    一.Docker介绍 1.1什么是docker Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源 Docker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植 ...

最新文章

  1. SharePoint 2010设置问卷调查权限
  2. MYSQL:HAVING
  3. python tf_TF 2.1.0-rc2发布,2020年停止支持Python 2
  4. 2019标杆案例复盘(中):万物互联——智能电子篇
  5. Android双列表联动和固定头部ScrollView效果实现
  6. 查看sql server 数据库连接数
  7. SurfaceGo配置轻量级LaTeX写作环境(MiKTeX)
  8. oracle database version,Oracle Database Version History
  9. Gateway配合sentinel自定义限流_使用Sentinel实现gateway网关及服务接口限流
  10. SQL必知必会 课后题答案
  11. Kali学习 | 密码攻击:6.10 创建密码字典
  12. 智能电话机器人源码安装 部署好后,人工智能电话机器人,不仅仅是打电话而已!
  13. nodejs动态加载代码
  14. Linux 驱动开发:USB无线wifi驱动开发(MT7601)、完成WIFI管理工具安装
  15. 税费计算机,友商税费计算器
  16. 深圳夫妻随迁入户办理详解
  17. Java num+=1、num++与num=num+1的区别(通俗易懂,附带例子)
  18. html页面用excel打印,excel怎么打印不能全部显示出来
  19. 拉伯杠杆平台|沪指上涨,大金融板块领涨,有股票连续5涨停!
  20. 视频如何做成gif动图?

热门文章

  1. JavaScript小白实现简易悬浮层制作(含测试源码)
  2. 从UIL库谈Android图片加载中需要注意的事情
  3. Shader step函数实现线条拼色
  4. 通过PowerShell管理Office 365组
  5. 有水量服务器水温还是不稳定,我的热水器水量忽大忽小
  6. 第1讲、Cadence Allergo绘制小马哥DragonFly四轴飞行器PCB四层板教程简介
  7. d盘格式化了能正常使用吗
  8. c c++ 画点 画线
  9. 鼠标滑轮滚动事件(记录下以后用到好找)
  10. c++常用源代码以及常用库查找