Files
chill_notes/Docker/Docker容器化部署指南.md
2026-04-21 11:24:29 +08:00

247 lines
4.7 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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
```
## 安装 DockerLinux
```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 <container>` 查看日志 |
| 端口冲突 | 检查宿主机端口占用 `netstat -tlnp` |
| 权限不足 | 确保用户在 docker 组 `groups $USER` |
| 镜像拉取慢 | 配置国内镜像加速 |
| TUN 不工作 | 确认 host 模式 + `/dev/net/tun` 挂载 |