Docker镜像管理

一.关于Docker镜像

  • Docker镜像含有启动容器所需要的文件系统及其内容 ,因此 其用于创建并启动docke镜像.

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

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

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

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

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


二.Docker镜像分层

  • 位于下层的镜像称为父镜像,最底层的称为基础镜像(base image)
  • 最上层为”可读写”层,其下的均为”只读”层
    • 当删除容器时 ,可写层会一起删除

三.Docker存储

  • 启动容器时,docker daemon会试图从本地获取相关的镜像,本地镜像不存在时,其将从Registry中下载该镜像并保存到本地.
Registry没有特别指定 默认为docker hub  ,如果使用别的Registry ,则必须在镜像的访问路径给名服务器地址

四.Docker Hub

注册账号:https://hub.docker.com/signup

获取镜像:
#docker pull <registry>[:<port>]/[<namespace>/]<name>:<tag>
<registry>[:<port>]       哪个仓库服务器加端口  docker hub 可省略
/[<namespace>/]          名称空间 哪个用户的仓库 顶层可省略
<name>:<tag>             仓库名加标签名

其他著名仓库服务器:https://quay.io/
例:

[root@Docker ~]# docker pull quay.io/coreos/flannel:v0.10.0-s390x   //端口默认为443


五.镜像相关操作

5.1 镜像的生成途径

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

5.2 基于容器做镜像

1.先启动一个容器 做好修改

先pull busybox镜像 启动后做一个主页 这样下次启动主页就存在

 [root@liujie ~]# docker run --name web1 -it busybox
 / # mkdir /data/html
 mkdir: can't create directory '/data/html': No such file or directory
/ # mkdir -p  /data/html
/ # vi /data/html/index.html
hello  httpd
//此时不能关闭容器 

2.基于容器做镜像

Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
docker commit [OPTIONS] CONTAINER 基于哪个容器做镜像
[REPOSITORY[:TAG]] 属于哪个仓库拥有什么标签 如果省略则代表本地的裸镜像 不属于任何仓库

[root@liujie ~]# docker commit -p web1   //-p是暂停  防止保存部分文件 
sha256:b4ecf4975f3b22284c26be372197aa73029d0781acaeb584456fb624fc1fa934 
[root@liujie ~]# docker image ls
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
<none>                   <none>              b4ecf4975f3b        12 minutes ago      1.15MB
仓库为空                 标签也为空            id为生成id 

为了后续管理 可以为打标签

[root@liujie ~]# docker tag b4ecf4975f3b 18834478096/httpd:v0.1   //基于id  18834478096为docker hub账号为后续上传
[root@liujie ~]# docker image ls
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
18834478096/httpd             v0.1                b4ecf4975f3b        About an hour ago   1.15MB   

删除镜像: 两个标签时可删除 只有一个标签删除会报错

[root@liujie ~]# docker image rm liujie/httpd:v0.1.1
Untagged: liujie/httpd:v0.1.1   

3. 启动做好的镜像

[root@liujie ~]# docker run --name t1 -it 18834478096/httpd:v0.1
/ # cd /
/ # ls
bin   data  dev   etc   home  proc  root  sys   tmp   usr   var
/ #   //之前创建好的data目录存在  

5.3 上传镜像

放到docker hub上:

1.注册账号

https://hub.docker.com/

2.使用Docker hub账号在验证本地登录

[root@liujie ~]# docker login -u 18834478096
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

3. 查看本地的镜像

[root@liujie ~]# docker image images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
18834478096/httpd        v0.1                b4ecf4975f3b        3 hours ago         1.15MB

如果REPOITORY的名不是你Docker hub账号和仓库,即Docker ID/仓库名,是上传不成功的

4.在Docker Hub上创建仓库


5.推镜像

[root@liujie ~]# docker image push 18834478096/httpd:v0.1
The push refers to repository [docker.io/18834478096/httpd]
de66091347b2: Pushed
8a788232037e: Mounted from library/busybox
v0.1: digest: sha256:eccf03eea662b180d52d3c4909bcd82cfc7a7b319c6a4d664643750cdf0544b9 size: 734  




上传阿里镜像仓库

https://cr.console.aliyun.com/

选择本地仓库 创建镜像仓库

点击管理

1.给镜像打标签 使用阿里云地址

[root@liujie ~]# docker image images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
18834478096/httpd        v0.1                b4ecf4975f3b        3 hours ago         1.15MB
[root@liujie ~]# docker tag 18834478096/httpd:v0.1 registry.cn-qingdao.aliyuncs.com/18834478096/httpd:v0.1
[root@liujie ~]# docker image ls
REPOSITORY                                           TAG                 IMAGE ID            CREATED             SIZE
18834478096/httpd                                    v0.1                b4ecf4975f3b        3 hours ago         1.15MB
registry.cn-qingdao.aliyuncs.com/18834478096/httpd   v0.1                b4ecf4975f3b        3 hours ago         1.15MB

2.登录阿里云

[root@liujie ~]# docker logout
Removing login credentials for https://index.docker.io/v1/
[root@liujie ~]# docker login --username=18834478096 registry.cn-qingdao.aliyuncs.com
Password:     //密码为Registry登录密码 
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  

3.推镜像到阿里云

[root@liujie ~]# docker push registry.cn-qingdao.aliyuncs.com/18834478096/httpd:v0.1
The push refers to repository [registry.cn-qingdao.aliyuncs.com/18834478096/httpd]
de66091347b2: Pushed
8a788232037e: Pushed
v0.1: digest: sha256:eccf03eea662b180d52d3c4909bcd82cfc7a7b319c6a4d664643750cdf0544b9 size: 734   


5.4 镜像导入导出

打包镜像

[root@liujie ~]# docker save -o myfirst.gz 18834478096/httpd:v0.1
[root@liujie ~]# ll
total 230540
-rw-------   1 root root    1386496 Dec 19 23:01 myfirst.gz

发送压缩包到其他docker主机使用

[root@liujie2 ~]# docker load -i myfirst.gz
[root@liujie2 ~]# docker image ls
REPOSITORY                                           TAG                 IMAGE ID            CREATED             SIZE
18834478096/httpd                                    v0.1                b4ecf4975f3b        4 hours ago         1.15MB

这种方法run之前要先pull镜像 不然run还会从默认地址下镜像