Docker学习之三:docker镜像管理

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学习之三:docker镜像管理_第1张图片

  • Docker Image Layer

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

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

Docker学习之三:docker镜像管理_第2张图片

举个例子:

在底层纯净的发行版如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提供了一个完成用户认证等功能的检索接口

Docker学习之三:docker镜像管理_第3张图片

一般的流程是,开发人员从公共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.html
    
    
    root@eto:~# docker commit -p b1
    sha256:0f8cd6de017004598851b75b96fca52fe9bbbcf457701e28455e934edc475315
    

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

root@eto:~# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED              SIZE
                                0f8cd6de0170        About a minute ago   1.22MB

root@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-store

Login Succeeded

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

root@eto:~# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
jaywin/httpd            v0.2                f5a014fe4290        17 minutes ago      1.22MB

root@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的配置文件中即可。

Docker学习之三:docker镜像管理_第4张图片

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-store

Login 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学习之三:docker镜像管理_第5张图片

镜像的导入和导出

除了可通过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

你可能感兴趣的:(运维)