Docker容器化遗留应用(四):实战案例
系列导读
这是《Docker容器化遗留应用》系列的第四篇,前几篇介绍了容器化基础,本篇将通过实战案例演示如何容器化真实应用。
案例1:Apache服务器容器化
场景描述
一个运行了5年的Apache服务器,配置复杂,依赖特定版本的PHP模块。需要在不修改代码的情况下容器化。
步骤一:准备工作
mkdir dockerized-apache && cd dockerized-apache
步骤二:编写Dockerfile
FROM ubuntu:20.04
# 避免交互式提示
ENV DEBIAN_FRONTEND=noninteractive
# 安装Apache和PHP
RUN apt-get update && \
apt-get install -y apache2 php libapache2-mod-php && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# 复制配置文件
COPY ./my-httpd.conf /etc/apache2/apache2.conf
COPY ./html/ /var/www/html/
# 暴露端口
EXPOSE 80
# 启动Apache(前台运行)
CMD ["apachectl", "-D", "FOREGROUND"]
步骤三:构建与运行
# 构建镜像
docker build -t dockerized-apache .
# 运行容器
docker run -d -p 8080:80 --name my-apache dockerized-apache
# 测试访问
curl http://localhost:8080
案例2:数据库容器化
开发环境 vs 生产环境
| 环境 | 推荐方案 | 理由 |
|---|---|---|
| 开发 | 容器化数据库 | 快速启停,易于重置 |
| 测试 | 容器化数据库 | 隔离测试数据 |
| 生产 | 托管数据库服务 | 自动备份、高可用 |
数据迁移:平滑过渡
# 从现有数据库导出数据
mysqldump -u root -p mydb > backup.sql
# 启动新的MySQL容器
docker run -d --name my-mysql \
-e MYSQL_ROOT_PASSWORD=mypassword \
-v mysql-data:/var/lib/mysql \
mysql:8.0
# 导入数据
docker exec -i my-mysql mysql -u root -pmypassword < backup.sql
配置灵活性
# 开发环境:使用容器化数据库
docker run -d --name dev-db \
-e MYSQL_ROOT_PASSWORD=dev mysql:8.0
# 生产环境:连接托管数据库
docker run -d --name prod-app \
-e DB_HOST=my-rds-instance.amazonaws.com \
-e DB_PASSWORD=${DB_PASSWORD} \
my-app
配置与环境变量管理
环境变量注入
# 通过-e参数注入
docker run -d --name my-app \
-e DB_HOST=database.local \
-e DB_PASSWORD=${DB_PASSWORD} \
my-application
使用.env文件
# .env文件
DB_HOST=database.local
DB_PASSWORD=supersecret
API_KEY=abc123
# docker-compose.yml
services:
app:
image: my-application
environment:
- DB_HOST=${DB_HOST}
- DB_PASSWORD=${DB_PASSWORD}
配置文件挂载
# 挂载主机配置文件
docker run -d --name my-app \
-v /path/to/config:/app/config:ro \
my-application
安全提示:敏感信息不要硬编码在Dockerfile中,使用环境变量或密钥管理服务。
安全加固措施
1. 镜像安全
# 使用Docker Scout扫描漏洞
docker scout cves my-legacy-app
# 使用Clair扫描
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
arminc/clair-local-scan my-legacy-app
2. 最小权限原则
# 创建非root用户
RUN useradd -m myuser
# 切换到非root用户
USER myuser
# 设置工作目录
WORKDIR /home/myuser
3. 能力限制
# 删除所有能力,仅添加必要的
docker run -d --name my-app \
--cap-drop=all \
--cap-add=net_bind_service \
my-application
4. 只读挂载
# 保护配置文件不被篡改
docker run -d --name my-app \
-v /path/to/config:/app/config:ro \
my-application
5. 监控与日志
# 查看容器日志
docker logs -f my-app
# 实时监控资源使用
docker stats my-app
下篇预告
下一篇:《Docker容器化遗留应用(五):综合案例》
将详细介绍:
- 遗留CRM系统容器化全流程
- 系统架构拆分
- 测试与部署
- 效果对比
系列导航
- (一)为什么要容器化 - 容器化优势与基本概念
- (二)容器化三步走 - 从零到一的实践指南
- (三)网络与数据管理 - 容器间通信与持久化
- (四)实战案例 ← 当前
- (五)综合案例 - 遗留CRM系统容器化全流程
通过实战案例,你已经掌握了容器化的核心技术!
Views: 1
