Docker 容器化部署完整指南
Docker 让应用部署变得简单、一致且可移植。
什么是 Docker?
Docker 是一个开源的容器化平台,将应用及其依赖打包到容器中,实现一次构建、到处运行。
安装 Docker
Linux
curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh sudo usermod -aG docker $USER
|
Windows/Mac
下载 Docker Desktop 安装包。
基本概念
镜像 (Image)
只读的模板,包含应用代码和依赖。
容器 (Container)
镜像的运行实例,可读写。
仓库 (Registry)
存储镜像的地方,如 Docker Hub。
基础命令
镜像操作
docker pull nginx:latest docker images docker rmi nginx:latest docker build -t myapp .
|
容器操作
docker run -d -p 80:80 nginx docker ps docker ps -a docker stop container_id docker rm container_id
|
Dockerfile 编写
基础示例
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
|
多阶段构建
FROM node:18-alpine as builder WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build
FROM node:18-alpine WORKDIR /app COPY --from=builder /app/dist ./dist EXPOSE 3000 CMD ["node", "dist/index.js"]
|
Docker Compose
version: '3.8'
services: app: build: . ports: - "3000:3000" environment: - NODE_ENV=production depends_on: - db
db: image: postgres:15 environment: POSTGRES_DB: myapp POSTGRES_USER: user POSTGRES_PASSWORD: password volumes: - db_data:/var/lib/postgresql/data
volumes: db_data:
|
运行容器
基础运行
docker run -d \ --name myapp \ -p 3000:3000 \ -v /app/logs:/app/logs \ -e NODE_ENV=production \ myapp-image
|
参数说明
-d 后台运行--name 容器名称-p 端口映射-v 数据卷挂载-e 环境变量
网络配置
自定义网络
docker network create myapp-net docker run --network myapp-net --name app myapp docker run --network myapp-net --name db postgres
|
连接不同容器
docker run --link db:database --name app myapp
|
数据持久化
Volume
docker run -v myvolume:/data nginx
|
Bind Mount
docker run -v $(pwd)/data:/data nginx
|
环境变量
docker run -e DB_HOST=postgres \ -e DB_USER=user \ -e DB_PASSWORD=password \ app
|
实战案例:Node.js 应用
Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package.json package-lock.json ./ RUN npm ci
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
|
docker-compose.yml
version: '3.8'
services: app: build: . ports: - "3000:3000" environment: - DATABASE_URL=postgres://user:password@db:5432/myapp depends_on: - db
db: image: postgres:15 environment: POSTGRES_DB: myapp POSTGRES_USER: user POSTGRES_PASSWORD: password volumes: - postgres_data:/var/lib/postgresql/data
volumes: postgres_data:
|
实战案例:Python Flask
Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]
|
docker-compose.yml
version: '3.8'
services: web: build: . ports: - "5000:5000" environment: - FLASK_ENV=production depends_on: - redis
redis: image: redis:alpine
|
日志管理
查看日志
docker logs container_id docker logs -f container_id docker logs --tail 100 container_id
|
日志驱动
docker run --log-driver json-file --log-opt max-size=10m app
|
性能优化
使用 Alpine 镜像
多阶段构建
减少最终镜像大小。
清理缓存
RUN npm ci
RUN pip install --no-cache-dir
|
基础镜像精简
选择合适的基础镜像。
最佳实践
使用构建缓存
COPY package*.json ./ RUN npm install COPY . .
|
使用多阶段构建
设置合理的端口
避免使用 root 用户
RUN useradd -m appuser USER appuser
|
安全性
FROM node:18-alpine WORKDIR /app RUN addgroup -g 1001 -S nodejs RUN adduser -S nodejs -u 1001 COPY --chown=nodejs:nodejs . . USER nodejs
|
文档化
故障排查
查看容器状态
docker ps -a docker inspect container_id
|
进入容器
docker exec -it container_id /bin/sh
|
查看资源使用
清理
docker system prune docker system prune -a
|
总结
Docker 让应用部署变得简单:
- 一致的运行环境
- 快速部署和扩展
- 简化的依赖管理
- 容易备份和恢复
掌握 Docker 是现代开发者的必备技能!