--- title: Docker 容器化部署指南 tags: - Docker - DevOps - 容器化 - Linux created: 2026-04-21 --- # Docker 容器化部署指南 ## 核心概念 | 概念 | 说明 | |------|------| | **镜像(Image)** | 只读模板,包含运行应用所需的文件系统 | | **容器(Container)** | 镜像的运行实例,类似轻量级虚拟机 | | **仓库(Registry)** | 存储和分发镜像的服务(Docker Hub、GHCR) | | **Dockerfile** | 定义镜像构建步骤的脚本 | ## 常用命令 ### 镜像操作 ```bash # 查看本地镜像 docker images # 拉取镜像 docker pull nginx:latest # 构建镜像 docker build -t myapp:1.0 . # 删除镜像 docker rmi myapp:1.0 # 推送镜像 docker push myrepo/myapp:1.0 ``` ### 容器操作 ```bash # 运行容器 docker run -d --name myapp -p 8080:80 nginx # 查看运行中的容器 docker ps # 查看所有容器(包括停止的) docker ps -a # 停止/启动容器 docker stop myapp docker start myapp # 进入容器 docker exec -it myapp /bin/bash # 查看日志 docker logs -f myapp # 删除容器 docker rm myapp ``` ### Docker Compose ```bash # 启动服务 docker compose up -d # 查看服务状态 docker compose ps # 重启服务 docker compose restart # 查看日志 docker compose logs -f # 停止服务 docker compose down # 重新构建并启动 docker compose up -d --build ``` ## Dockerfile 最佳实践 ```dockerfile # 1. 使用多阶段构建减小镜像体积 FROM node:20-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY . . RUN npm run build # 2. 生产镜像使用非 root 用户 FROM node:20-alpine AS production WORKDIR /app COPY --from=builder /app/dist ./dist COPY --from=builder /app/node_modules ./node_modules USER node EXPOSE 3000 CMD ["node", "dist/index.js"] # 3. 使用 .dockerignore 排除不必要的文件 # .git # node_modules # *.log # .env ``` ## 常用 Docker Compose 示例 ### 基础 Web 应用 ```yaml version: '3.8' services: web: image: nginx:alpine ports: - "80:80" volumes: - ./html:/usr/share/nginx/html:ro restart: unless-stopped app: build: . ports: - "3000:3000" environment: - NODE_ENV=production depends_on: - db restart: unless-stopped db: image: postgres:15-alpine volumes: - postgres_data:/var/lib/postgresql/data environment: POSTGRES_DB: myapp POSTGRES_USER: user POSTGRES_PASSWORD: ${DB_PASSWORD} restart: unless-stopped volumes: postgres_data: ``` ### Clash + metacubexd(代理面板) ```yaml version: '3.8' services: clash: container_name: clash image: metacubex/mihomo:Alpha restart: unless-stopped network_mode: host pid: host cap_add: - ALL volumes: - ./config:/root/.config/mihomo - /dev/net/tun:/dev/net/tun dashboard: container_name: dashboard image: ghcr.io/metacubex/metacubexd:latest restart: unless-stopped network_mode: host ``` ## 安装 Docker(Linux) ```bash # Ubuntu/Debian curl -fsSL https://get.docker.com | sudo sh sudo usermod -aG docker $USER # Docker Compose(独立安装) sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" \ -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose ``` ## 网络模式选择 | 模式 | 说明 | 适用场景 | |------|------|----------| | **bridge(默认)** | NAT 网络,端口需映射 | 单容器简单应用 | | **host** | 共享宿主机网络栈 | TUN/透明代理、性能敏感应用 | | **overlay** | 跨主机容器网络 | Docker Swarm 集群 | | **none** | 禁用网络 | 隔离安全环境 | ## 常用参数 | 参数 | 说明 | |------|------| | `-d` | 后台运行(detached) | | `-p 8080:80` | 端口映射(宿主机:容器) | | `-v ./data:/data` | 卷挂载 | | `-e KEY=val` | 环境变量 | | `--name myapp` | 容器命名 | | `--restart unless-stopped` | 自动重启策略 | | `--network mynet` | 加入指定网络 | | `-it` | 交互式终端 | | `--rm` | 容器停止后自动删除 | ## 清理命令 ```bash # 删除已停止的容器 docker container prune # 删除悬空镜像(无 tag) docker image prune # 删除所有未使用的镜像 docker image prune -a # 删除已停止的容器和未使用的镜像 docker system prune # 完全清理(包括卷) docker system prune -a --volumes ``` ## 故障排查 | 问题 | 解决方案 | |------|---------| | 容器无法启动 | `docker logs ` 查看日志 | | 端口冲突 | 检查宿主机端口占用 `netstat -tlnp` | | 权限不足 | 确保用户在 docker 组 `groups $USER` | | 镜像拉取慢 | 配置国内镜像加速 | | TUN 不工作 | 确认 host 模式 + `/dev/net/tun` 挂载 |