3.Docker镜像管理

本章所讲内容

  • About Docker Images
  • Docker Registry
  • 镜像制作
  • Docker Hub镜像管理
  • aliyun平台镜像管理
  • 上传镜像到私有“Registry”

About Docker Images

Dcoker镜像含有启动容器所需要的文件系统及其内容,因此,其用于创建并启动docker容器,其文件系统采用分层构建机制,最底层为bootfs,其之为rootfs。
>bootfs(引保文件系统):用于系统引导的文件系统,包括bootloader和kernel,容器启动完成后被卸载以节约内存资源

>rootfs:位于bootfs之上,表现为docker容器的根文件系统
>>rootfs传统模式:传统模式中,系统启动时,内核挂载rootfs时会首先将其挂载为“只读”模式,完整性自检完成后将其重新挂载为读写模式。

>>rootfs Docker模式:rootfs由内核挂载为“只读”模式,而后通过“联合挂载机制”技术额外挂载一个“可写”层。

注意:联合挂载机制解释
    联合挂载:如果docker需要产生临时文件或者要写入文件时,基于底层的镜像是不给予写入操作的,唯一能写入的就是Docker容器层面的东西,就是上面说的到
“可写层”,个人理解就像是把底层镜像复制了一份,然后往里面进行写入或者更改操作。
    联合挂载机制需要依赖于专门的文件系统,而在早期使用的Aufs文件系统,aufs前身是UnionFS,UnionFS代码写的很烂,被Aufs重写之后代码依然很烂,aufs
文件系统在2006年由Junjiro Okajima开发;是一位日本的工程师,他一直想把这套文件系统纳入到linux内核中,但由于代码写的较烂,原本4000-5000行代码可以
完成的文件,他写了三万行,连续四次向linux开源组织申请加入linux内核都被拒绝后,他放弃了!
    aufs的竞争产品是overlayfs(叠加文件系统),该文件系统从内核3.18版本开始就被合并到了Linux内核,现在CentOS7默认使用的内核都为3.10,所以都还
是不支持的,如果想用,可以打个内核补丁到3.18版本。
    Docker的分层镜像,除了aufs,docker还支持brtfs,devicemapper和vfs等。
    如果我们是新装的docker版本,我们会发现它也已经使用了overlayfs文件系统了,但使用的是overlay的新版本叫overlay2,使用docker info命令可以看到
docker使用的overlay文件系统,但overlay2是一个抽象的二进制文件系统,需要建立在本地文件系统之上,所以下面出现的Backing Filesystem xfs就是本地文
件系统。

3.Docker镜像管理

Docker Registry

    我们在docker上其实也是可以直接启动容器的,容器的标签名称要指定对,启动容器时,docker daemon首先会试图从本地获取到相关镜像,也就是先看看本地是否已
经把该镜像下载过了,如果没有下载,则就会自动从Registry中下载该镜像并保存到本地,Registry默认就是Docker Hub,如果我们搭建了docker私有Registry,并且
该私有Registry中有我们需要下载的镜像,则通过修改pull路径就可以从我们自己的私有Registry中下载。

Docker Registry分类

Sponsor Registry:第三方的registry,供客户和docker社区使用

Mirror Registry:第三方的registry,只让客户使用。他们通常是由Docker Hub第三方提供

Vendor Registry:由发布Docker镜像的供应商提供的registry;比如某家公司所提供Registry,但并不开放给所有人使用,只开放给他们的客户使用,例如花钱买了他们的产品、服务等的客户使用

Private Registry:通过设有防火墙和额外的安全层的私有实体提供的Registry,就是我们自己搭建的私有Registry

Registry(repository and index)

一个Registry一般由两部分组成分别为repository和index

Repository:
    1.由某特定的docker镜像,如Nginx的docker镜像,这个nginx镜像所有的迭代版本合起来组成的镜像仓库
    2.一个registry中可以存在多个repository
    3.repositry可分为“顶层仓库”和“用户仓库”
    4.用户仓库名称格式为“用户名/仓库名”
    5.每个仓库可以包含多个tag(标签),多个tag来表示多个Nginx镜像,一个Nginx版本代表一个镜像,每个标签只能对应一个镜像

Index:
    1.维护用户账户、镜像的校验以及公共命名空间的信息
    2.相当于为registry提供了一个完成用户认证等功能的检索接口
    Docker Registry中的镜像通常由开发人员制作,而后推送到“公共”或者私有“Registry”上保存,供其他人员使用流程为:开发人员使用docker pull从Docker
 Hub上下载最原始的镜像,然后经过二次封装,例如下载了个Nginx镜像,开发人员经过了二次开发,增加了功能,然后再把经过二次开发的Nginx放到公司内部私有的
“Registry”上,一般仅供公司内部人员使用,例如“部署”到生产环境。

镜像制作

镜像的生成途径通常有以下三种:
>Dockerfile

>基于容器制作

>Docker Hub automated builds

小结:Dockerfile是我们以后最常用的Docker镜像制作方法,但本次我们使用“基于容器制作的方法制作镜像”;基于容器制作,例如一个容器正在运行中,使用commit命令会把容器最上面的那个可写层单独创建一个镜像,相当于克隆了容器最上面可写入的那一层。

容器制作实例

[root@docker-node1 /]# docker pull nginx:latest                 #下载最新版的Nginx镜像,latest为镜像标签
[root@docker-node1 /]# docker run -itd --name mynginx nginx:latest      #后台运行,容器名称为“mynginx”
[root@docker-node1 /]# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mynginx                           #查看容器“mynginx”的IP地址
172.17.0.2
[root@docker-node1 /]# curl http://172.17.0.2 -I                #对Nginx进行访问测试,默认应该为"wlecom to nginx!"
HTTP/1.1 200 OK
Server: nginx/1.15.5
Date: Wed, 17 Oct 2018 07:35:17 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 02 Oct 2018 14:49:27 GMT
Connection: keep-alive
ETag: "5bb38577-264"
Accept-Ranges: bytes
[root@docker-node1 /]# docker exec -it mynginx /bin/bash        #进入容器“mynginx”修改网页文件
root@32131d2cbaac:/# echo '<h1>hello kgbk!</h1>' > /usr/share/nginx/html/index.html 
root@32131d2cbaac:/# cat /usr/share/nginx/html/index.html 
<h1>hello kgbk!</h1>
root@32131d2cbaac:/# exit
[root@docker-node1 /]# curl http://172.17.0.2                   #修改过后再进行访问测试
<h1>hello kgbk!</h1>                                            #注:这里网页文件已做修改,开始制作镜像
语法:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
语法说明:
         CONTAINER:指定镜像名称
         REPOSTTORY:该镜像是制作完成后属于哪个仓库 ,该项为可选,不加会生成在本地,也没有任何标签
         TAG:该镜像的标签是什么
OPTIONS说明:
        --author, -a        #指定克隆该容器后的作者和邮箱等
        --change, -c        #修改原有镜像的指令
        --message, -m       #制作信息
        --pause, -p         #制作之间暂停容器
[root@docker-node1 /]# docker commit -p mynginx nginx:v0.1
sha256:2fe112b2504e76a166609fefc8fa54c8adce9bbcfd4d98108af43b672c2ff07e
[root@docker-node1 /]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               v0.1                2fe112b2504e        8 seconds ago       109MB
nginx               latest              dbfc48660aeb        26 hours ago        109MB

对以创建的镜像进行验证

[root@docker-node1 /]# docker run -itd --name mynginx_node2 nginx:v0.1 
dcd9f77fe0c412415c871780f056f9b9115e9b444f220681be81510cfcb054a3
[root@docker-node1 /]# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mynginx_
node2
172.17.0.3
[root@docker-node1 /]# curl http://172.17.0.3               
<h1>hello kgbk!</h1>

纯净镜像验证

[root@docker-node1 /]# docker run -itd --name mynginx_node3 nginx:latest
95f189cb5389dd1737ab4baa3b553c1ef499aa924a0f0dcbe467c0c9842335bc
[root@docker-node1 /]# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mynginx_node3
172.17.0.4
[root@docker-node1 /]# curl http://172.17.0.4
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Docker Hub镜像管理

Docker hub搜索镜像

Docker Hub搜索镜像地址:https://hub.docker.com/explore/

3.Docker镜像管理

点击进去可以看到Nginx的各个标签标志的版本号

3.Docker镜像管理

Docker hub镜像管理

Docker Hub镜像管理地址:https://hub.docker.com/
Docker Hub需要注册账号然后登陆才能在上面创建Docker Registry
Create Repository可以创建镜像仓库

-3.Docker镜像管理
3.Docker镜像管理
3.Docker镜像管理

aliyun平台镜像管理

阿里云平台网址: https://dev.aliyun.com/search.html

3.Docker镜像管理
3.Docker镜像管理

创建镜像仓库,填写仓库的详细信息

3.Docker镜像管理
3.Docker镜像管理
3.Docker镜像管理
3.Docker镜像管理
3.Docker镜像管理
3.Docker镜像管理

上传镜像到私有“Registry”

上传到aliyun容器平台

[root@docker-node1 /]# docker image ls                      
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               v0.1                2fe112b2504e        3 hours ago         109MB
nginx               latest              dbfc48660aeb        28 hours ago        109MB
[root@docker-node1 /]# docker login [email protected] registry.cn-shanghai.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                                             #登陆成功

注意:阿里云平台上传镜像必须要求把镜像名称写为他们规定的名字,所以使用了docker tag改了标签
[root@docker-node1 /]# docker tag nginx:v0.1 registry.cn-shanghai.aliyuncs.com/kgbk/nginx:aliyun
[root@docker-node1 /]# docker image ls
REPOSITORY                                     TAG                 IMAGE ID            CREATED             SIZE
registry.cn-shanghai.aliyuncs.com/kgbk/nginx   aliyun              2fe112b2504e        3 hours ago         109MB
nginx                                          v0.1                2fe112b2504e        3 hours ago         109MB
nginx                                          latest              dbfc48660aeb        28 hours ago        109MB
[root@docker-node1 /]# docker push registry.cn-shanghai.aliyuncs.com/kgbk/nginx:aliyun  #上传镜像
The push refers to repository [registry.cn-shanghai.aliyuncs.com/kgbk/nginx]
331a147bb76b: Pushed 
86df2a1b653b: Pushed 
bc5b41ec0cfa: Pushed 
237472299760: Pushed 
aliyun: digest: sha256:607e4f6d654b959e3202b002a6eeeeb44b430002b39e38f88ffd809963f0c2bc size: 1155

3.Docker镜像管理

猜你喜欢

转载自blog.51cto.com/11612299/2301432