4.7 KiB
Executable File
4.7 KiB
Executable File
title, tags, created
| title | tags | created | ||||
|---|---|---|---|---|---|---|
| Docker 容器化部署指南 |
|
2026-04-21 |
Docker 容器化部署指南
核心概念
| 概念 | 说明 |
|---|---|
| 镜像(Image) | 只读模板,包含运行应用所需的文件系统 |
| 容器(Container) | 镜像的运行实例,类似轻量级虚拟机 |
| 仓库(Registry) | 存储和分发镜像的服务(Docker Hub、GHCR) |
| Dockerfile | 定义镜像构建步骤的脚本 |
常用命令
镜像操作
# 查看本地镜像
docker images
# 拉取镜像
docker pull nginx:latest
# 构建镜像
docker build -t myapp:1.0 .
# 删除镜像
docker rmi myapp:1.0
# 推送镜像
docker push myrepo/myapp:1.0
容器操作
# 运行容器
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
# 启动服务
docker compose up -d
# 查看服务状态
docker compose ps
# 重启服务
docker compose restart
# 查看日志
docker compose logs -f
# 停止服务
docker compose down
# 重新构建并启动
docker compose up -d --build
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 应用
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(代理面板)
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)
# 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 |
容器停止后自动删除 |
清理命令
# 删除已停止的容器
docker container prune
# 删除悬空镜像(无 tag)
docker image prune
# 删除所有未使用的镜像
docker image prune -a
# 删除已停止的容器和未使用的镜像
docker system prune
# 完全清理(包括卷)
docker system prune -a --volumes
故障排查
| 问题 | 解决方案 |
|---|---|
| 容器无法启动 | docker logs <container> 查看日志 |
| 端口冲突 | 检查宿主机端口占用 netstat -tlnp |
| 权限不足 | 确保用户在 docker 组 groups $USER |
| 镜像拉取慢 | 配置国内镜像加速 |
| TUN 不工作 | 确认 host 模式 + /dev/net/tun 挂载 |