Skip to content

3.3 Docker 镜像使用

Docker 镜像是创建容器的基础模板,理解镜像的使用方法是掌握 Docker 的关键。镜像包含了运行应用所需的代码、库、环境变量和配置文件,用户可以直接使用现成的镜像,也可以基于现有镜像定制自己的镜像。下面以 nginx 为例,详细介绍一下镜像的基本操作。

3.3.1 官方镜像仓库

Docker Hub 是 Docker 官方的公共镜像仓库,提供了大量官方和社区维护的镜像。使用 Docker Hub 需要注册账号。在命令行中可以通过 docker login 命令登录 Docker Hub 账号。

shell
$ 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: your_username
Password: 
Login Succeeded

登录后可以拉取和推送镜像。

3.3.2 拉取镜像

获取镜像最常用的方法是从 Docker Hub 或其他镜像仓库下载。Docker Hub 是 Docker 官方的公共镜像仓库,提供了大量官方和社区维护的镜像。从 Docker 镜像仓库获取镜像的命令是 docker pull,对应命令格式为:

shell
$ docker pull [OPTIONS] NAME[:TAG|@DIGEST]
  • OPTIONS(可选):选项参数。

    • --all-tags, -a:下载指定镜像的所有标签。
    • --disable-content-trust:跳过镜像签名验证。
  • NAME:镜像名称,通常包含注册表地址(比如 docker.io/library/ubuntu),不带注册表地址则默认从 Docker Hub 进行拉取。

  • TAG(可选):镜像标签,默认为 latest

  • DIGEST(可选):镜像的 SHA256 摘要。

下载最新的 nginx 镜像可以运行 docker pull nginx 命令,Docker 会从配置的镜像源查找并下载该镜像:

shell
$ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
16c9c4a8e9ee: Pull complete
de29066b274e: Pull complete
2cf157fc31fe: Pull complete
450968563955: Pull complete
9b14c47aa231: Pull complete
fd8a9ced9846: Pull complete
c96c7b918bd5: Pull complete
Digest: sha256:5ed8fcc66f4ed123c1b2560ed708dc148755b6e4cbd8b943fab094f2c6bfa91e
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

What's next:
    View a summary of image vulnerabilities and recommendations → docker scout quickview nginx

如果想下载特定版本的镜像,可以在镜像名后加上标签,比如下载 1.23 版本的 nginx。

shell
$ docker pull nginx:1.23

3.3.3 镜像标签

镜像标签是用来标识和管理镜像版本的重要工具。每个镜像可以有多个标签,通常用于区分不同版本或环境。使用 docker tag 命令可以为镜像创建新标签。

以 nginx 镜像为例,默认情况下当我们拉取nginx镜像时,Docker 会自动使用 latest 标签,这表示最新稳定版。在实际开发中,我们需要更精确的控制镜像版本。例如使用下面的命令会将本地的 nginx 镜像标记为 my-nginx:v1,这样就能在项目中明确使用特定版本的镜像。

shell
$ docker tag nginx:latest my-nginx:v1

3.3.4 推送镜像

要将本地镜像推送到 Docker Hub,需要使用登录的 Docker Hub 用户给镜像打标签。

shell
$ docker tag my-image your_username/my-image:1.0

然后使用 docker push 命令推送到 Docker Hub。

shell
$ docker push your_username/my-image:1.0

3.2.5 查看镜像

  1. 查看所有镜像列表

下载完成后,对应镜像会存储在本地。通过 docker images 命令可以查看本地已有的镜像列表,这个命令会显示镜像的名称、标签、镜像 ID、创建时间和大小等信息。

shell
$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
nginx        latest    1f94323bafb2   6 days ago   198MB
  1. 查看指定镜像详细信息

如果想要查看某个镜像(比如 nginx)的详细信息,包括创建时间、环境变量、工作目录、暴露的端口等配置信息,可以通过 docker inspect 命令查看,这些信息对于了解镜像的运行方式和配置非常重要。

shell
$ docker inspect nginx

如果想要查看镜像的构建历史,则可以通过 docker history 相关命令查看,这个命令会显示镜像每一层的创建命令和大小,帮助理解镜像是如何一步步构建出来的。

shell
$ docker history nginx

对于正在运行的容器,可以使用 docker logs 相关命令查看容器的日志输出,这个命令对于排查容器运行问题很有帮助。

shell
$ docker logs nginx

3.3.6 查找镜像

镜像的查找可以通过 Docker Hub 网站或命令行完成,使用 docker search 命令能在终端直接搜索公共镜像。比如使用下面命令可以列出所有 MySQL 相关镜像,结果会显示镜像名称、描述、星标数和是否官方认证等信息。官方镜像由 Docker 官方团队维护,通常更可靠安全,建议优先选择带有 "OFFICIAL" 标记的镜像。

shell
$ docker search mysql
NAME                   DESCRIPTION                                      STARS     OFFICIAL
mysql                  MySQL is a widely used, open-source relation…   15752     [OK]
bitnami/mysql          Bitnami container image for MySQL                133
circleci/mysql         MySQL is a widely used, open-source relation…   31
bitnamicharts/mysql    Bitnami Helm chart for MySQL                     0
cimg/mysql                                                              3
ubuntu/mysql           MySQL open source fast, stable, multi-thread…   67
……

3.3.7 镜像的导出和导入

在开发过程中,经常需要将 Docker 镜像从一个环境迁移到另一个环境。比如开发完成后,需要将测试通过的镜像部署到生产服务器,但生产服务器可能无法直接访问互联网下载镜像。这时可以使用镜像导出和导入功能。导出镜像使用 docker save命令,这个命令会把镜像及其所有层打包成一个 tar 文件。

shell
$ docker save -o nginx.tar nginx:latest

以上命令执行之后,会讲最新的 nginx 镜像保存到当前目录下的 nginx.tar 文件中。这个文件可以复制到其他服务器上。

导出镜像可以使用 docker load 命令。在其他服务器上,通过 docker load -i nginx.tar 命令可以将 nginx.tar 所对应的 nginx 镜像导入到服务器的 Docker 中。

shell
$ docker load -i nginx.tar
c9b18059ed42: Loading layer [==================================================>]  100.2MB/100.2MB
cbd8457b9f28: Loading layer [==================================================>]  101.6MB/101.6MB
c648e944b17e: Loading layer [==================================================>]  3.584kB/3.584kB
966bd022be40: Loading layer [==================================================>]  4.608kB/4.608kB
b422fd70039f: Loading layer [==================================================>]   2.56kB/2.56kB
486cd1e5e3be: Loading layer [==================================================>]   5.12kB/5.12kB
cbaa47f9fe15: Loading layer [==================================================>]  7.168kB/7.168kB
Loaded image: nginx:latest

导入后使用 docker images 命令可以看到 nginx 镜像已经存在。

3.3.8 删除镜像

  1. 删除单个镜像

当需要删除不再使用的 Docker 镜像时,可以使用 docker rmi 命令。这个命令需要指定镜像 ID 或镜像名称。比如要删除 nginx,可以使用 docker rmi nginx 命令。

shell
$ docker rmi nginx
Untagged: nginx:latest
Deleted: sha256:1f94323bafb2ac98d25b664b8c48b884a8db9db3d9c98921b3b8ade588b2e676
Deleted: sha256:ca37bdd8ff5f2cbccaea502aa62460940bd5a2500a9fce4e931964e05a5f2ece
Deleted: sha256:2775bcda3310ca958798e032824be2d7a383c61cc4415c9ffd906be40eeab511
Deleted: sha256:c52a77a0a626e1e81d52b4ee7479be288a7b5430103e8caf99ea71c690084a41
Deleted: sha256:8f2e09717443cb341c6811b420d0d5129c92a1f2ec3af4795c0cdaf9d8f6ccdc
Deleted: sha256:58969d76cbbc7255c4f86d6c39a861f2e56e58c9f316133f988b821a9205bf32
Deleted: sha256:b4e77298dcd6ddc409f7e8d0ae3ccd9fe141f8844fd466ecf44dc927d9030ae6
Deleted: sha256:c9b18059ed426422229b2c624582e54e7e32862378c9556b90a99c116ae10a04

当镜像有多个标签时,删除一个标签只会移除该标签引用,不会真正删除镜像数据,需要使用 docker rmi 加上镜像 ID 才能彻底删除镜像文件。镜像 ID 可以通过 docker images 命令进行查看。

shell
$ docker rmi 1f94323bafb2
  1. 清除镜像缓存

Docker 使用过程中会积累大量未使用的镜像缓存,占用磁盘空间。通过 docker image prune 命令可以清理这些无用镜像。

不加参数时,这个命令只删除悬空镜像(没有标签且不被任何镜像引用的中间层)。加上 -a 参数会删除所有未被容器或镜像引用的镜像,包括构建缓存和旧版本镜像。

shell
$ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B

在执行清理前应该先用 docker images 查看镜像列表,确认哪些镜像可以删除。删除操作不可逆,重要的镜像需要提前备份。

清理完成后可以用 docker system df 查看磁盘使用情况,确认空间已经释放。定期清理镜像缓存能有效节省存储空间,保持 Docker 环境整洁高效。

shell
$ docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          1         0         197.7MB   197.7MB (100%)
Containers      0         0         0B        0B
Local Volumes   2         0         41.46MB   41.46MB (100%)
Build Cache     46        0         300.5MB   300.5MB