--- 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 : # 构建镜像 docker build -t : . # 删除镜像 docker rmi # 清理未使用镜像 docker image prune -a ``` ### 容器管理 ```bash # 运行容器 docker run -d --name -p : # 列出运行中的容器 docker ps # 列出所有容器 docker ps -a # 停止容器 docker stop # 启动容器 docker start # 重启容器 docker restart # 删除容器 docker rm # 进入容器 docker exec -it /bin/bash # 查看日志 docker logs -f # 查看容器详情 docker inspect ``` ### 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 = ``` ### 网络管理 ```bash # 列出网络 docker network ls # 创建网络 docker network create # 查看网络详情 docker network inspect # 连接容器到网络 docker network connect # 断开网络 docker network disconnect ``` ### 数据卷管理 ```bash # 列出卷 docker volume ls # 创建卷 docker volume create # 查看卷详情 docker volume inspect # 删除卷 docker volume rm # 清理未使用卷 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//: # Tag 回原始名称(让 docker-compose 识别) docker tag ghcr.nju.edu.cn//: ghcr.io//: ``` ### 其他 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 # 查看容器状态 docker inspect # 检查端口占用 netstat -tulpn | grep ``` ### 磁盘空间不足 ```bash # 查看磁盘使用 docker system df # 清理未使用资源 docker system prune -a # 清理构建缓存 docker builder prune ``` ### 网络问题 ```bash # 检查容器网络 docker network inspect # 测试容器连通性 docker exec -it ping # 查看端口映射 docker port ``` ## 快捷操作 ```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` 和批量删除命令。