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
.idea3. 构建和运行镜像
构建Docker镜像:
bash
docker build -t my-app .运行容器:
bash
docker run -p 3000:3000 my-app4. 使用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 -d5. 优化Docker镜像大小
为了减小镜像大小,我们可以采取以下措施:
- 使用Alpine Linux基础镜像
- 多阶段构建
- 及时清理缓存文件
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. 容器安全最佳实践
- 不要在容器中以root用户身份运行应用
- 定期更新基础镜像
- 扫描镜像中的漏洞
- 使用只读文件系统
dockerfile
# 创建非root用户
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
USER nextjs总结
通过Docker容器化部署,我们可以实现应用的一致性部署和快速扩展。合理使用Docker Compose和优化技巧能够进一步提升部署效率和系统性能。