正在加载文档...
文档内容较大,正在处理中,请稍候
正在加载文档...
文档内容较大,正在处理中,请稍候
本文档详细说明了 Docker 的常用操作命令、Docker Compose 使用、网络和存储管理、错误排查等内容,基于项目实际使用的 Docker 配置和部署场景。
| 概念 | 说明 | 类比 |
|---|---|---|
| 镜像(Image) | Docker 的静态模板,用于创建容器 | 类似程序安装包 |
| 容器(Container) | 镜像的运行实例 | 类似运行中的程序 |
| 仓库(Repository) | 存储镜像的地方(如 Docker Hub) | 类似应用商店 |
| Dockerfile | 用于构建镜像的脚本文件 | 类似构建脚本 |
| Docker Compose | 用于定义和运行多容器应用的工具 | 类似应用编排工具 |
Docker Engine
├── Docker Daemon(后台服务)
├── Docker CLI(命令行工具)
└── Docker API(REST API)# 查看所有镜像
docker images
# 查看镜像列表(简化版)
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
# 查看特定镜像
docker images | grep project-root-backend
# 查看镜像详细信息
docker inspect <image_name>:<tag>
# 查看镜像构建历史
docker history <image_name>:<tag># 从 Docker Hub 拉取镜像
docker pull node:20-alpine
# 拉取指定标签的镜像
docker pull mysql:8.0.34
# 拉取最新版本
docker pull redis:latest# 从 Dockerfile 构建镜像
docker build -t <image_name>:<tag> .
# 构建时指定 Dockerfile 路径
docker build -f /path/to/Dockerfile -t <image_name>:<tag> .
# 构建时不使用缓存
docker build --no-cache -t <image_name>:<tag> .
# 构建时传递构建参数
docker build --build-arg NODE_ENV=production -t <image_name>:<tag> .示例:
# 构建项目后端镜像
docker build -t project-root-backend:v1.0.0 -f apps/node-express-mysql/Dockerfile .
# 构建并打标签
docker build -t project-root-backend:v1.0.0 -t project-root-backend:latest .# 保存镜像为 tar 文件
docker save -o project-root-backend.tar project-root-backend:v1.0.0
# 保存多个镜像
docker save -o images.tar image1:tag1 image2:tag2
# 从 tar 文件加载镜像
docker load -i project-root-backend.tar
# 从标准输入加载(通常用于管道)
docker load < project-root-backend.tar# 删除镜像
docker rmi <image_id>
# 删除指定标签的镜像
docker rmi project-root-backend:v1.0.0
# 强制删除镜像(即使有容器使用)
docker rmi -f <image_id>
# 删除所有未使用的镜像
docker image prune
# 删除所有未使用的镜像(包括有标签的)
docker image prune -a
# 删除悬空镜像(没有标签的)
docker image prune -f# 为镜像打标签
docker tag <source_image>:<tag> <target_image>:<tag>
# 示例:为镜像打多个标签
docker tag project-root-backend:v1.0.0 project-root-backend:latest
docker tag project-root-backend:v1.0.0 registry.example.com/project-root-backend:v1.0.0
# 推送镜像到仓库
docker push <image_name>:<tag># 查看运行中的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
# 查看容器的详细信息
docker inspect <container_id>
# 查看容器的资源使用情况
docker stats
# 查看特定容器的资源使用
docker stats <container_id>
# 查看容器的进程
docker top <container_id># 创建并启动容器(前台运行)
docker run <image_name>
# 创建并启动容器(后台运行)
docker run -d <image_name>
# 创建并启动容器(指定名称)
docker run -d --name <container_name> <image_name>
# 创建并启动容器(端口映射)
docker run -d -p 8080:80 <image_name>
# 创建并启动容器(环境变量)
docker run -d -e NODE_ENV=production <image_name>
# 创建并启动容器(数据卷挂载)
docker run -d -v /host/path:/container/path <image_name>完整示例:
# 启动 MySQL 容器
docker run -d \
--name mysql-8 \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=test_db \
-p 3306:3306 \
-v ./mysql-data:/var/lib/mysql \
mysql:8.0.34
# 启动 Redis 容器
docker run -d \
--name redis-7 \
-p 6379:6379 \
-v ./redis-data:/data \
redis:7.0-alpine redis-server --appendonly yes# 启动已停止的容器
docker start <container_id>
# 停止运行中的容器
docker stop <container_id>
# 强制停止容器(发送 SIGKILL)
docker kill <container_id>
# 重启容器
docker restart <container_id>
# 暂停容器(暂停所有进程)
docker pause <container_id>
# 恢复暂停的容器
docker unpause <container_id># 使用 exec 进入运行中的容器(推荐)
docker exec -it <container_id> /bin/sh
# 进入容器并执行命令
docker exec -it <container_id> /bin/bash
# 以 root 用户进入容器
docker exec -u root -it <container_id> /bin/sh
# 在容器中执行单条命令
docker exec <container_id> ls -la
# 使用 attach 连接到容器(不推荐,退出会导致容器停止)
docker attach <container_id>示例:
# 进入 MySQL 容器
docker exec -it mysql-8 mysql -uroot -p
# 进入 Redis 容器
docker exec -it redis-7 redis-cli
# 查看容器内的文件
docker exec -it <container_id> ls -la /app# 查看容器日志
docker logs <container_id>
# 实时查看日志(类似 tail -f)
docker logs -f <container_id>
# 查看最近的日志
docker logs --tail 100 <container_id>
# 查看带时间戳的日志
docker logs -t <container_id>
# 查看指定时间范围的日志
docker logs --since 30m <container_id>
docker logs --since 2024-01-01T00:00:00 <container_id>
docker logs --until 2024-01-02T00:00:00 <container_id>
# 组合使用
docker logs -f --tail 50 --since 10m <container_id># 删除已停止的容器
docker rm <container_id>
# 强制删除运行中的容器
docker rm -f <container_id>
# 删除所有已停止的容器
docker container prune
# 删除所有容器(包括运行中的)
docker rm -f $(docker ps -aq)# 从容器复制文件到主机
docker cp <container_id>:/path/to/file /host/path
# 从主机复制文件到容器
docker cp /host/path <container_id>:/path/to/file
# 示例
docker cp mysql-8:/etc/mysql/my.cnf ./my.cnf
docker cp ./config.json app-container:/app/config.jsonDocker Compose 用于定义和运行多容器 Docker 应用。
# 启动服务(后台运行)
docker compose up -d
# 启动服务(前台运行,查看日志)
docker compose up
# 启动特定服务
docker compose up -d mysql redis
# 停止服务
docker compose stop
# 停止并删除容器
docker compose down
# 停止并删除容器、网络、卷(谨慎使用)
docker compose down -v
# 重启服务
docker compose restart
# 重启特定服务
docker compose restart backend# 查看服务状态
docker compose ps
# 查看服务日志
docker compose logs
# 实时查看所有服务日志
docker compose logs -f
# 查看特定服务的日志
docker compose logs -f backend
# 查看最近的日志
docker compose logs --tail 100 backend
# 查看服务资源使用
docker compose top# 构建服务镜像
docker compose build
# 构建特定服务的镜像
docker compose build backend
# 构建时不使用缓存
docker compose build --no-cache
# 重新构建并启动服务
docker compose up -d --build
# 拉取服务镜像
docker compose pull
# 拉取并启动服务
docker compose up -d --pull always# 在服务容器中执行命令
docker compose exec <service_name> <command>
# 示例
docker compose exec mysql mysql -uroot -p
docker compose exec backend npm install
docker compose exec backend sh
# 以特定用户执行
docker compose exec -u root backend sh基础设施服务(MySQL + Redis):
# 进入 docker-compose 目录
cd docker_project/docker-compose
# 启动 MySQL 和 Redis
docker compose -f docker-compose.yml up -d
# 查看服务状态
docker compose -f docker-compose.yml ps
# 查看日志
docker compose -f docker-compose.yml logs -f
# 停止服务
docker compose -f docker-compose.yml down应用服务(Backend):
# 进入项目根目录
cd docker_project
# 启动应用服务
docker compose up -d
# 查看日志
docker compose logs -f backend
# 重启服务
docker compose restart backend# 查看所有网络
docker network ls
# 查看网络详细信息
docker network inspect <network_name>
# 查看连接到网络的容器
docker network inspect <network_name> | grep -A 10 Containers# 创建网络
docker network create <network_name>
# 创建网络(指定驱动)
docker network create --driver bridge <network_name>
# 创建网络(指定子网)
docker network create --subnet 172.20.0.0/16 <network_name>
# 删除网络
docker network rm <network_name>
# 删除未使用的网络
docker network prune
# 创建项目网络
docker network create docker_project_app-network# 将容器连接到网络
docker network connect <network_name> <container_id>
# 断开容器与网络的连接
docker network disconnect <network_name> <container_id>| 模式 | 说明 | 使用场景 |
|---|---|---|
| bridge | 默认网络模式,容器间可通信 | 单主机多容器应用 |
| host | 容器直接使用主机网络 | 性能要求高的场景 |
| none | 无网络配置 | 不需要网络的容器 |
| overlay | 跨主机的网络 | Docker Swarm 集群 |
# 查看所有卷
docker volume ls
# 查看卷详细信息
docker volume inspect <volume_name>
# 查看卷的挂载位置
docker volume inspect <volume_name> | grep Mountpoint# 创建卷
docker volume create <volume_name>
# 创建卷(指定驱动)
docker volume create --driver local <volume_name>
# 删除卷
docker volume rm <volume_name>
# 删除未使用的卷
docker volume prune
# 删除未使用的卷(包括有标签的)
docker volume prune -a方式1:命名卷(Named Volume)
# docker-compose.yml
services:
mysql:
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:方式2:绑定挂载(Bind Mount)
# docker-compose.yml
services:
backend:
volumes:
- ./uploads:/app/data/uploads
- ./logs:/app/logs方式3:匿名卷(Anonymous Volume)
docker run -v /var/lib/mysql mysql:8.0.34# 备份数据卷(MySQL 示例)
docker run --rm \
-v mysql-data:/data \
-v $(pwd):/backup \
alpine tar czf /backup/mysql-backup.tar.gz -C /data .
# 恢复数据卷(MySQL 示例)
docker run --rm \
-v mysql-data:/data \
-v $(pwd):/backup \
alpine tar xzf /backup/mysql-backup.tar.gz -C /data# 查看容器日志
docker logs <container_id>
# 实时查看日志
docker logs -f <container_id>
# 查看最近 100 行日志
docker logs --tail 100 <container_id>
# 查看带时间戳的日志
docker logs -t <container_id>
# 查看特定时间段的日志
docker logs --since 30m <container_id>
docker logs --since 2024-01-01T00:00:00 <container_id>
# Docker Compose 查看日志
docker compose logs -f
docker compose logs -f --tail 100 backend# docker-compose.yml
services:
backend:
logging:
driver: json-file
options:
max-size: "10m" # 单个日志文件最大 10MB
max-file: "3" # 最多保留 3 个日志文件# 导出容器日志到文件
docker logs <container_id> > container.log 2>&1
# 导出最近 1 小时的日志
docker logs --since 1h <container_id> > container-1h.log 2>&1
# Docker Compose 导出日志
docker compose logs > compose.log 2>&1
docker compose logs backend > backend.log 2>&1# 清理所有未使用的资源(镜像、容器、网络、卷)
docker system prune
# 清理所有未使用的资源(包括未使用的镜像)
docker system prune -a
# 清理所有资源(谨慎使用)
docker system prune -a --volumes
# 清理未使用的镜像
docker image prune -a
# 清理未使用的容器
docker container prune
# 清理未使用的网络
docker network prune
# 清理未使用的卷
docker volume prune# 查看系统资源使用情况
docker system df
# 查看详细信息
docker system df -v
# 查看容器资源使用情况
docker stats
# 查看特定容器的资源使用
docker stats <container_id>
# 只显示一次(不持续更新)
docker stats --no-stream# 查看容器健康状态
docker inspect --format='{{.State.Health.Status}}' <container_id>
# 查看容器健康检查详细信息
docker inspect <container_id> | grep -A 20 Health
# 查看健康检查日志
docker inspect <container_id> | jq '.[0].State.Health'
# Docker Compose 查看服务健康状态
docker compose ps在 docker-compose.yml 中配置健康检查:
services:
backend:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8888/health"]
interval: 30s # 检查间隔
timeout: 10s # 超时时间
retries: 3 # 重试次数
start_period: 40s # 启动缓冲期在 Dockerfile 中配置健康检查:
HEALTHCHECK --interval=30s --timeout=10s --retries=3 \
CMD curl -f http://localhost:8888/health || exit 1# 查看容器详细信息
docker inspect <container_id>
# 查看容器的配置
docker inspect <container_id> | grep -A 50 Config
# 查看容器的网络配置
docker inspect <container_id> | grep -A 20 NetworkSettings
# 查看容器的挂载点
docker inspect <container_id> | grep -A 10 Mounts
# 查看容器的环境变量
docker exec <container_id> env
# 查看容器的端口映射
docker port <container_id>
# 查看容器的 IP 地址
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_id># 导出容器为 tar 文件
docker export <container_id> > container.tar
# 从 tar 文件导入为镜像
docker import container.tar <image_name>:<tag>
# 保存镜像为 tar 文件
docker save -o image.tar <image_name>:<tag>
# 从 tar 文件加载镜像
docker load -i image.tar
# 导出镜像的完整历史
docker save <image_name>:<tag> | gzip > image.tar.gz
# 加载压缩的镜像
docker load < image.tar.gz# 停止所有运行中的容器
docker stop $(docker ps -q)
# 删除所有已停止的容器
docker rm $(docker ps -aq)
# 删除所有未使用的镜像
docker rmi $(docker images -q --filter "dangling=true")
# 删除所有镜像(谨慎使用)
docker rmi $(docker images -q)
# 批量打标签
docker images | grep "project-root" | while read repo tag rest; do
docker tag "$repo:$tag" "registry.example.com/$repo:$tag"
done
# 批量推送镜像
docker images | grep "registry.example.com/project-root" | while read repo tag rest; do
docker push "$repo:$tag"
done问题现象:容器启动后立即退出
# 查看容器退出状态码
docker ps -a
# 查看容器日志
docker logs <container_id>
# 查看容器详细错误信息
docker inspect <container_id> | grep -A 10 State
# 使用 --rm 参数测试容器
docker run --rm <image_name> <command>
# 检查容器启动命令
docker inspect <container_id> | grep -A 5 Cmd常见原因:
问题现象:容器无法访问其他容器或外部服务
# 检查容器网络连接
docker network inspect <network_name>
# 查看容器的网络配置
docker inspect <container_id> | grep -A 30 NetworkSettings
# 测试容器之间的网络连接
docker exec <container_id> ping <other_container_name>
# 查看容器的 DNS 配置
docker exec <container_id> cat /etc/resolv.conf
# 检查端口是否被占用
netstat -tlnp | grep <port>
lsof -i :<port>
# 查看防火墙规则
iptables -L -n解决方案:
问题现象:容器运行时出现磁盘空间不足错误
# 查看 Docker 磁盘使用情况
docker system df
# 查看详细信息
docker system df -v
# 查看容器占用的空间
docker ps -s
# 清理未使用的资源
docker system prune -a
# 清理特定资源的日志
docker system prune -a --volumes
# 查看大文件(在宿主机上)
du -sh /var/lib/docker/* | sort -h解决方案:
docker image prune -adocker volume prune问题现象:容器运行缓慢,资源使用异常
# 实时查看容器资源使用
docker stats
# 查看特定容器的资源使用
docker stats <container_id>
# 查看容器进程
docker top <container_id>
# 查看容器详细信息
docker inspect <container_id>
# 限制容器资源使用
docker run --memory="512m" --cpus="1.0" <image_name>在 docker-compose.yml 中限制资源:
services:
backend:
deploy:
resources:
limits:
cpus: "1.0"
memory: 512M
reservations:
cpus: "0.5"
memory: 256M问题现象:docker build 命令失败
# 查看构建过程的详细输出
docker build --progress=plain -t <image_name> .
# 构建时不使用缓存
docker build --no-cache -t <image_name> .
# 查看构建历史
docker history <image_name>
# 查看中间层镜像
docker images -a
# 保存构建日志
docker build -t <image_name> . 2>&1 | tee build.log常见原因:
问题现象:容器内无法写入文件或执行操作
# 查看容器内文件权限
docker exec <container_id> ls -la /path/to/file
# 以 root 用户进入容器
docker exec -u root -it <container_id> sh
# 修改文件权限
docker exec -u root <container_id> chown -R user:group /path
docker exec -u root <container_id> chmod -R 755 /path
# 检查卷挂载权限
docker inspect <container_id> | grep -A 10 Mounts解决方案:
问题现象:容器启动时提示端口已被占用
# 查看端口占用情况
netstat -tlnp | grep <port>
lsof -i :<port>
ss -tlnp | grep <port>
# 查看容器端口映射
docker port <container_id>
# 查找使用特定端口的容器
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}" | grep <port>
# 停止占用端口的容器
docker stop <container_id>
# 使用不同端口启动容器
docker run -p <host_port>:<container_port> <image_name>问题现象:数据卷挂载失败或数据丢失
# 查看数据卷列表
docker volume ls
# 查看数据卷详细信息
docker volume inspect <volume_name>
# 查看数据卷挂载位置
docker volume inspect <volume_name> | grep Mountpoint
# 查看容器的挂载点
docker inspect <container_id> | grep -A 20 Mounts
# 备份数据卷
docker run --rm -v <volume_name>:/data -v $(pwd):/backup \
alpine tar czf /backup/backup.tar.gz -C /data .
# 恢复数据卷
docker run --rm -v <volume_name>:/data -v $(pwd):/backup \
alpine tar xzf /backup/backup.tar.gz -C /data问题现象:无法连接到 Docker daemon
# 检查 Docker 服务状态
sudo systemctl status docker
# 启动 Docker 服务
sudo systemctl start docker
# 重启 Docker 服务
sudo systemctl restart docker
# 查看 Docker daemon 日志
sudo journalctl -u docker.service
# 检查 Docker 版本
docker version
# 检查 Docker 信息
docker info常见错误:
Cannot connect to the Docker daemon:Docker 服务未启动Permission denied:用户不在 docker 组中dial unix /var/run/docker.sock: connect: permission denied:权限问题问题现象:日志文件占用大量磁盘空间
# 查看日志文件大小
docker system df -v
# 清理日志文件(谨慎使用)
sudo truncate -s 0 /var/lib/docker/containers/*/*-json.log
# 配置日志轮转(推荐)
# 在 docker-compose.yml 中配置配置日志轮转:
services:
backend:
logging:
driver: json-file
options:
max-size: "10m" # 单个日志文件最大 10MB
max-file: "3" # 最多保留 3 个日志文件使用多阶段构建:
# 构建阶段
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 生产阶段
FROM node:20-alpine AS production
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY package*.json ./
EXPOSE 8888
CMD ["npm", "start"]优化建议:
.dockerignore 文件排除不必要的文件latest安全建议:
示例:
# 创建非 root 用户
RUN addgroup -g 1001 -S nodejs && \
adduser -S nodejs -u 1001
# 设置文件权限
RUN chown -R nodejs:nodejs /app
# 切换到非 root 用户
USER nodejs使用环境变量:
# docker-compose.yml
services:
backend:
image: ${PROJECT_NAME:-project-root}-backend:${BACKEND_VERSION:-latest}
environment:
NODE_ENV: ${NODE_ENV:-production}
PORT: ${PORT:-8888}
env_file:
- .env网络配置:
services:
backend:
networks:
- app-network
networks:
app-network:
driver: bridge健康检查:
services:
backend:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8888/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s使用命名卷:
services:
mysql:
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
driver: local定期备份:
# 创建备份脚本
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
docker run --rm \
-v mysql-data:/data \
-v $(pwd)/backups:/backup \
alpine tar czf /backup/mysql-backup-$DATE.tar.gz -C /data .配置日志轮转:
services:
backend:
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"集中日志管理:
监控容器资源:
# 使用 cAdvisor 监控容器
docker run -d \
--name=cadvisor \
-p 8080:8080 \
-v /:/rootfs:ro \
-v /var/run:/var/run:ro \
-v /sys:/sys:ro \
-v /var/lib/docker/:/var/lib/docker:ro \
google/cadvisor:latest使用 Docker stats:
# 持续监控
docker stats
# 导出为 JSON
docker stats --no-stream --format "{{json .}}" > stats.json# 查看镜像
docker images
# 拉取镜像
docker pull <image>:<tag>
# 构建镜像
docker build -t <image>:<tag> .
# 删除镜像
docker rmi <image_id>
# 保存镜像
docker save -o image.tar <image>:<tag>
# 加载镜像
docker load -i image.tar# 查看容器
docker ps -a
# 启动容器
docker start <container_id>
# 停止容器
docker stop <container_id>
# 删除容器
docker rm <container_id>
# 进入容器
docker exec -it <container_id> sh
# 查看日志
docker logs -f <container_id>
# 查看资源使用
docker stats <container_id># 启动服务
docker compose up -d
# 停止服务
docker compose stop
# 停止并删除
docker compose down
# 查看日志
docker compose logs -f
# 重启服务
docker compose restart
# 构建镜像
docker compose build# 查看网络
docker network ls
# 创建网络
docker network create <network_name>
# 查看卷
docker volume ls
# 创建卷
docker volume create <volume_name>
# 删除卷
docker volume rm <volume_name># 清理所有未使用的资源
docker system prune -a
# 清理未使用的镜像
docker image prune -a
# 清理未使用的容器
docker container prune
# 清理未使用的卷
docker volume prune# 创建项目网络(如果不存在)
docker network create docker_project_app-network
# 检查网络是否存在
docker network ls | grep docker_project_app-network
# 查看网络详细信息
docker network inspect docker_project_app-network启动 MySQL 和 Redis:
# 进入基础设施配置目录
cd docker_project/docker-compose
# 启动所有基础设施服务
docker compose up -d
# 启动特定服务
docker compose up -d mysql
docker compose up -d redis
# 查看服务状态
docker compose ps
# 查看服务日志
docker compose logs -f mysql
docker compose logs -f redis
# 停止服务
docker compose stop
# 停止并删除容器
docker compose downMySQL 操作:
# 进入 MySQL 容器
docker compose exec mysql mysql -uroot -p
# 执行 SQL 文件
docker compose exec -T mysql mysql -uroot -p${MYSQL_ROOT_PASSWORD} ${MYSQL_DATABASE} < /path/to/sql/file.sql
# 备份数据库
docker compose exec mysql mysqldump -uroot -p${MYSQL_ROOT_PASSWORD} ${MYSQL_DATABASE} > backup.sql
# 恢复数据库
docker compose exec -T mysql mysql -uroot -p${MYSQL_ROOT_PASSWORD} ${MYSQL_DATABASE} < backup.sqlRedis 操作:
# 进入 Redis 容器
docker compose exec redis redis-cli
# 查看 Redis 信息
docker compose exec redis redis-cli INFO
# 清空 Redis 数据
docker compose exec redis redis-cli FLUSHALL
# 查看 Redis 键
docker compose exec redis redis-cli KEYS "*"构建后端镜像:
# 从项目根目录构建
docker build -t project-root-backend:v1.0.0 -f apps/node-express-mysql/Dockerfile .
# 构建并打标签
docker build -t project-root-backend:v1.0.0 -t project-root-backend:latest -f apps/node-express-mysql/Dockerfile .
# 使用构建脚本(推荐)
./scripts/auto-build-docker.sh启动后端服务:
# 进入应用配置目录
cd docker_project
# 启动后端服务
docker compose up -d backend
# 查看服务状态
docker compose ps
# 查看服务日志
docker compose logs -f backend
# 查看最近 100 行日志
docker compose logs --tail 100 backend
# 重启服务
docker compose restart backend
# 停止服务
docker compose stop backend
# 停止并删除容器
docker compose down后端服务调试:
# 进入后端容器
docker compose exec backend sh
# 查看容器环境变量
docker compose exec backend env
# 查看容器内文件
docker compose exec backend ls -la /app
# 查看容器资源使用
docker stats $(docker compose ps -q backend)
# 检查健康状态
curl http://localhost:8888/health保存和传输镜像:
# 保存镜像为 tar 文件
docker save -o project-root-backend-v1.0.0.tar project-root-backend:v1.0.0
# 压缩镜像文件
docker save project-root-backend:v1.0.0 | gzip > project-root-backend-v1.0.0.tar.gz
# 传输到服务器
scp project-root-backend-v1.0.0.tar.gz root@server:/tmp/
# 在服务器上加载镜像
ssh root@server
docker load -i /tmp/project-root-backend-v1.0.0.tar.gz镜像版本管理:
# 查看所有项目镜像
docker images | grep project-root-backend
# 删除旧版本镜像
docker rmi project-root-backend:v0.9.0
# 批量删除旧版本(保留 latest 和最近 3 个版本)
docker images project-root-backend --format "{{.Tag}}" | grep -v latest | sort -V | head -n -3 | xargs -I {} docker rmi project-root-backend:{}查看项目数据卷:
# 查看所有数据卷
docker volume ls
# 查看 MySQL 数据卷
docker volume inspect docker-compose_mysql-data
# 查看 Redis 数据卷
docker volume inspect docker-compose_redis-data
# 查看数据卷挂载位置
docker volume inspect docker-compose_mysql-data | grep Mountpoint备份和恢复数据:
# 备份 MySQL 数据卷
docker run --rm \
-v docker-compose_mysql-data:/data \
-v $(pwd):/backup \
alpine tar czf /backup/mysql-backup-$(date +%Y%m%d).tar.gz -C /data .
# 恢复 MySQL 数据卷
docker run --rm \
-v docker-compose_mysql-data:/data \
-v $(pwd):/backup \
alpine tar xzf /backup/mysql-backup-20240101.tar.gz -C /data
# 备份 Redis 数据卷
docker run --rm \
-v docker-compose_redis-data:/data \
-v $(pwd):/backup \
alpine tar czf /backup/redis-backup-$(date +%Y%m%d).tar.gz -C /data .查看项目日志:
# 查看所有服务日志
docker compose logs -f
# 查看后端日志
docker compose logs -f backend
# 查看最近 1 小时的日志
docker compose logs --since 1h backend
# 导出日志到文件
docker compose logs backend > backend-$(date +%Y%m%d).log
# 查看错误日志
docker compose logs backend | grep -i error
# 查看特定时间段的日志
docker compose logs --since 2024-01-01T00:00:00 --until 2024-01-02T00:00:00 backend清理日志:
# 查看日志文件大小
docker system df -v
# 清理容器日志(谨慎使用)
sudo truncate -s 0 /var/lib/docker/containers/*/*-json.log
# 配置日志轮转(在 docker-compose.yml 中已配置)
# max-size: "10m"
# max-file: "3"涵盖常用的操作