文章目录
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 hannibal@a-team.com”) | |
-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