Docker 命令完全指南

Docker 是什么

Docker 是一个开源的容器化平台,它把应用及其运行环境打包成轻量、可移植的容器镜像。镜像在任意安装了 Docker 的主机上都能以一致的方式运行,解决了"在我机器上能跑"的经典问题。

核心概念:

  • 镜像(Image):只读模板,包含运行应用所需的文件系统、依赖和配置。
  • 容器(Container):镜像的运行实例,具有独立的进程、网络和文件系统视图。
  • 仓库(Registry):存储和分发镜像的服务,Docker Hub 是默认公共仓库。

为什么要用 Docker

  • 环境一致性:开发、测试、生产使用同一镜像,避免环境差异。
  • 快速交付:秒级启动、分钟级构建,适合 CI/CD 流水线。
  • 资源隔离:进程、网络和文件系统隔离,提高安全性。
  • 弹性扩展:结合编排工具(如 Docker Compose、Kubernetes)可以快速扩容。
  • 节省资源:容器共享宿主机内核,比虚拟机更轻量。

镜像操作常用命令

# 在 Docker Hub 搜索镜像
docker search nginx

# 拉取指定标签镜像
docker pull nginx:alpine

# 查看本地镜像列表
docker images

# 给镜像打标签
docker tag nginx:alpine myregistry/nginx:1.0

# 删除镜像
docker rmi nginx:alpine

# 构建镜像(Dockerfile 所在目录)
docker build -t myapp:1.0 .

# 推送镜像到仓库
docker push myregistry/nginx:1.0

容器操作常用命令

# 以后台方式运行容器
docker run -d -p 80:80 --name web nginx:alpine

# 查看运行中容器
docker ps

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

# 启动 / 停止 / 重启容器
docker start web
docker stop web
docker restart web

# 删除容器
docker rm web

# 查看容器日志
docker logs -f web

# 进入容器执行命令
docker exec -it web /bin/sh

# 查看容器详细信息
docker inspect web

常用参数详解

参数 说明 示例
-d 后台运行(detached) docker run -d nginx
-p 端口映射,主机端口:容器端口 -p 8080:80
-v 挂载数据卷,主机路径:容器路径 -v /data:/app/data
--name 为容器指定名称 --name web
--restart 重启策略:noon-failurealwaysunless-stopped --restart unless-stopped
-e 设置环境变量 -e TZ=Asia/Shanghai
--network 指定容器网络 --network bridge
--rm 停止后自动删除容器 docker run --rm hello-world
-u 指定运行用户 -u 1000:1000
-w 设置工作目录 -w /app
--privileged 授予容器扩展权限,生产环境慎用 --privileged

Dockerfile 编写基础

Dockerfile 是构建镜像的脚本。常用指令:

  • FROM:指定基础镜像。
  • RUN:执行命令并提交为镜像层。
  • COPY / ADD:拷贝文件到镜像。
  • WORKDIR:设置工作目录。
  • ENV:设置环境变量。
  • EXPOSE:声明容器监听端口。
  • CMD:容器启动时默认执行的命令。
  • ENTRYPOINT:配置容器启动入口,常与 CMD 配合。
# Dockerfile
FROM node:20-alpine

WORKDIR /app

COPY package*.json ./
RUN npm ci --only=production

COPY . .

EXPOSE 3000

CMD ["node", "server.js"]

构建命令:

docker build -t my-node-app:1.0 .

Docker Compose 入门示例

Docker Compose 使用 YAML 文件定义多容器应用,一条命令即可启动整套服务。

# docker-compose.yml
services:
  web:
    image: nginx:alpine
    container_name: web
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html:ro
    restart: unless-stopped

  app:
    build: ./app
    container_name: app
    environment:
      - NODE_ENV=production
      - DB_HOST=db
    depends_on:
      - db

  db:
    image: postgres:16-alpine
    container_name: db
    environment:
      - POSTGRES_USER=app
      - POSTGRES_PASSWORD=secret
      - POSTGRES_DB=mydb
    volumes:
      - db_data:/var/lib/postgresql/data
    restart: unless-stopped

volumes:
  db_data:

启动与常用命令:

# 前台启动
docker compose up

# 后台启动
docker compose up -d

# 停止并删除容器
docker compose down

# 查看服务日志
docker compose logs -f

# 重启某个服务
docker compose restart app

实用技巧与常见问题

1. 清理无用资源

# 删除所有停止的容器
docker container prune

# 删除悬空镜像
docker image prune

# 删除未使用数据卷
docker volume prune

# 一键清理
docker system prune -a

2. 查看资源占用

docker system df
docker stats

3. 拷贝文件到容器或宿主机

docker cp web:/etc/nginx/nginx.conf ./nginx.conf
docker cp ./local.conf web:/etc/nginx/conf.d/

4. 容器时区问题

docker run -e TZ=Asia/Shanghai ...

5. 日志过大

# 限制单个容器日志大小
docker run --log-opt max-size=10m --log-opt max-file=3 ...

6. 非 root 运行

RUN useradd -u 1000 -m appuser
USER appuser

7. 如何进入没有 bash 的镜像

docker exec -it web /bin/sh

8. 端口被占用

检查宿主机端口是否被占用,改用 -p 8080:80 等未被占用端口。

9. 容器无法访问外网

确认宿主机网络正常,必要时使用 --network host 临时排查(Linux 限定)。

10. 构建缓存

善用 RUN 分层顺序,将不常变化的依赖放在前面,可以显著减少构建时间。

评论

评论功能基于 Giscus(GitHub Discussions)——在 repo 启用 Discussions 后,到 giscus.app 获取仓库 ID 填入 src/_data/site.json 即可启用。