掌握 Docker 从基础到生产级容器。学习容器化、镜像优化和部署策略。
# Docker 容器部署实战
## 为什么用 Docker?
Docker 通过将应用程序与其所有依赖项打包来简化部署。这消除了"在我机器上能运行"的问题,并实现跨环境的一致部署。
## 入门
### 安装
```bash
# macOS
brew install docker
# Linux (Ubuntu)
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
# 验证
docker --version
docker-compose --version
```
## 核心概念
### 镜像
镜像是用于创建容器的只读模板。
```bash
# 拉取镜像
docker pull nginx:latest
# 列出镜像
docker images
# 从 Dockerfile 构建
docker build -t myapp:1.0 .
```
### 容器
容器是镜像的运行实例。
```bash
# 运行容器
docker run -d -p 8080:80 nginx:latest
# 列出运行中的容器
docker ps
# 停止容器
docker stop <container_id>
```
## Docker Compose
### docker-compose.yml
```yaml
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
volumes:
- ./data:/app/data
restart: unless-stopped
database:
image: postgres:15
environment:
POSTGRES_PASSWORD: secret
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
```
### 常用命令
```bash
# 启动所有服务
docker-compose up -d
# 查看日志
docker-compose logs -f
# 停止所有服务
docker-compose down
```
## 最佳实践
### 1. 使用多阶段构建
```dockerfile
# 构建阶段
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 生产阶段
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY package*.json ./
RUN npm ci --only=production
CMD ["node", "dist/index.js"]
```
### 2. 永远不要以 Root 运行
```dockerfile
RUN addgroup -g 1001 appgroup && \
adduser -u 1001 -G appgroup -s /bin/sh -D appuser
USER appuser
```
### 3. 使用 .dockerignore
```
node_modules
npm-debug.log
.git
.env
```
## 生产部署
### Docker Swarm
```bash
# 初始化 swarm
docker swarm init
# 部署 stack
docker stack deploy -c docker-compose.yml myapp
# 扩展服务
docker service scale myapp_web=5
```
### 安全扫描
```bash
# 扫描漏洞
docker scan myapp:1.0
```
💬 评论功能尚未配置
请设置 NEXT_PUBLIC_WALINE_SERVER_URL 环境变量