为什么使用 Docker 进行运维
传统部署方式依赖手动配置环境,容易出现环境不一致的问题。Docker通过容器化技术将应用及其依赖打包为标准化单元,确保开发、测试、生产环境的一致性,大幅简化部署和运维流程。
Docker 基础命令
# 拉取镜像
docker pull nginx:alpine
# 构建镜像
docker build -t myapp:v1 .
# 运行容器
docker run -d --name myapp -p 80:3000 -v /data/app:/app/data myapp:v1
# 查看运行中的容器
docker ps
# 查看容器日志
docker logs -f myapp
# 进入容器
docker exec -it myapp /bin/sh
Dockerfile 多阶段构建
# 阶段1:构建
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
# 阶段2:运行
FROM node:18-alpine AS runner
WORKDIR /app
RUN addgroup -g 1001 -S appgroup && adduser -S appuser -u 1001
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
USER appuser
EXPOSE 3000
CMD ["node", "dist/server.js"]
多阶段构建可以将最终镜像体积从数百MB减小到几十MB。
Docker Compose 多容器编排
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
- cache
restart: unless-stopped
db:
image: postgres:15-alpine
volumes:
- pgdata:/var/lib/postgresql/data
environment:
POSTGRES_DB: myapp
POSTGRES_PASSWORD: ${DB_PASSWORD}
restart: unless-stopped
cache:
image: redis:7-alpine
restart: unless-stopped
volumes:
pgdata:
# 一键启动所有服务
docker compose up -d
GitHub Actions CI/CD 流水线
# .github/workflows/deploy.yml
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Deploy to Server
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.SERVER_HOST }}
username: deploy
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd /var/www/myapp
git pull origin main
docker compose build
docker compose up -d
docker image prune -f
容器日志管理
# 查看日志
docker compose logs -f --tail=100 web
# 配置日志驱动
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
总结
Docker + CI/CD的自动化运维方案可以将部署时间从小时级缩短到分钟级,同时保证部署的一致性和可重复性。建议从小项目开始实践,逐步建立完整的自动化运维体系。