247 lines
4.7 KiB
Markdown
Executable File
247 lines
4.7 KiB
Markdown
Executable File
---
|
||
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
|
||
```
|
||
|
||
## 安装 Docker(Linux)
|
||
|
||
```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` 挂载 |
|