一、镜像(image)
获取镜像的常用的两种方法:
1. 从docker Hub上面获取
# 拉取最新版(latest 标签)
docker pull nginx
# 拉取指定标签版本
docker pull node:22.12.0
# 拉取完整镜像名(含仓库地址)
docker pull docker.io/library/ubuntu:22.04
# 拉取私有仓库镜像
docker pull myregistry.com/myapp:v1.0
2. 自定义生成镜像
在自己的项目中创建一个 DockerFile,然后执行以下命令创建一个镜像:
docker image build -it pro-name .
当你使用 FROM 指令构建镜像时,若本地没有对应基础镜像,Docker 会自动从配置的仓库拉取:
FROM node:22.12.0 # 如果本地没有,build 时自动 pull
3. image相关命令介绍
3.1 docker image ls —— 列出本地镜像
# 基本列出
docker image ls
# 只显示镜像 ID
docker image ls -q
# 过滤:只显示 dangling(悬空)镜像
docker image ls -f "dangling=true"
# 按名称过滤
docker image ls node
# 格式化输出(如只显示名称和创建时间)
docker image ls --format "table {{.Repository}}\t{{.Tag}}\t{{.CreatedAt}}"
📌 悬空镜像(dangling) :没有标签且未被任何容器引用的中间层镜像,通常由构建过程产生。
3.2 docker image pull —— 拉取镜像
# 拉取最新版
docker image pull nginx
# 拉取指定版本
docker image pull redis:7.2-alpine
# 拉取多平台镜像(需启用实验特性)
docker image pull --platform linux/arm64 alpine
3.3 docker image rm —— 删除镜像
# 删除单个镜像(通过名称或 ID)
docker image rm nginx:latest
# 强制删除(即使被容器引用)
docker image rm -f <IMAGE_ID>
# 删除多个镜像
docker image rm ubuntu:22.04 alpine
# 删除所有悬空镜像
docker image rm $(docker image ls -f "dangling=true" -q)
3.4 docker image build —— 构建镜像
# 从当前目录的 Dockerfile 构建
docker image build -t myapp:v1 .
# 指定 Dockerfile 路径
docker image build -f ./deploy/Dockerfile -t myapp:test .
# 不使用缓存
docker image build --no-cache -t myapp:nc .
# 构建时传递构建参数
docker image build --build-arg NODE_ENV=production -t myapp:prod .
3.5 docker image tag —— 打标签(创建别名)
# 给镜像添加新标签(不复制数据,只是引用)
docker image tag myapp:v1 registry.example.com/myapp:latest
# 示例:准备推送私有仓库
docker image tag nginx:alpine my-registry/nginx:web-v1
3.6 docker image inspect —— 查看镜像详细信息
# 查看完整元数据(JSON 格式)
docker image inspect nginx
# 只获取镜像 ID
docker image inspect --format='{{.Id}}' nginx
# 获取暴露的端口
docker image inspect --format='{{.Config.ExposedPorts}}' nginx
# 获取环境变量
docker image inspect --format='{{.Config.Env}}' node
3.7 docker image history —— 查看构建历史(层)
# 显示每层的指令、大小、创建时间
docker image history nginx
# 不截断输出
docker image history --no-trunc nginx
📊 有助于分析镜像体积来源和优化 Dockerfile。
3.8 docker image prune —— 清理无用镜像
# 删除所有悬空镜像(默认)
docker image prune
# 同时删除所有未被使用的镜像(谨慎!)
docker image prune -a
# 自动确认(无需交互)
docker image prune -f
# 删除超过 24 小时未使用的镜像
docker image prune -a --filter "until=24h"
✅ 定期执行可释放磁盘空间。
3.9 docker image save / load —— 导出/导入镜像
导出(保存为 tar)
# 保存单个镜像
docker image save -o myapp.tar myapp:v1
# 保存多个镜像到一个文件
docker image save -o all.tar nginx:alpine redis:7 ubuntu:22.04
导入(从 tar 加载)
docker image load -i myapp.tar
🔄 适用于离线部署、备份、跨机器迁移。
二、容器(container)
1. docker container ls —— 列出容器
# 列出所有正在运行的容器
docker container ls
# 列出所有容器(包括停止的)
docker container ls -a
# 只显示容器 ID
docker container ls -q
# 格式化输出(如只显示容器ID和状态)
docker container ls --format "table {{.ID}}\t{{.Status}}"
2. docker container run —— 创建并启动容器
# 运行一个交互式的终端容器
docker container run -it ubuntu /bin/bash
# 在后台运行容器,并映射端口
docker container run -d -p 80:80 nginx
# 指定名称运行容器
docker container run --name myapp -d app_image
# 使用卷挂载数据
docker container run -v /host/path:/container/path myimage
docker container run 参数说明:
-
-d:后台运行; -
-p:端口映射8000:80 (先外后内,宿主机8000端口,映射容器的80端口)
-
-v:挂载卷;第一种方式:绑定挂载
-v 宿主机的目录:容器目录容器、宿主机的文件的修改,会相互同步;目的是 数据的持久化保存,防止删除容器时数据被删除
还有一种方式,创建一个存储空间(命名卷);命名卷挂载
-v 卷的名字:容器目录 -
--name:指定容器名(在宿主机上必须是唯一的) -
-e:环境变量 -
-it: -
--rm:退出时删除容器 -
--restartsalways:只要容器停止了就会重启
unless-stopped:和always相似,不过手动停止的不会重启,生产环境特别有用
如何使用命名卷挂载
# 创建命名卷
docker volume create demo-html
# 使用命名卷 创建容器
docker container run -v demo-html:/container/path myimage
# 命名卷 在宿主机的目录在哪里? 执行以下命令可以查看文件所在地址
# 注意:如果你是mac、windows本地测试,无法找到文件地址,应为不存在该地址:
# Docker 实际上是在一个隐藏的 Linux 虚拟机里运行的。因此,像 /var/lib/docker/volumes/... 这样的路径只存在于那个虚拟机内部,无法直接从 macOS 的 Finder 或终端访问
docker volume inspect demo-html
3. docker container start/stop/restart —— 控制容器状态
# 启动已存在的容器
docker container start my_container_id_or_name
# 停止运行中的容器
docker container stop my_container_id_or_name
# 重启容器
docker container restart my_container_id_or_name
# 强制停止容器(立即终止)
docker container stop -t 0 my_container_id_or_name
4. docker container rm —— 删除容器
# 删除一个已停止的容器
docker container rm my_container_id_or_name
# 强制删除一个运行中的容器
docker container rm -f my_container_id_or_name
# 删除所有已停止的容器
docker container rm $(docker container ls -aq -f status=exited)
5. docker container exec —— 在运行中的容器内执行命令
# 在运行中的容器中打开一个新的交互式shell
docker container exec -it my_container_id_or_name /bin/bash
# 执行单个命令(例如更新包列表)
docker container exec my_container_id_or_name apt-get update
6. docker container inspect —— 查看容器详细信息
# 查看容器的所有元数据(JSON格式)
docker container inspect my_container_id_or_name
# 只获取特定信息(如 IP 地址)
docker container inspect --format='{{.NetworkSettings.IPAddress}}' my_container_id_or_name
7. docker container logs —— 获取容器日志
# 查看容器的日志
docker container logs my_container_id_or_name
# 实时查看日志(类似 tail -f)
docker container logs -f my_container_id_or_name
# 显示最近的 n 行日志
docker container logs --tail 10 my_container_id_or_name
8. docker container prune —— 清理停止的容器
# 删除所有已停止的容器
docker container prune
# 自动确认(无需交互)
docker container prune -f
三、docker compose
它就是一个统一管理多个容器的工具; 例如你本地需要启动多个docker 容器,你是不是需要一个一个的去启动,特别麻烦; docker compose就是为了解决这个问题,你只需要一个docker-compose.yaml配置文件,就可以一个命令启动、管理多个容器;
非常适合本地开发时使用;
写一个最简单的配置:
services:
web:
image: web
ports:
- 8000:8000
启动一个名为web的镜像,端口映射 8000;
1. services
- 每个服务对应一个容器。
- 服务名(如
web、db)会自动成为该容器在自定义网络中的主机名(其他服务可通过http://web访问)。
2. 常用字段说明:
| 字段 | 说明 |
|---|---|
image | 使用的镜像(如 nginx, redis:7) |
build | 从 Dockerfile 构建(代替 image) |
ports | 端口映射,格式:宿主机端口:容器端口 |
volumes | 挂载卷或绑定挂载(bind mount) |
environment | 设置环境变量 |
env_file | 从文件加载环境变量(如 .env) |
depends_on | 启动顺序依赖(⚠️ 不保证服务“就绪”,仅控制启动顺序) |
networks | 自定义网络(默认所有服务在同一网络) |
restart | 重启策略(如 unless-stopped) |
这些字段其实就是对应 docker container run 参数 的参数,例如 -e 对应 environment、-v对应volumes等
3. 常用命令
| 命令 | 说明 |
|---|---|
docker compose up | 启动所有服务(前台运行) |
docker compose up -d | 后台运行 |
docker compose down | 停止并删除容器、网络(默认不删卷) |
docker compose down -v | 同时删除卷(⚠️ 数据会丢失!) |
docker compose ps | 查看服务状态 |
docker compose logs -f web | 实时查看 web 服务日志 |
docker compose exec db psql -U user myapp | 进入 db 容器执行命令 |
docker compose build | 重新构建 build 定义的服务 |
docker compose config | 验证并查看最终配置 |