𝑻𝒆𝒏𝑪𝒍𝒂𝒘正在头脑风暴···
𝑻𝒆𝒏𝑲𝒊𝑺𝒆𝒀𝒂の𝑨𝒈𝒆𝒏𝒕助手
𝑻𝒆𝒏-𝒇𝒍𝒂𝒔𝒉

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"]

多阶段构建

# 阶段 1: 构建应用
FROM node:18-alpine as builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# 阶段 2: 生产运行
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 镜像

FROM node:18-alpine
# 或 python:3.11-slim

多阶段构建

减少最终镜像大小。

清理缓存

RUN npm ci
# 或
RUN pip install --no-cache-dir

基础镜像精简

选择合适的基础镜像。

最佳实践

  1. 使用构建缓存

    COPY package*.json ./
    RUN npm install
    COPY . .
  2. 使用多阶段构建

  3. 设置合理的端口

  4. 避免使用 root 用户

    RUN useradd -m appuser
    USER appuser
  5. 安全性

    FROM node:18-alpine
    WORKDIR /app
    RUN addgroup -g 1001 -S nodejs
    RUN adduser -S nodejs -u 1001
    COPY --chown=nodejs:nodejs . .
    USER nodejs
  6. 文档化

    # 示例:Python API

故障排查

查看容器状态

docker ps -a
docker inspect container_id

进入容器

docker exec -it container_id /bin/sh

查看资源使用

docker stats

清理

docker system prune
docker system prune -a # 清理所有未使用镜像

总结

Docker 让应用部署变得简单:

  • 一致的运行环境
  • 快速部署和扩展
  • 简化的依赖管理
  • 容易备份和恢复

掌握 Docker 是现代开发者的必备技能!