理论
镜像的组成
- docker 的镜像是由文件系统叠加而成
- 最底层是引导文件系统 bootfs, 容器启动后, bootfs会被卸载, 留出更多的内存供 initrd 磁盘镜像使用
- 第二层是 rootfs, 可以由一个或多个文件系统(如centos, ubuntu)组成, rootfs 永远只读
- 再利用联合加载(union mount)在 rootfs 上加载 更多的只读文件系统, 最终的文件系统会包含所有底层的文件和目录
- docker中将这样的文件系统称为镜像, 一个镜像可以放到另一个镜像的顶部, 位于下方的镜像称为父镜像, 最底端的镜像称为基础镜像, 当启动容器时, docker会在顶层加载一个读写文件系统, 我们的读写操作是在这个层执行的
有关名词
- 联合加载: 一次同时加载多个文件系统, 但在外部只能看到一个
- 读写复制: docker启动容器时, 初始的读写层是空的, 当文件系统发生变化时, 变化都会应用到这一层. 修改文件时, 会先从下边的只读层复制到上边的读写层 该文件的只读版本依然存在, 但是已经被读写层中的副本隐藏
使用
修改镜像源
- 修改 /etc/docker/daemon.json 文件
{ # "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"] # "registry-mirrors": ["https://9cpn8tt6.mirror.aliyuncs.com"] # 阿里的 "registry-mirrors":["http://hub-mirror.c.163.com"] # 网易的 }
- 重启docker服务
systemctl daemon-reload systemctl restart docker.service
基础命令
# 在线上查找镜像
docker search centos
# 从线上拉取镜像
docker pull centos
docker pull ansible/centos7-ansible
# 列出镜像
docker images
# 删除镜像
docker rmi [id|name]
# 查看指定镜像的创建历史
docker history centos
构建
dockerfile & build >> 推荐使用
- 创建一个目录, 存放dockerfile, 这个目录就是我们的 构建环境(build environment)
- docker 称此环境为上下文 (context), 或者构建上下文 (build context)
- docker 会在构建镜像时, 将该目录内的文件和目录上传到 docker 的守护进程
- 这样 docker 的守护进程就能直接访问你想在镜像中存储的任何代码、文件或其他数据
- 每条 run/copy/add 指令执行时, 都会创建一个新的镜像层, 如果指令执行成功, 就会将镜像层提交, 继续执行下一条
- 由于上一条的存在, dockerfile 中应该尽量减少 run/copy/add 等命令的次数, 缩减镜像大小
dockerfile
使用docker build构建(创建镜像)
# 语法
# docker built -t [registry]/[image][:tag] [path]
# tag不填默认为latest
# path为dockerfile所在目录, 也可以指定git仓库的dockerfile地址, 通常会被指定为当前目录"."
docker build -t centos/nginx . # tag不填, 版本为latest; .为根据当前目录创建镜像
docker build -t centos/nginx:0.0.2 git@github.com/xxx/xx # 可以指定git仓库的dockerfile地址
# 忽略构建缓存, --no-cache 关键字
docker build --no-cache -t centos/nginx:0.0.3 .
使用commit >> 不推荐
docker commit [容器名|容器id] 镜像名:版本号
查看镜像分层大小
docker history [IMAGENAME|IMAGEID]
# 执行结果如下
#
# [root@iZ0jle533ii2r4nd36agbfZ nginx]# docker history op/nginx:v1
# IMAGE CREATED CREATED BY SIZE COMMENT
# c07ae2307022 3 minutes ago /bin/sh -c #(nop) EXPOSE 443/tcp 80/tcp 0 B
# aea2a3602117 3 minutes ago /bin/sh -c #(nop) ADD file:411f7b29e4bc7ac... 21 B
# 9c501de24b40 3 minutes ago /bin/sh -c #(nop) ENV htmldir=/usr/share/... 0 B
# 8f41e459edf2 3 minutes ago /bin/sh -c #(nop) MAINTAINER KAI 10928452... 0 B
# c39a868aad02 8 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daem... 0 B
# ...