5.2 Docker镜像管理及制作

1. 镜像的概念

镜像可以理解为应用程序的集装箱,而docker用来装卸集装箱。

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

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

  • bootfs:用于系统引导的文件系统,包括bootloader和kernel,容器启动完成后会被卸载以节约内存资源
  • rootfs:位于bootfs之上,表现为docker容器的根文件系统
    • 传统模式中,系统启动之时,内核挂载rootfs会首先将其挂载为“只读”模式,完整性自检完成后将其重新挂载为读写模式
    • docker中,rootfs由内核挂载为“只读”模式,而后通过“联合挂载”技术额外挂载一个“可写”层

注意:当删除容器时,这个容器自有的“可写”层会一起被删除
在这里插入图片描述

2. docker镜像层

在这里插入图片描述
位于下层的镜像称为父镜像(parrent image),最底层的称为基础镜像(base image);
最上层为“可读写”层,其下的均为“只读”层。

3. docker存储驱动

docker提供了多种存储驱动来实现不同的方式存储镜像,下面是常用的几种存储驱动:

  • AUFS
  • OverlayFS
  • Devicemapper
  • Btrfs
  • VFS

3.1 docker registry

启动容器时,docker daemon会试图从本地获取相关的镜像,本地镜像不存在时,其将从Registry中下载该镜像并保存到本地。

Registry用于保存docker镜像,包括镜像的层次结构和元数据。用户可以自建Registry,亦可使用官方的Docker Hub。

docker registry的分类:

  • Sponsor Registry:第三方的Registry,供客户和Docker社区使用
  • Mirror Registry:第三方的Registry,只让客户使用
  • Vendor Registry:由发布docker镜像的供应商提供的registry
  • Private Registry:通过设有防火墙和额外的安全层的私有实体提供的registry

docker registry的组成:

  • Repository
    • 由某特定的docker镜像的所有迭代版本组成的镜像仓库
    • 一个Registry中可以存在多个Repository
      • Repository可分为“顶层仓库”和“用户仓库”
      • 用户仓库名称格式为“用户名/仓库名”
    • 每个仓库可包含多个Tag(标签),每个标签对应一个镜像
  • Index
    • 维护用户帐户、镜像的检验以及公共命名空间的信息
    • 相当于为Registry提供了一个完成用户认证等功能的检索接口

Docker Registry中的镜像通常由开发人员制作,而后推送至“公共”或“私有”Registry上保存,供其他人员使用,例如“部署”到生产环境。
在这里插入图片描述

4. Docker镜像制作

多数情况下,我们做镜像是基于别人已存在的某个基础镜像来实现的,我们把它称为base image。比如一个纯净版的最小化的centos、ubuntu或debian。

4.1 创建个人Docker账号

进入Docker官网:hub.docker.com
在这里插入图片描述

4.2 docker镜像的获取

命令:docker pull <registry>[:<port>]/[<namespace>/]<name>:<tag>
示例:

#Docker官方镜像下载
[root@docker ~]# docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
0669b0daf1fb: Pull complete 
Digest: sha256:b26cd013274a657b86e706210ddd5cc1f82f50155791199d29b9e86e935ce135
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest
[root@docker ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              83aa35aa1c79        3 weeks ago         1.22MB

4.3 镜像的生成

镜像的生成途径:

  • Dockerfile
  • 基于容器制作
  • Docker Hub automated builds
    在这里插入图片描述

4.4 基于容器制作镜像

命令: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
常用参数:

Options Default Description
—author, -a Author (e.g., “John Hannibal Smith [email protected]”)
-c, --change list 将Dockerfile指令应用于创建的映像
-m, --message string 提交消息
-p, --pause true Pause container during commit

示例:

[root@docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@docker ~]# docker run --name b1 -it busybox
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # mkdir /data
/ # echo 'busybox hello word'>/data/index.html
/ # cat /data/index.html 
busybox hello word

注意:在创建镜像时,我们不能关闭容器,必须使其处于运行状态,所以我们必须要另起一个终端,然后执行

1.查看容器
[root@docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e727b07fd616        busybox             "sh"                18 seconds ago      Up 17 seconds                           b1

2.创建镜像
[root@docker ~]# docker commit -p b1
sha256:05d7322f0be05017769a8a7eae5c59d84ee9ff2893a87824381a86d6e70d3e17

3.查看创建的镜像,注意这样创建的镜像无仓库名称和版本号
[root@docker ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              05d7322f0be0        24 seconds ago      1.22MB
busybox             latest              83aa35aa1c79        3 weeks ago         1.22MB

4.为创建的镜像添加名称及版本标签
[root@docker ~]# docker tag 05d7322f0be0 yuimage/busybox01:v0.1
[root@docker ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
yuimage/busybox01   v0.1                05d7322f0be0        14 minutes ago      1.22MB
busybox             latest              83aa35aa1c79        3 weeks ago         1.22MB

注意:我们的用户ID为yuimage,仓库名叫busybox01,所以我们要在Docker Hub上创建一个名为busybox01的仓库,然后再将我们做好的镜像push上去
1.进入Docker官网,登录后点击Create a Repository
在这里插入图片描述
2.创建仓库busybox01
在这里插入图片描述
在主机上登录docker账号后,上传制作好的镜像

[root@docker ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: yuimage
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@docker ~]# docker push yuimage/busybox01:v0.1
The push refers to repository [docker.io/yuimage/busybox01]
61144f6d615d: Pushed 
a6d503001157: Mounted from library/busybox
v0.1: digest: sha256:a7d202606a65dd20b492caa68b898f5a7e0db9e2c533f822b93f02ef16ff81cc size: 734
发布了50 篇原创文章 · 获赞 8 · 访问量 1870

猜你喜欢

转载自blog.csdn.net/Yusyang_/article/details/105283376
5.2
今日推荐