Skip to content

Docker容器化部署实战

Docker作为一种轻量级虚拟化技术,已经成为现代应用部署的标准方案之一。本文将介绍如何使用Docker容器化部署Web应用。

1. 编写Dockerfile

首先,我们需要为应用编写Dockerfile:

dockerfile
# 使用官方Node.js运行时作为基础镜像
FROM node:16-alpine

# 设置工作目录
WORKDIR /app

# 复制package.json和package-lock.json(如果存在)
COPY package*.json ./

# 安装应用依赖
RUN npm ci --only=production

# 复制应用源代码
COPY . .

# 暴露端口
EXPOSE 3000

# 启动应用
CMD ["node", "server.js"]

2. 使用.dockerignore文件

为了避免将不必要的文件复制到镜像中,我们需要创建.dockerignore文件:

dockerignore
node_modules
npm-debug.log
.git
.gitignore
README.md
.env
.nyc_output
coverage
.nyc_output
.coverage
.vscode
.idea

3. 构建和运行镜像

构建Docker镜像:

bash
docker build -t my-app .

运行容器:

bash
docker run -p 3000:3000 my-app

4. 使用Docker Compose管理多容器应用

对于需要多个服务的应用(如应用服务器、数据库等),可以使用Docker Compose:

yaml
# docker-compose.yml
version: '3.8'

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=mysql://user:password@db:3306/myapp
    depends_on:
      - db

  db:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=rootpassword
      - MYSQL_DATABASE=myapp
      - MYSQL_USER=user
      - MYSQL_PASSWORD=password
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

启动所有服务:

bash
docker-compose up -d

5. 优化Docker镜像大小

为了减小镜像大小,我们可以采取以下措施:

  1. 使用Alpine Linux基础镜像
  2. 多阶段构建
  3. 及时清理缓存文件
dockerfile
# 多阶段构建示例
# 构建阶段
FROM node:16 AS builder

WORKDIR /app
COPY package*.json ./
RUN npm ci

COPY . .
RUN npm run build

# 生产阶段
FROM node:16-alpine

WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

COPY --from=builder /app/dist ./dist

EXPOSE 3000
CMD ["node", "server.js"]

6. 容器安全最佳实践

  1. 不要在容器中以root用户身份运行应用
  2. 定期更新基础镜像
  3. 扫描镜像中的漏洞
  4. 使用只读文件系统
dockerfile
# 创建非root用户
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001

USER nextjs

总结

通过Docker容器化部署,我们可以实现应用的一致性部署和快速扩展。合理使用Docker Compose和优化技巧能够进一步提升部署效率和系统性能。