了解 Docker 镜像

获取镜像

格式

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

NAME 是镜像仓库名称(用来区分镜像),TAG 是镜像的标签(往往用来表示版本信息)。若不指定 TAG 则默认选择 latest,即最新版本。

在获取镜像前可以查询是否存在对应的镜像。

# docker search [OPTIONS] TERM
docker search ubuntu

镜像信息

1. 所有镜像概览

docker images

REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
nginx                 v2                  c7e8f4f26fef        About an hour ago   132MB
nginx                 latest              0901fa9da894        9 days ago          132MB

# `REPOSITORY` 来自于哪个仓库,比如ubuntu表示ubuntu系列的基础镜像
# `TAG` 镜像的标签信息,比如18.04、latest表示不同的版本信息。标签只是标记,并不能标识镜像内容
# `IMAGE ID` 镜像的ID(唯一标识镜像),如果两个镜像的ID相同,说明它们实际上指向了同一个镜像,只是具有不同标签名称而已
# `CREATED` 创建时间,说明镜像最后的更新时间
# `SIZE` 镜像大小,优秀的镜像往往体积都较小

2. 指定镜像详细

# docker inspect [OPTIONS] NAME|ID [NAME|ID...]
docker inspect ubuntu:latest

3. 镜像历史

镜像文件是由多个层组成,可查看每个层的创建信息。

# docker history [OPTIONS] IMAGE
docker history ubuntu:latest

创建镜像

创建镜像的方法主要有三种:基于已有镜像的内容创建(commit)、基于本地模板导入(import)、基于 Dockerfile 创建(build)。

1. 已有容器

# docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
# 对一个镜像进行修改后
docker commit -m "修改了默认首页" webserver nginx:new

# 验证
docker images

2. 本地模板

# docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
docker import http://example.com/exampleimage.tgz
docker import /path/to/exampleimage.tgz
# 还可以利用 `STDIN`
cat exampleimage.tgz | docker import - exampleimagelocal:new

# 验证
docker images

3. Dockerfile

Dockerfile 是一个文本文件,利用给定的指令描述基于某个父镜像创建新镜像的过程。

FROM ubuntu:18.04
COPY . /app
RUN make /app
CMD python /app/app.py
# docker build [OPTIONS] PATH | URL | -
docker build https://github.com/creack/docker-firefox
docker build -t nginx:ttt

修改镜像

1. 添加镜像标签

仅添加镜像标签,实际 IMAGE ID 指向同一个。

docker tag ubuntu:latest myubuntu:latest

2. 删除镜像

需注意 docker rmi 才是删除镜像,而 docker rm 是删除容器。

# docker rmi [OPTIONS] IMAGE [IMAGE...]
docker rmi ubuntu:latest
# Error response from daemon: conflict: unable to remove repository reference "ubuntu:latest" (must force) - container b0f36e5ede8d is using its referenced image adafef2e596e

# 正在使用中,需要先解除容器
docker rm b0f36e5ede8d
# 解除后再删除镜像,删除镜像还可以使用 `IMAGE ID`
docker rmi adafef2e596e

批量删除镜像:

# 以删除 harbor 镜像示例
docker rmi $(docker images | grep 'goharbor' | awk '{print $3}')

3. 清理镜像

系统中可能会遗留一些临时的镜像文件。

docker image prune [OPTIONS]

分享镜像

1. save

docker images # 列出镜像

# docker save [OPTIONS] IMAGE [IMAGE...]
docker save -o ubuntu_18.04.tar ubuntu:18.04

2. load

# docker load [OPTIONS]
docker load -i ubuntu_18.04.tar

3. Hub

还可以直接分享到 Docker Hub 公共仓库,这需要在官网注册帐号。

# 模拟 nginx 打个新 tag
docker tag nginx:latest username/nginx:latest
# push
docker push username/nginx:latest

Docker slim 优化镜像

首先需要获取 Docker Slimopen in new window

# 下载
curl -L -o ds.tar.gz https://downloads.dockerslim.com/releases/1.37.0/dist_linux.tar.gz

# 解压
tar -xvf ds.tar.gz

# 移动到 bin
mv dist_linux/docker-slim /usr/local/bin/
mv dist_linux/docker-slim-sensor /usr/local/bin/

# 校验
docker-slim --version
# docker-slim version linux|Transformer|1.37.0|70cc8acfcb733161ce7e685b81ad6c172643c222|2021-09-23_09:23:43AM

# 或者直接使用脚本
curl -sL https://raw.githubusercontent.com/docker-slim/docker-slim/master/scripts/install-dockerslim.sh | sudo -E bash -

Node 镜像优化大小

# 查看原大小
docker images | grep node
# node_app                     1.0.0               3fe14ce78d6d        1 months ago        593MB

# docker slim
docker-slim build --target node_app:1.0.0 --tag node_app:1.0.0-slim --http-probe=false

# 再次查看,发现显著缩小
docker images | grep node
# node_app                     1.0.0-slim          061aa2d584d0        19 seconds ago      84.4MB
# node_app                     1.0.0               3fe14ce78d6d        6 months ago        593MB