---
name: docker
description: Docker容器管理技能 - 镜像构建、容器运行、编排管理、日志查看、网络配置。当用户提到"docker"、"容器"、"镜像"、"docker-compose"时触发。
version: 1.0.0
tags: [docker, container, devops, infrastructure]
---

# Docker 管理技能

Docker容器管理技能 - 镜像构建、容器运行、编排管理、日志查看、网络配置。

## 触发条件

- 用户提到 "docker"、"容器"、"镜像"、"docker-compose"
- 用户要求 "部署"、"运行容器"、"构建镜像"
- 用户需要 "查看日志"、"容器状态"、"网络配置"

## 快速参考

### 镜像管理

```bash
# 列出镜像
docker images

# 拉取镜像
docker pull <image>:<tag>

# 构建镜像
docker build -t <name>:<tag> .

# 删除镜像
docker rmi <image>

# 清理未使用镜像
docker image prune -a
```

### 容器管理

```bash
# 运行容器
docker run -d --name <name> -p <host>:<container> <image>

# 列出运行中的容器
docker ps

# 列出所有容器
docker ps -a

# 停止容器
docker stop <container>

# 启动容器
docker start <container>

# 重启容器
docker restart <container>

# 删除容器
docker rm <container>

# 进入容器
docker exec -it <container> /bin/bash

# 查看日志
docker logs -f <container>

# 查看容器详情
docker inspect <container>
```

### Docker Compose

```bash
# 启动所有服务
docker-compose up -d

# 停止所有服务
docker-compose down

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f

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

# 扩展服务
docker-compose up -d --scale <service>=<count>
```

### 网络管理

```bash
# 列出网络
docker network ls

# 创建网络
docker network create <name>

# 查看网络详情
docker network inspect <name>

# 连接容器到网络
docker network connect <network> <container>

# 断开网络
docker network disconnect <network> <container>
```

### 数据卷管理

```bash
# 列出卷
docker volume ls

# 创建卷
docker volume create <name>

# 查看卷详情
docker volume inspect <name>

# 删除卷
docker volume rm <name>

# 清理未使用卷
docker volume prune
```

### 系统管理

```bash
# 查看Docker信息
docker info

# 查看磁盘使用
docker system df

# 清理所有未使用资源
docker system prune -a

# 查看Docker版本
docker version
```

## 常见场景

### 1. 部署Web应用

```bash
# 运行Nginx
docker run -d --name web -p 80:80 -v ./html:/usr/share/nginx/html nginx:alpine

# 运行Node.js应用
docker run -d --name app -p 3000:3000 -e NODE_ENV=production node-app
```

### 2. 运行数据库

```bash
# MySQL
docker run -d --name mysql \
  -e MYSQL_ROOT_PASSWORD=root \
  -e MYSQL_DATABASE=mydb \
  -p 3306:3306 \
  -v mysql-data:/var/lib/mysql \
  mysql:8

# PostgreSQL
docker run -d --name postgres \
  -e POSTGRES_PASSWORD=root \
  -e POSTGRES_DB=mydb \
  -p 5432:5432 \
  -v pg-data:/var/lib/postgresql/data \
  postgres:15

# Redis
docker run -d --name redis -p 6379:6379 redis:alpine
```

### 3. 运行OctoBot（量化交易）

```bash
docker run -d --name octobot \
  -p 80:80 \
  -v octobot-data:/octobot/user \
  drakkarsoftware/octobot:stable
```

### 4. 运行Freqtrade

```bash
# 下载配置
mkdir freqtrade && cd freqtrade
curl https://raw.githubusercontent.com/freqtrade/freqtrade/main/docker-compose.yml -o docker-compose.yml

# 启动
docker-compose up -d

# 进入容器
docker exec -it freqtrade bash
```

## Dockerfile 最佳实践

```dockerfile
# 使用多阶段构建
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
```

## ghcr.io 镜像拉取（中国服务器）

ghcr.io (GitHub Container Registry) 在中国服务器上经常超时。`registry-mirrors` in `daemon.json` **只加速 Docker Hub，不加速 ghcr.io**。

### 方案：NJU 镜像代理

```bash
# 直接用 NJU 镜像拉取（替换 ghcr.io 前缀）
docker pull ghcr.nju.edu.cn/<owner>/<image>:<tag>

# Tag 回原始名称（让 docker-compose 识别）
docker tag ghcr.nju.edu.cn/<owner>/<image>:<tag> ghcr.io/<owner>/<image>:<tag>
```

### 其他 ghcr.io 镜像

- `ghcr.nju.edu.cn` — 南京大学镜像（已验证可用）
- `ghcr.mirrors.ustc.edu.cn` — 中科大镜像
- 不保证长期可用，失效时换一个试试

### Docker Daemon 代理（拉 Docker Hub 镜像）

如果 Docker Hub 也拉不动，配置 daemon 级代理：

```bash
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo tee /etc/systemd/system/docker.service.d/proxy.conf << 'EOF'
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890"
Environment="HTTPS_PROXY=http://127.0.0.1:7890"
Environment="NO_PROXY=localhost,127.0.0.1"
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
```

⚠️ 代理配置会影响 ghcr.io 镜像拉取（可能变慢），拉完 ghcr.io 后建议移除代理配置再拉 Docker Hub 镜像。

## 故障排查

### 容器无法启动
```bash
# 查看日志
docker logs <container>

# 查看容器状态
docker inspect <container>

# 检查端口占用
netstat -tulpn | grep <port>
```

### 磁盘空间不足
```bash
# 查看磁盘使用
docker system df

# 清理未使用资源
docker system prune -a

# 清理构建缓存
docker builder prune
```

### 网络问题
```bash
# 检查容器网络
docker network inspect <network>

# 测试容器连通性
docker exec -it <container> ping <target>

# 查看端口映射
docker port <container>
```

## 快捷操作

```bash
# 停止所有容器
docker stop $(docker ps -q)

# 删除所有容器
docker rm $(docker ps -aq)

# 删除所有镜像
docker rmi $(docker images -q)

# 进入最近创建的容器
docker exec -it $(docker ps -lq) /bin/bash
```

## 免责声明

⚠️ 生产环境操作前请确认影响范围，谨慎使用 `prune` 和批量删除命令。
