欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Docker学习之三:docker镜像管理

程序员文章站 2022-04-19 08:52:43
...

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镜像管理

  • Docker Image Layer

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

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

Docker学习之三:docker镜像管理

举个例子:

在底层纯净的发行版如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镜像管理

一般的流程是,开发人员从公共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,将此结果做成镜像。日后每次启动有会存在此文件。

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

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

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

aaa@qq.com:~# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED              SIZE
<none>                  <none>              0f8cd6de0170        About a minute ago   1.22MB

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

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

aaa@qq.com:~# docker tag  0f8cd6de0170 jaywin/httpd:latest
aaa@qq.com:~# 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

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

aaa@qq.com:~# docker image rm jaywin/httpd:latest
Untagged: jaywin/httpd:latest

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

aaa@qq.com:~# docker inspect busybox | grep Cmd -A3
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
--
            "Cmd": [
                "sh"
            ],

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

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

运行:

aaa@qq.com:~# docker run --name t2 jaywin/httpd:v0.2 

aaa@qq.com:~# 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   


aaa@qq.com:~# curl 172.17.0.2
busybox http server

基于dockerfile制作镜像

参考此处

镜像推送

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

docker hub

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

aaa@qq.com:~# 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中保持一致

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

aaa@qq.com:~# docker tag f5a014fe4290 jaywinz/httpd:v0.2-2
aaa@qq.com:~# 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镜像管理

aaa@qq.com:~# cat /etc/docker/daemon.json 
{
  "exec-opts": ["native.cgrounpdriver=systemd"],
  "registry-mirrors": ["https://e2615hzs.mirror.aliyuncs.com"]

}

aaa@qq.com:~# systemctl daemon-realod
aaa@qq.com:~# systemctl restart docker 

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

aaa@qq.com:~# 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

aaa@qq.com:~# docker tag f5a014fe4290 registry.cn-hangzhou.aliyuncs.com/jaywinz/httpd:v0.2-2
aaa@qq.com:~# 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镜像管理

镜像的导入和导出

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

  • docker save
  • docker load

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

打包两个镜像:

aaa@qq.com:~# docker save -o myimages.gz jaywin/httpd:v0.1-1 jaywinz/httpd:v0.2-1
aaa@qq.com:~# ls
myimages.gz  

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

aaa@qq.com:~# 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
aaa@qq.com:~# 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