3.3 Docker 镜像使用
Docker 镜像是创建容器的基础模板,理解镜像的使用方法是掌握 Docker 的关键。镜像包含了运行应用所需的代码、库、环境变量和配置文件,用户可以直接使用现成的镜像,也可以基于现有镜像定制自己的镜像。下面以 nginx 为例,详细介绍一下镜像的基本操作。
3.3.1 官方镜像仓库
Docker Hub 是 Docker 官方的公共镜像仓库,提供了大量官方和社区维护的镜像。使用 Docker Hub 需要注册账号。在命令行中可以通过 docker login 命令登录 Docker Hub 账号。
$ 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,对应命令格式为:
$ 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 会从配置的镜像源查找并下载该镜像:
$ 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。
$ docker pull nginx:1.233.3.3 镜像标签
镜像标签是用来标识和管理镜像版本的重要工具。每个镜像可以有多个标签,通常用于区分不同版本或环境。使用 docker tag 命令可以为镜像创建新标签。
以 nginx 镜像为例,默认情况下当我们拉取nginx镜像时,Docker 会自动使用 latest 标签,这表示最新稳定版。在实际开发中,我们需要更精确的控制镜像版本。例如使用下面的命令会将本地的 nginx 镜像标记为 my-nginx:v1,这样就能在项目中明确使用特定版本的镜像。
$ docker tag nginx:latest my-nginx:v13.3.4 推送镜像
要将本地镜像推送到 Docker Hub,需要使用登录的 Docker Hub 用户给镜像打标签。
$ docker tag my-image your_username/my-image:1.0然后使用 docker push 命令推送到 Docker Hub。
$ docker push your_username/my-image:1.03.2.5 查看镜像
- 查看所有镜像列表
下载完成后,对应镜像会存储在本地。通过 docker images 命令可以查看本地已有的镜像列表,这个命令会显示镜像的名称、标签、镜像 ID、创建时间和大小等信息。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 1f94323bafb2 6 days ago 198MB- 查看指定镜像详细信息
如果想要查看某个镜像(比如 nginx)的详细信息,包括创建时间、环境变量、工作目录、暴露的端口等配置信息,可以通过 docker inspect 命令查看,这些信息对于了解镜像的运行方式和配置非常重要。
$ docker inspect nginx如果想要查看镜像的构建历史,则可以通过 docker history 相关命令查看,这个命令会显示镜像每一层的创建命令和大小,帮助理解镜像是如何一步步构建出来的。
$ docker history nginx对于正在运行的容器,可以使用 docker logs 相关命令查看容器的日志输出,这个命令对于排查容器运行问题很有帮助。
$ docker logs nginx3.3.6 查找镜像
镜像的查找可以通过 Docker Hub 网站或命令行完成,使用 docker search 命令能在终端直接搜索公共镜像。比如使用下面命令可以列出所有 MySQL 相关镜像,结果会显示镜像名称、描述、星标数和是否官方认证等信息。官方镜像由 Docker 官方团队维护,通常更可靠安全,建议优先选择带有 "OFFICIAL" 标记的镜像。
$ 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 文件。
$ docker save -o nginx.tar nginx:latest以上命令执行之后,会讲最新的 nginx 镜像保存到当前目录下的 nginx.tar 文件中。这个文件可以复制到其他服务器上。
导出镜像可以使用 docker load 命令。在其他服务器上,通过 docker load -i nginx.tar 命令可以将 nginx.tar 所对应的 nginx 镜像导入到服务器的 Docker 中。
$ 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 删除镜像
- 删除单个镜像
当需要删除不再使用的 Docker 镜像时,可以使用 docker rmi 命令。这个命令需要指定镜像 ID 或镜像名称。比如要删除 nginx,可以使用 docker rmi nginx 命令。
$ 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 命令进行查看。
$ docker rmi 1f94323bafb2- 清除镜像缓存
Docker 使用过程中会积累大量未使用的镜像缓存,占用磁盘空间。通过 docker image prune 命令可以清理这些无用镜像。
不加参数时,这个命令只删除悬空镜像(没有标签且不被任何镜像引用的中间层)。加上 -a 参数会删除所有未被容器或镜像引用的镜像,包括构建缓存和旧版本镜像。
$ 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 环境整洁高效。
$ 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