Dockerfile
docker images
# 查找镜像,Docker Hub: https://hub.docker.com/ docker search ubuntu # NAME: 镜像仓库源的名称 # DESCRIPTION: 镜像的描述 # OFFICIAL: 是否 docker 官方发布 # STARS: 类似 Github 里面的 star,表示点赞、喜欢的意思。 # AUTOMATED: 自动构建。 docker images # 查看本地已有的镜像 docker pull ubuntu:22.04 # 下载镜像 docker rmi ununtu:22.04 # 删除本地已有的镜像
docker commit
-
更新镜像:从容器中更新镜像,并提交
# 运行一个ubuntu docker run -it --name myubuntu ubuntu:22.04 /bin/sh # 在容器中更新操作,并退出容器 apt update apt upgtade apt install iputils-ping dnsutils apt autoremove apt clean exit # 此时myubuntu是我们更改过的容器,提交容器副本 docker commit -m "has update" -a "xstar" myubuntu xstar/ubuntu:22.04-v2 # -m: 提交描述 # -a: 镜像作者 # myubnutu: 容器ID/Name # xstar/ubuntu:22.04-v2: 目标镜像名 # 查看提交的镜像 docker images # REPOSITORY TAG IMAGE ID CREATED SIZE # xstar/ubuntu 22.04-v2 71750dd22bc2 6 seconds ago 185MB # ubuntu 22.04 174c8c134b2a 4 weeks ago 77.9MB docker run --rm -it --name myubuntu2 xstar/ubuntu:22.04-v2 /bin/sh
docker build
通过Dockerfile文件构建指令,用docker build创建一个新的镜像。
Dockerfile每一个指令都会在镜像上创建一个新的层,要尽可能减少、合并指令(如:用&&连接多个操作)。
build过程中,若出现apt update、install错误,但在容器中执行又是正常的,可能是两个原因:
- docker默认DNS为8.8.8.8,8.8.4.4,在国内访问这两个DNS不稳定,改成国内DNS。
- 访问国内源不稳定,改成国内镜像源(我改成mirrors.aliyun.com也不稳定,默认源、ustc的都成功build)。
-
Dockerfile
# Dockerfile to build unbutu Installed network tools # Set the base image to Ubuntu FROM ubuntu:22.04 MAINTAINER XStar "xstar@qq.com" # Update & Install tools RUN sed -i 's/http:\/\/archive.ubuntu.com/http:\/\/mirrors.ustc.edu.cn\/ubuntu/g' /etc/apt/sources.list \ && apt-get update && apt-get -y upgrade \ && apt -y install iputils-ping net-tools bind9-dnsutils \ && rm -rf /var/lib/apt/lists/* && apt-get autoremove && apt-get clean # 容器启动命令 CMD /bin/bash
-
docker build构建
docker build -t xstar/ubuntu:22.04v1 ./ # -t: 目标镜像名、TAG # ./: Dockerfile文件所在目录或绝对路径 # --no-cache,不使用缓存,bulid需要重新下载所需文件 # 多次build到同一个名称和TAG,之前的image的REPOSITORY,TAG会变成<none>,可以删除,或用docker tag设置TAG # docker tag 860c279d2fec xstar/ubuntu:v1.1 docker images #REPOSITORY TAG IMAGE ID CREATED SIZE #xstar/ubuntu 22.04v1 4641f2e373d7 6 minutes ago 138MB #安装了工具,变大了 #ubuntu 22.04 174c8c134b2a 4 weeks ago 77.9MB
-
用新的镜像创建容器
docker run --rm --name myubuntu3 -t -i xstar/ubuntu:22.04v1
-
查看镜象信息
# 查看image层: docker image inspect -f '{{.RepoTags}}{{"\n"}}{{.RootFS}}' ubuntu:22.04 # [ubuntu:22.04]{layers [sha256:a1360aae5271bbbf575b4057cb4158dbdfbcae76698189b55fb1039bc0207400]} # 我用Dockerfile build后,增加了一层 docker image inspect -f '{{.RepoTags}}{{"\n"}}{{.RootFS}}' xstar/ubuntu:22.04v1 # [192.168.31.40:5000/xstar/ubuntu:22.04v1 xstar/ubuntu:22.04v1]{layers [sha256:a1360aae5271bbbf575b4057cb4158dbdfbcae76698189b55fb1039bc0207400 sha256:81b10e9d742553fdd166a84adae09ded6cde2673112f25316252f566ee839234]} #使用docker history可以看到镜像的构建历史,每一行列出了镜像包含的层。 docker image history ubuntu:22.04 # 合并image层:DockerSquash 或 DockerSlim
Dockerfile技巧
Docker 镜像由很多镜像层(Layers)组成(最多 127 层),镜像层依赖于一系列的底层技术,比如文件系统(filesystems)、写时复制(copy-on-write)、联合挂载(union mounts、AUFS、OverlayFS)等技术。
- 减少构建时间:分层缓存,可大大提高复用率。 - 更小的Docker镜像大小,更少的镜像层,充分利用镜像缓存。 - 存储更少:因为共同的层只需存储一份即可! - 拉取更快:因为分层了,只需拉取本地不存在的层即可! - 运行时存储更少:容器运行时可以共享相同的层! - 提高安全性:因为包含文件少,攻击面减小
-
docker build官方资料
- https://docs.docker.com/develop/develop-images/guidelines/
- Dockerfile reference: https://docs.docker.com/engine/reference/builder/
- https://docs.docker.com/engine/reference/builder/
- https://github.com/docker-library/
-
https://hub.docker.com/_/alpine/
-
sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
-
-
Dockerfile优化技巧
- 利用分层机制优化Docker Image:https://zhuanlan.zhihu.com/p/520315145
- Docker必知必会系列:附录2、Dockerfile 参考及最佳实践:https://www.lixl.cn/books/Docker/appendix2-dockerfile-best-practices/
- Docker 进阶之镜像分层详解: https://developer.aliyun.com/article/981453
- 不要轻易使用 Alpine 镜像来构建 Docker 镜像,有坑!:https://cloud.tencent.com/developer/article/1632733
- 两个奇技淫巧,将 Docker 镜像体积减小 99%: https://mp.weixin.qq.com/s?__biz=MzU1MzY4NzQ1OA==&mid=2247484864&idx=1&sn=1afdc9858ee3aaecc303a7e3e72492bc
- 精简Docker镜像的五种通用方法:https://zhuanlan.zhihu.com/p/42815689