Featured image of post Docker 常用命令与实战:从入门到精通
运维

Docker 常用命令与实战:从入门到精通

Docker 常用命令与实战:从入门到精通

前言

Docker 已经成为现代开发运维的基础设施。无论是本地开发环境搭建、微服务部署,还是 CI/CD 流水线,Docker 都扮演着核心角色。本文整理了 Docker 最常用的命令和实战技巧。

当前版本:Docker Engine v29.6.0(2026 年 6 月)。containerd 镜像存储已成为默认,Docker Scout 用于供应链安全扫描。

1. 镜像管理

1.1 拉取与查看

# 拉取镜像
docker pull nginx
docker pull nginx:1.25           # 指定版本
docker pull mysql:8.0
docker pull registry.cn-hangzhou.aliyuncs.com/library/nginx  # 阿里云镜像

# 查看本地镜像
docker images
docker images -a                 # 包含中间层镜像
docker images --digests          # 显示摘要
docker images -q                 # 只显示 ID

# 搜索镜像
docker search nginx
docker search --filter=stars=100 nginx  # 按星数过滤

1.2 构建与删除

# 构建镜像
docker build -t myapp:1.0 .
docker build -t myapp:1.0 -f Dockerfile.prod .
docker build -t myapp:1.0 --no-cache .           # 不使用缓存
docker build -t myapp:1.0 --build-arg ENV=prod .  # 传入构建参数

# 删除镜像
docker rmi nginx
docker rmi $(docker images -q)                    # 删除所有镜像
docker image prune                                 # 删除悬空镜像
docker image prune -a                              # 删除未使用的镜像

# 镜像打标签
docker tag myapp:1.0 myregistry.com/myapp:1.0
docker tag myapp:1.0 myregistry.com/myapp:latest

# 推送镜像
docker push myregistry.com/myapp:1.0

# 导出/导入镜像
docker save -o nginx.tar nginx:latest
docker load -i nginx.tar

2. 容器管理

2.1 创建与运行

# 基本运行
docker run nginx
docker run -d nginx                        # 后台运行
docker run --name my-nginx -d nginx        # 指定名称
docker run -d -p 80:80 nginx               # 端口映射
docker run -d -p 8080:80 nginx             # 外部8080 → 容器80
docker run -d -p 127.0.0.1:3306:3306 mysql # 仅本地访问

# 带环境变量
docker run -d -e MYSQL_ROOT_PASSWORD=123456 mysql
docker run -d --env-file .env myapp         # 从文件读取环境变量

# 挂载卷
docker run -d -v /host/path:/container/path nginx
docker run -d -v /data/mysql:/var/lib/mysql mysql
docker run -d -v mydata:/data nginx          # 命名卷
docker run -d -v /host/path:/container/path:ro nginx  # 只读挂载

# 限制资源
docker run -d --memory=512m --cpus=1.5 myapp
docker run -d --memory=1g --cpus=2 myapp

# 重启策略
docker run -d --restart=always nginx         # 总是重启
docker run -d --restart=unless-stopped nginx # 除非手动停止
docker run -d --restart=on-failure:3 myapp   # 失败最多重启3次

# 网络
docker run -d --network=host nginx           # 使用宿主机网络
docker run -d --network=mynet myapp          # 使用自定义网络

# 交互式运行
docker run -it ubuntu /bin/bash              # 进入容器
docker run -it --rm ubuntu /bin/bash         # 退出后自动删除

2.2 查看与操作

# 查看容器
docker ps                                   # 运行中的容器
docker ps -a                                # 所有容器(含已停止)
docker ps -q                                # 只显示 ID
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"

# 查看容器详情
docker inspect my-nginx
docker inspect --format '{{.NetworkSettings.IPAddress}}' my-nginx

# 查看日志
docker logs my-nginx
docker logs -f my-nginx                     # 实时追踪
docker logs --tail 100 my-nginx             # 最后100行
docker logs --since 1h my-nginx             # 最近1小时
docker logs -f --tail 50 my-nginx           # 实时追踪最后50行

# 进入运行中的容器
docker exec -it my-nginx /bin/bash
docker exec -it my-nginx /bin/sh           # Alpine 镜像用 sh
docker exec my-nginx cat /etc/nginx/nginx.conf  # 不进入执行命令

# 复制文件
docker cp file.txt my-nginx:/path/         # 容器 → 宿主机
docker cp my-nginx:/path/file.txt ./       # 宿主机 → 容器

# 停止/启动/重启
docker stop my-nginx
docker stop $(docker ps -q)                # 停止所有容器
docker start my-nginx
docker restart my-nginx

# 删除容器
docker rm my-nginx
docker rm -f my-nginx                      # 强制删除运行中的容器
docker rm $(docker ps -aq)                 # 删除所有容器
docker container prune                     # 删除已停止的容器

# 查看容器资源使用
docker stats
docker stats --no-stream                   # 只显示一次
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"

# 查看容器进程
docker top my-nginx

# 查看端口映射
docker port my-nginx

3. Dockerfile 编写

3.1 常用指令

# 基础镜像
FROM openjdk:17-jdk-slim
FROM node:18-alpine
FROM python:3.11-slim

# 维护者信息
LABEL maintainer="your@email.com"

# 工作目录
WORKDIR /app

# 复制文件
COPY package.json ./
COPY src/ ./src/
COPY --from=builder /app/dist ./dist    # 多阶段构建

# 添加文件(支持 URL 和自动解压)
ADD app.tar.gz /app/
ADD https://example.com/file /app/

# 执行命令
RUN apt-get update && apt-get install -y \
    curl \
    vim \
    && rm -rf /var/lib/apt/lists/*

RUN npm install

# 环境变量
ENV NODE_ENV=production
ENV JAVA_OPTS="-Xmx512m"

# 暴露端口
EXPOSE 8080
EXPOSE 3306 6379

# 启动命令
CMD ["node", "server.js"]
CMD ["java", "-jar", "app.jar"]

# 入口点(不会被 docker run 的参数覆盖)
ENTRYPOINT ["java", "-jar"]
CMD ["app.jar"]  # 默认参数,可被覆盖

# 健康检查
HEALTHCHECK --interval=30s --timeout=3s \
    CMD curl -f http://localhost:8080/health || exit 1

# 卷
VOLUME ["/data"]

# 用户
RUN useradd -r -s /bin/false appuser
USER appuser

3.2 多阶段构建

# 阶段一:构建
FROM maven:3.9-eclipse-temurin-17 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src/ ./src/
RUN mvn package -DskipTests

# 阶段二:运行
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

3.3 最佳实践

# ✅ 合并 RUN 指令减少层数
RUN apt-get update && apt-get install -y \
    curl \
    && rm -rf /var/lib/apt/lists/*

# ✅ 使用 .dockerignore
# .git, node_modules, *.log, .env

# ✅ 把变化频率低的指令放前面(利用缓存)
COPY package.json .     # 先复制依赖文件
RUN npm install         # 安装依赖
COPY . .               # 最后复制源码

# ✅ 使用非 root 用户
RUN addgroup -S app && adduser -S app -G app
USER app

# ✅ 使用 Alpine 镜像减小体积
FROM node:18-alpine

4. 网络管理

# 创建网络
docker network create mynet
docker network create --driver bridge mynet
docker network create --subnet 172.20.0.0/16 mynet

# 查看网络
docker network ls
docker network inspect mynet

# 连接/断开网络
docker network connect mynet my-nginx
docker network disconnect mynet my-nginx

# 删除网络
docker network rm mynet
docker network prune                     # 删除未使用的网络

# 容器间通信(同一网络内可通过容器名访问)
docker run -d --name mysql --network=mynet mysql
docker run -d --name app --network=mynet myapp
# app 容器中可以直接用 mysql:3306 访问数据库

5. 数据卷管理

# 创建卷
docker volume create mydata

# 查看卷
docker volume ls
docker volume inspect mydata

# 删除卷
docker volume rm mydata
docker volume prune                    # 删除未使用的卷

# 使用命名卷
docker run -d -v mydata:/var/lib/mysql mysql

# 绑定挂载(目录映射)
docker run -d -v /host/path:/container/path nginx

# tmpfs 挂载(内存中)
docker run -d --tmpfs /app/cache myapp

6. Docker Compose

6.1 基本语法

# docker-compose.yml
version: '3.8'

services:
  web:
    build: .
    ports:
      - "8080:80"
    environment:
      - NODE_ENV=production
    volumes:
      - ./src:/app/src
    depends_on:
      - db
      - redis
    restart: unless-stopped
    networks:
      - app-net

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
      MYSQL_DATABASE: myapp
    volumes:
      - mysql-data:/var/lib/mysql
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    ports:
      - "3306:3306"
    networks:
      - app-net

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    networks:
      - app-net

volumes:
  mysql-data:

networks:
  app-net:
    driver: bridge

Docker Compose V1(docker-compose)已完全弃用,请使用 V2(docker compose,无连字符)。

6.2 常用命令

# 启动
docker compose up -d                    # 后台启动所有服务
docker compose up -d --build            # 重新构建并启动
docker compose up -d web                # 只启动指定服务

# 停止
docker compose down                     # 停止并删除容器
docker compose down -v                  # 同时删除卷
docker compose down --rmi all           # 同时删除镜像

# 查看
docker compose ps                       # 查看服务状态
docker compose logs                     # 查看日志
docker compose logs -f web              # 实时追踪指定服务日志

# 其他操作
docker compose exec web /bin/bash       # 进入容器
docker compose restart web              # 重启服务
docker compose pull                     # 拉取最新镜像
docker compose config                   # 验证配置文件
docker compose top                      # 查看进程

7. 实战场景

7.1 快速搭建 MySQL

docker run -d \
  --name mysql8 \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -e MYSQL_DATABASE=mydb \
  -e MYSQL_USER=app \
  -e MYSQL_PASSWORD=apppwd \
  -v /data/mysql:/var/lib/mysql \
  --restart=unless-stopped \
  mysql:8.0 \
  --character-set-server=utf8mb4 \
  --collation-server=utf8mb4_unicode_ci

7.2 快速搭建 Redis

docker run -d \
  --name redis \
  -p 6379:6379 \
  -v /data/redis:/data \
  --restart=unless-stopped \
  redis:7-alpine \
  redis-server --appendonly yes --requirepass "mypassword"

7.3 快速搭建 Nginx

docker run -d \
  --name nginx \
  -p 80:80 \
  -p 443:443 \
  -v /data/nginx/conf.d:/etc/nginx/conf.d \
  -v /data/nginx/html:/usr/share/nginx/html \
  -v /data/nginx/ssl:/etc/nginx/ssl \
  --restart=unless-stopped \
  nginx:alpine

7.4 Java 应用部署

docker run -d \
  --name myapp \
  -p 8080:8080 \
  -e JAVA_OPTS="-Xmx512m -Xms256m" \
  -v /data/app/logs:/app/logs \
  -v /data/app/config:/app/config \
  --restart=unless-stopped \
  myapp:1.0

8. 常用技巧

# 清理所有未使用的资源(镜像、容器、网络、卷)
docker system prune -a --volumes
docker system df                         # 查看资源占用

# 批量操作
docker stop $(docker ps -q)              # 停止所有容器
docker rm $(docker ps -aq)               # 删除所有容器
docker rmi $(docker images -q)           # 删除所有镜像

# 查看容器 IP
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-nginx

# 导出/导入容器
docker export my-nginx > nginx.tar
docker import nginx.tar my-nginx:backup

# 查看镜像构建历史
docker history myapp:1.0

# 实时查看容器资源
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}"

# 修改运行中容器的重启策略
docker update --restart=unless-stopped my-nginx

# 查看容器内文件系统变化
docker diff my-nginx

总结

Docker 核心知识点:

  • 镜像管理 — pull/build/tag/push/save/load
  • 容器管理 — run/exec/logs/stop/rm/stats
  • 网络管理 — network create/connect/inspect
  • 数据卷 — volume create/bind mount/tmpfs
  • Dockerfile — 多阶段构建、最佳实践
  • Docker Compose — 多服务编排、依赖管理

掌握这些命令,就能应对 90% 以上的日常 Docker 操作。

使用 Hugo 构建
主题 StackJimmy 设计