Docker 核心命令详解:镜像构建与容器管理
docker commit:从运行容器生成镜像
当需要对现有容器进行修改并保存为可复用的镜像时,docker commit 是常用的命令。它会基于容器当前状态创建一个新的镜像层。
docker commit [OPTIONS] 容器 [仓库名[:标签]]
常用参数说明:
-a或--author:标注镜像作者信息-m或--message:添加提交说明-p或--pause:提交过程中暂停容器(默认开启)-c或--change:应用 Dockerfile 指令修改
实际应用示例:将 ID 为 f8a6b2c9e3d1 的容器打包为新镜像,并附加作者和描述。
$ docker commit -a "devops@company.com" -m "添加了定时任务配置" f8a6b2c9e3d1 webapp:v2.1
sha256:9e2f5c8d3a7b4e1f6c9d0a2b8e4f7c1d5a3b6e9f0c2d4a8b7e1f3c6d9a0b4e2f1
$ docker images webapp:v2.1
REPOSITORY TAG IMAGE ID CREATED SIZE
webapp v2.1 9e2f5c8d3a7b 12 seconds ago 287 MB
docker rmi:清理本地镜像资源
镜像积累过多会占用大量磁盘空间,docker rmi 用于移除不再需要的本地镜像。
docker rmi [OPTIONS] 镜像 [镜像...]
关键参数:
-f或--force:强制删除,即使镜像被容器引用--no-prune:保留未被标签引用的父镜像(默认会清理)
强制删除指定镜像:
$ docker rmi -f myproject/backend:staging
Untagged: myproject/backend:staging
Deleted: sha256:3f7a9e2c5d8b1f4e6a0c9d2b5e8f1a7c4d6b3e9f0a2c8d4b7e1f3a6c9d0b4e2f1
Deleted: sha256:8b1f4e6a0c9d2b5e8f1a7c4d6b3e9f0a2c8d4b7e1f3a6c9d0b4e2f1a7c4d6b3e
docker build:基于 Dockerfile 构建镜像
这是将应用代码标准化打包的核心命令,通过解析 Dockerfile 中的指令序列完成镜像构建。
docker build [OPTIONS] 构建上下文路径 | URL | -
常用构建参数:
| 参数 | 作用说明 |
|---|---|
-t, --tag | 为生成的镜像指定名称和标签 |
-f, --file | 指定非默认路径的 Dockerfile |
--no-cache | 禁用构建缓存,确保全新构建 |
--build-arg | 传递构建时变量 |
--pull | 强制拉取基础镜像最新版本 |
--target | 多阶段构建时指定构建阶段 |
--network | 设置 RUN 指令执行时的网络模式 |
构建示例:
# 使用当前目录 Dockerfile,镜像标记为 api-gateway:1.0
docker build -t api-gateway:1.0 .
# 指定自定义 Dockerfile 路径
docker build -f ./docker/Dockerfile.prod -t api-gateway:prod .
# 从 Git 仓库直接构建
docker build -t demo-app:latest https://github.com/org/demo.git#main
# 带构建参数的复杂示例
docker build \
--build-arg NODE_ENV=production \
--build-arg API_VERSION=3.2 \
--no-cache \
-t frontend:release-v3 .
构建前 Docker 会自动校验 Dockerfile 语法,存在错误时将直接报错:
$ docker build -t test-image .
Sending build context to Docker daemon 4.096 kB
Error response from daemon: Dockerfile parse error line 7: unknown instruction: INSTAL
docker history:追溯镜像构建历程
该命令展示镜像各层的创建信息,便于排查镜像体积膨胀或安全问题。
docker history [OPTIONS] 镜像
查看镜像 myapp/web:v3 的详细构建历史:
$ docker history myapp/web:v3
IMAGE CREATED CREATED BY SIZE COMMENT
7d8f9e3a2b1c 2 hours ago /bin/sh -c #(nop) CMD ["node" "server.js"] 0 B
<missing> 2 hours ago /bin/sh -c npm ci --only=production 45.2 MB
<missing> 2 hours ago /bin/sh -c #(nop) COPY . /app/ 2.1 kB
<missing> 3 days ago /bin/sh -c #(nop) FROM node:18-alpine 0 B
<missing> 3 days ago /bin/sh -c #(nop) ADD file:abc123... in / 176.8 MB
docker run:启动并运行容器
作为最常用的 Docker 命令之一,docker run 负责创建新容器实例并执行指定命令。
docker run [OPTIONS] 镜像 [命令] [参数...]
核心参数分类说明:
运行模式控制
-d, --detach:后台守护运行-i, --interactive:保持标准输入打开-t, --tty:分配伪终端--rm:容器停止后自动删除
网络与端口
-p, --publish:精确映射端口主机端口:容器端口-P, --publish-all:暴露 Dockerfile 中声明的所有端口到随机主机端口--network:指定网络模式(bridge/host/none/自定义网络)
存储与资源
-v, --volume:挂载数据卷-e, --env:设置环境变量-m, --memory:限制内存使用--cpus:限制 CPU 核心数
典型运行场景:
# 后台启动 Nginx,指定容器名称
docker run --name proxy-server -d nginx:alpine
# 交互式进入容器调试
docker run -it --rm ubuntu:22.04 /bin/bash
# 端口映射 + 目录挂载 + 环境变量
docker run -d \
-p 8080:80 \
-v /var/web/logs:/usr/share/nginx/logs \
-e NGINX_WORKER_PROCESSES=4 \
--name web-frontend \
nginx:stable
# 绑定到特定网卡地址
docker run -p 127.0.0.1:3306:3306 -d mysql:8.0
# 使用自定义网络并连接其他容器
docker run -d \
--network backend-net \
--link redis-cache:redis \
--link postgres-db:db \
--name api-worker \
myapp/worker:2.3
docker ps:容器状态查询
用于监控和管理运行中的容器实例,支持丰富的过滤和格式化选项。
docker ps [OPTIONS]
参数速查:
-a, --all:显示所有容器(含已停止)-l, --latest:仅显示最近创建的容器-n, --last:显示最近创建的 N 个-q, --quiet:仅输出容器 ID-s, --size:显示容器总文件大小-f, --filter:按条件筛选(status/expose/name 等)--format:自定义输出模板
实用查询示例:
# 查看所有运行中的容器
$ docker ps
CONTAINER ID IMAGE COMMAND STATUS PORTS NAMES
e7f3a2b9c1d5 redis:7-alpine "docker-entrypoint.s…" Up 2 hours 0.0.0.0:6379->6379/tcp cache-store
a4c8d1e5f7b2 postgres:15 "docker-entrypoint.s…" Up 2 hours 0.0.0.0:5432->5432/tcp user-database
# 获取所有容器 ID(常用于批量操作)
$ docker ps -aq
e7f3a2b9c1d5
a4c8d1e5f7b2
8f2b6c4d9a1e
# 筛选出状态为 exited 的容器
$ docker ps -f status=exited
# 格式化输出容器名称和 IP 地址
$ docker ps --format "table {{.Names}}\t{{.Networks}}"
docker images:本地镜像清单管理
查看和管理本地存储的镜像资源,支持按仓库名过滤。
docker images [OPTIONS] [仓库名[:标签]]
常用选项:
-a, --all:显示中间层镜像--digests:显示镜像摘要-q, --quiet:仅显示镜像 ID--no-trunc:完整显示镜像 ID
查询示例:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
api-gateway 2.1.0 4f8e2c7a9b1d 3 hours ago 156 MB
data-processor latest 9c3d5f8e2a4b 2 days ago 412 MB
<none> <none> 7b1e4f9c3d8a 2 days ago 89 MB
# 只查看指定仓库的镜像
$ docker images api-gateway
REPOSITORY TAG IMAGE ID CREATED SIZE
api-gateway 2.1.0 4f8e2c7a9b1d 3 hours ago 156 MB
api-gateway 2.0.9 2a7b9c4e1f8d 5 days ago 148 MB
容器网络连接基础
容器间通信是微服务部署的关键环节,Docker 提供了多种网络连接机制。最常用的方式是通过自定义网络实现容器互联,相比传统的 --link 参数,自定义网络具有更好的隔离性和 DNS 解析能力。
创建网络并启动互联容器:
# 创建桥接网络
docker network create --driver bridge app-network
# 在自定义网络中启动服务
docker run -d --name user-service --network app-network myapp/users:1.0
docker run -d --name order-service --network app-network myapp/orders:1.0
# 容器间可通过服务名直接通信
docker exec -it order-service ping user-service