Docker 容器化部署指南
Docker 是一种流行的容器化技术,可以帮助您将应用程序及其依赖项打包到一个可移植的容器中。下面我将介绍如何在不同场景下将项目打包成 Docker 镜像并部署到容器中。
基本概念
- Dockerfile: 用于构建 Docker 镜像的脚本文件
- 镜像 (Image): 应用程序的静态快照
- 容器 (Container): 镜像的运行实例
通用步骤
无论什么类型的项目,Docker 化的基本流程都是:
- 创建 Dockerfile
- 构建镜像
- 运行容器
场景一:Node.js 应用
# 使用官方 Node.js 镜像作为基础镜像
FROM node:20-alpine
# 设置工作目录
WORKDIR /app
# 复制 package.json 和 package-lock.json
COPY package*.json ./
# 安装依赖
RUN npm install
# 复制应用程序代码
COPY . .
# 如果需要构建应用(例如 Next.js)
RUN npm run build
# 暴露端口
EXPOSE 3000
# 启动应用
CMD ["npm", "start"]
构建和运行步骤
# 构建镜像
docker build -t my-nodejs-app .
# 运行容器
docker run -p 3000:3000 -d my-nodejs-app
场景二:React 前端应用(生产环境)
# 构建阶段
FROM node:20-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 生产阶段
FROM nginx:alpine
# 从构建阶段复制构建文件到 nginx 目录
COPY --from=build /app/build /usr/share/nginx/html
# 配置 nginx
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
server {
listen 80;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
}
构建和运行步骤
# 构建镜像
docker build -t my-react-app .
# 运行容器
docker run -p 80:80 -d my-react-app
场景三:Python Flask/Django 应用
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
# 如果是 Django 应用,可能需要收集静态文件
# RUN python manage.py collectstatic --noinput
EXPOSE 8000
# 对于 Flask
# CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app:app"]
# 对于 Django
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "myproject.wsgi:application"]
构建和运行步骤
# 构建镜像
docker build -t my-python-app .
# 运行容器
docker run -p 8000:8000 -d my-python-app
场景四:带数据库的应用(使用 Docker Compose)
version: '3'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://postgres:postgres@db:5432/mydb
depends_on:
- db
db:
image: postgres:15
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=postgres
- POSTGRES_USER=postgres
- POSTGRES_DB=mydb
ports:
- "5432:5432"
volumes:
postgres_data:
构建和运行步骤
# 构建并启动所有服务
docker-compose up -d
# 查看日志
docker-compose logs -f
# 停止所有服务
docker-compose down
场景五:Java Spring Boot 应用
FROM maven:3.8.5-openjdk-17 AS build
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn package -DskipTests
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY --from=build /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
构建和运行步骤
# 构建镜像
docker build -t my-spring-app .
# 运行容器
docker run -p 8080:8080 -d my-spring-app
场景六:Go 应用
# 构建阶段
FROM golang:1.21-alpine AS build
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o /go/bin/app
# 最终阶段
FROM alpine:3.18
COPY --from=build /go/bin/app /app
EXPOSE 8080
CMD ["/app"]
构建和运行步骤
# 构建镜像
docker build -t my-go-app .
# 运行容器
docker run -p 8080:8080 -d my-go-app
部署到生产环境的最佳实践
- 使用多阶段构建:减小最终镜像大小
- 不要使用 root 用户:在 Dockerfile 中添加非特权用户
- 使用 .dockerignore 文件:排除不必要的文件
- 设置健康检查:使用 HEALTHCHECK 指令
- 使用环境变量:通过环境变量注入配置
- 使用 Docker Compose 或 Kubernetes:管理多容器应用
- 使用 Docker 卷:持久化数据
常见问题排查
# 查看容器日志
docker logs <container_id>
# 进入容器内部
docker exec -it <container_id> /bin/sh
# 检查容器状态
docker ps -a
# 检查镜像列表
docker images
通过以上步骤,您可以将几乎任何类型的应用程序打包成 Docker 镜像并部署到容器中。根据您的具体项目类型和需求,可能需要对 Dockerfile 进行一些调整。