Docker镜像管理基础
Docker镜像启动方式
Docker镜像含有启动容器所需要的文件系统及其内容,因此,其用于创建并启动docker容器
采用分层构建机制,最底层为bootfs,其之为rootfs
bootfs:用于系统引导的文件系统,包括bootloader和kernel,容器启动完成后会被卸载以节约内存资源;
rootfs:位于bootfs之上,表现为docker容器的根文件系统;
传统模式中,系统启动之时,内核挂载rootfs时会首先将其挂载为“只读”模式,完整性自检完成后将其重新挂载为读写模式;
docker中,rootfs由内核挂载为“只读”模式,而后通过“联合挂载 ”技术额外挂载一个“可写”层;
Docker Image Layer
位于下层的镜像称为父镜像(parent image),最底层的称为基础镜像(base image)
最上层为“可读写”层,其下的均为“只读”层
Docker 文件系统
早期文件系统:Aufs (实现文件联合挂载机制)
- advanced multi-layered unification filesystem:高级多层统一文件系统
- 用于为Linux文件系统实现“联合挂载” v aufs是之前的UnionFS的重新实现,2006年由Junjiro Okajima开发;
- Docker最初使用aufs作为容器文件系统层,它目前仍作为存储后端之一来支持;
- aufs的竞争产品是overlayfs,后者自从3.18版本开始被合并到Linux内核;
- docker的分层镜像,除了aufs,docker还支持btrfs, devicemapper和vfs等
在Ubuntu系统下,docker默认Ubuntu的 aufs;而在CentOS6上,用的是devicemapper;CentOS7上现在还有overlay2
Docker Registry
启动容器时,docker daemon会试图从本地获取相关的镜像;本地镜像不存在时,其将从Registry中下载该镜像并保存到本地
Docker Registry 分类
Registry用于保存docker镜像,包括镜像的层次结构和元数据
用户可自建Registry,也可使用官方的Docker Hub
分类
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上保存,供其他人员使用,例如“部署”到生产环境;
Docker Hub
Image Repositories:镜像仓库
Automated Builds:自动构建
Webhooks:web钩子,github+dockerhub自动构建镜像
Organizations:工作组
GitHub and Bitbucket Integration
镜像的生成途径
Dockerfile
基于容器制作
Docker Hub automated builds
- 基于容器制作
## 启动busybox,创建/data/html/index.html
# docker run --rm -it --name bbox1 busybox
# mkdir /data/httpd -pv
created directory: '/data/'
created directory: '/data/httpd/'
# echo "<h1>Test page</h1>" > /data/httpd/index.html
## 制作镜像
# docker commit -p b1 evescn/busybox/httpd:v1
-p:暂停容器,进行镜像制作
# docker commit -a "evescn" -c 'CMD ["/bin/httpd","-f","-h","/data/html/index.html"]'' -c "EXPOSE 80" -p b1 evescn/busybox/httpd:v2
-a 设置作者信息
-c 修改原dockerfile中信息,比如修改启动命令
-p 打镜像中暂停容器
## 推送镜像
# docker push evescn/busybox/httpd
docker tag
给容器打标签
基于 ID 打标
# docker tag 9133dae37bd8 evescn/busybox/httpd:latest
基于名称和标签打标
# docker tag evescn/busybox/httpd:v0.1 evescn/busybox/httpd:v0.2
为私有 Registry 打标
# docker tag 9133dae37bd8 harbor.evescn.com/busybox/httpd:v0.1
docker push
推送镜像到仓库,如仓库为私有仓库,需要使用 docker login 先进行登陆,然后推送
推送镜像到 Docker Hub 的前提是于 Docker Hub有用户账号,且镜像标签格式为 “ $DOCKER_USER_ID/IMAGE ”
使用 docker login 命令登录成功后,即可使用 docker push命令进行推送
# docker login --username=USERNAME --password=PASSWORD registry.cn-beijing.aliyuncs.com
示例:
# docker push evescn/busybox/httpd:v0.1
docker sava 和 docker load
docker save -o xxx.gz Image1:v1 Image1:v2
doacker load -i XXX.gz
docker save
Save one or more images to a tar archive (streamed to STDOUT by default)
Usage:docker save [OPTIONS] IMAGE [IMAGE...]
--output, -o:Write to a file, instead of STDOUT
docker load
Load an image from a tar archive or STDIN
Usage:docker load [OPTIONS]
--input, -i:Read from tar archive file, instead of STDIN
--quiet, -q:Suppress the load output