特性

Docker 作为一个轻量级的容器化平台,具备以下核心特性:

  • 轻量隔离:容器共享宿主机内核,启动时间在毫秒级,远小于虚拟机。每个容器拥有独立的命名空间(进程、网络、文件系统),资源占用极低。
  • 分层镜像:镜像采用 Union FS 分层存储,一次构建,多次复用。公共的基础镜像层可以被不同容器项目共享,大幅节省存储空间和构建时间。
  • 可移植性:通过 Dockerfile 描述运行环境,保证了“Build once, run anywhere”。开发、测试、生产环境的一致性得到根本保障。
  • 版本控制与回滚:镜像可以像 Git 一样打标签(tag),快速回退到任意历史版本。配合 CI/CD 流水线,实现可靠的金丝雀发布和蓝绿部署。
  • 生态丰富:Docker Hub 拥有数十万公开镜像,涵盖数据库、缓存、消息队列、编程语言运行时等,开发者可以快速搭建复杂的技术栈。

最常用指令

掌握以下指令是使用 Docker 的基础,也是日常开发中出现频率最高的操作。

镜像管理

# 搜索镜像
docker search nginx

# 拉取镜像(默认 latest 标签)
docker pull nginx:1.25

# 列出本地镜像
docker images

# 查看镜像详细信息
docker inspect nginx:1.25

# 删除镜像(需先停止并删除关联容器)
docker rmi nginx:1.25

容器生命周期

# 创建并启动容器(常用参数:-d 后台运行,-p 端口映射,-v 挂载卷,--name 命名)
docker run -d -p 8080:80 --name my-nginx nginx

# 查看运行中的容器
docker ps

# 查看所有容器(包括已停止)
docker ps -a

# 停止容器
docker stop my-nginx

# 启动已停止的容器
docker start my-nginx

# 重启容器
docker restart my-nginx

# 删除容器
docker rm my-nginx

# 强制删除运行中的容器
docker rm -f my-nginx

调试类操作

# 查看容器输出日志(-f 持续跟踪)
docker logs -f my-nginx

# 进入正在运行的容器
docker exec -it my-nginx /bin/bash

# 从宿主机向容器拷贝文件
docker cp ./local.txt my-nginx:/usr/share/nginx/html/

常用指令

除了上述最常用的命令,下面这些指令在应用开发、镜像构建、资源编排等场景中非常实用。

镜像构建与优化

# 使用当前目录下的 Dockerfile 构建镜像,-t 指定标签
docker build -t myapp:v1 .

# 构建时使用 build-arg 传递参数(如版本号)
docker build --build-arg APP_VERSION=1.2.3 -t myapp:v1 .

# 不缓存地重新构建所有层
docker build --no-cache -t myapp:v1 .

# 多阶段构建的典型用法(详见后续技巧)
# 生成镜像后查看构建历史
docker history myapp:v1

网络管理

# 查看现有网络
docker network ls

# 创建自定义网络(推荐 bridge 类型,支持容器间 DNS 解析)
docker network create mynet

# 将容器连接到指定网络
docker network connect mynet my-nginx

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

# 查看网络详情(含连接容器的 IP)
docker network inspect mynet

数据卷与持久化

# 创建命名卷
docker volume create mysql_data

# 启动时挂载命名卷
docker run -d -v mysql_data:/var/lib/mysql --name mysql mysql:8

# 绑定挂载宿主机目录(常用于开发环境热更新)
docker run -d -v /host/path:/container/path myapp

# 查看卷列表
docker volume ls

# 删除无用卷(慎用)
docker volume prune

Docker Compose(多容器编排)

# docker-compose.yml 示例
version: "3"
services:
  web:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - .:/app
    depends_on:
      - db
  db:
    image: postgres:15
    environment:
      POSTGRES_PASSWORD: example
    volumes:
      - pgdata:/var/lib/postgresql/data
volumes:
  pgdata:

常用 Compose 命令:

# 启动所有服务(-d 后台运行)
docker-compose up -d

# 重新构建并启动
docker-compose up --build -d

# 查看运行状态
docker-compose ps

# 查看日志
docker-compose logs -f web

# 停止并移除服务、网络
docker-compose down

# 同时删除数据卷(谨慎)
docker-compose down -v

常见用法和技巧

下面总结一些提升开发效率和容器性能的实战技巧。

1. 多阶段构建减小镜像体积

对于 Go、Java 等需要编译的语言,分离构建环境和运行环境可以显著减小镜像尺寸。

# 第一阶段:构建可执行文件
FROM golang:1.21 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o main .

# 第二阶段:最小化运行镜像
FROM alpine:3.18
RUN apk add --no-cache ca-certificates
WORKDIR /app
COPY --from=builder /app/main .
EXPOSE 8080
CMD ["./main"]

最终镜像仅包含二进制文件和最小的运行时库,体积从 800MB 降至约 15MB。

2. 更快的容器“内执行”方式

如果只需要在容器内执行单个命令,不需要进入完整 Shell:

# 执行单条命令并退出
docker exec my-nginx ls /usr/share/nginx/html/

# 使用 --rm 创建一个一次性容器,任务结束自动删除
docker run --rm -v $(pwd):/data alpine tar -czf /data/archive.tar.gz /data/src

3. 灵活使用环境变量文件

避免在命令行暴露敏感信息,推荐使用 --env-file:

# .env 文件内容
DB_PASSWORD=secret123
API_KEY=abcdef

# 启动容器时加载
docker run -d --env-file ./.env myapp

4. 定期清理磁盘空间

Docker 会在 /var/lib/docker 积累无用镜像、容器、卷和构建缓存,定期清理很有必要。

# 一键删除所有停止的容器、未使用的网络、悬空镜像和构建缓存
docker system prune -a --volumes

# 查看磁盘占用详情
docker system df

建议将清理命令设置为定时任务,但确保不在生产环境误删正在使用的对象。

5. 利用 Alias 提升命令效率

在 ~/.bashrc 或 ~/.zshrc 中添加别名:

alias d='docker'
alias dps='docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"'
alias dcu='docker-compose up -d'
alias dcd='docker-compose down'

这样可以用 dps 快速查看关键信息,省去冗长的参数。

6. 端口映射的最佳实践

  • 仅在必要时将端口映射到宿主机的 0.0.0.0,可使用 127.0.0.1:8080:80 绑定到本地回环,提高安全性。
  • 使用 -p 8080-8082:80 批量映射一段端口。

7. 镜像加速与私有仓库

国内用户可配置镜像加速器(如阿里云、华为云),编辑 /etc/docker/daemon.json:

{
  "registry-mirrors": ["https://your-id.mirror.aliyuncs.com"]
}

重启 Docker 服务生效。

8. 使用健康检查增强容器可靠性

HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
  CMD curl -f http://localhost/ || exit 1

启用健康检查后,docker ps 会显示健康状态,配合编排工具可自动重启不健康的容器。

掌握以上常用指令和实战技巧,能够大幅提升容器化开发与运维的流畅度。在实际项目中不断实践,你还会发现更多 Docker 的巧妙用法。

更多推荐