Apache Docker 部署 #
Docker 部署概述 #
为什么使用 Docker? #
text
┌─────────────────────────────────────────────────────────────┐
│ Docker 部署优势 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 环境一致性 │
│ ├── 开发、测试、生产环境统一 │
│ ├── 消除"在我机器上能运行"的问题 │
│ └── 版本控制 │
│ │
│ 快速部署 │
│ ├── 秒级启动 │
│ ├── 快速扩展 │
│ └── 回滚方便 │
│ │
│ 资源隔离 │
│ ├── 进程隔离 │
│ ├── 网络隔离 │
│ └── 文件系统隔离 │
│ │
│ 便于管理 │
│ ├── 标准化部署流程 │
│ ├── CI/CD 集成 │
│ └── 微服务架构 │
│ │
└─────────────────────────────────────────────────────────────┘
基础镜像使用 #
使用官方镜像 #
bash
# 拉取官方镜像
docker pull httpd:2.4
# 运行简单容器
docker run -d --name my-apache \
-p 80:80 \
httpd:2.4
# 挂载本地目录
docker run -d --name my-apache \
-p 80:80 \
-v /path/to/website:/usr/local/apache2/htdocs \
httpd:2.4
# 挂载配置文件
docker run -d --name my-apache \
-p 80:80 \
-v /path/to/httpd.conf:/usr/local/apache2/conf/httpd.conf \
-v /path/to/htdocs:/usr/local/apache2/htdocs \
httpd:2.4
官方镜像目录结构 #
text
/usr/local/apache2/
├── bin/ # 可执行文件
├── conf/ # 配置文件
│ ├── httpd.conf
│ ├── extra/
│ └── original/
├── htdocs/ # 文档根目录
├── logs/ # 日志目录
└── modules/ # 模块目录
Dockerfile 编写 #
基础 Dockerfile #
dockerfile
# ============================================
# 基础 Apache Dockerfile
# ============================================
FROM httpd:2.4
# 复制配置文件
COPY httpd.conf /usr/local/apache2/conf/httpd.conf
# 复制网站文件
COPY htdocs/ /usr/local/apache2/htdocs/
# 暴露端口
EXPOSE 80
# 启动命令
CMD ["httpd-foreground"]
带自定义配置的 Dockerfile #
dockerfile
# ============================================
# 自定义配置 Apache Dockerfile
# ============================================
FROM httpd:2.4
# 维护者信息
LABEL maintainer="admin@example.com"
# 安装必要工具
RUN apt-get update && apt-get install -y \
vim \
curl \
&& rm -rf /var/lib/apt/lists/*
# 复制配置文件
COPY conf/httpd.conf /usr/local/apache2/conf/httpd.conf
COPY conf/extra/ /usr/local/apache2/conf/extra/
# 复制网站文件
COPY htdocs/ /usr/local/apache2/htdocs/
# 创建日志目录
RUN mkdir -p /usr/local/apache2/logs
# 设置权限
RUN chown -R www-data:www-data /usr/local/apache2/htdocs
# 暴露端口
EXPOSE 80 443
# 健康检查
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost/ || exit 1
# 启动命令
CMD ["httpd-foreground"]
带 SSL 的 Dockerfile #
dockerfile
# ============================================
# HTTPS Apache Dockerfile
# ============================================
FROM httpd:2.4
# 复制配置文件
COPY conf/httpd.conf /usr/local/apache2/conf/httpd.conf
COPY conf/extra/httpd-ssl.conf /usr/local/apache2/conf/extra/
# 复制证书
COPY ssl/server.crt /usr/local/apache2/conf/server.crt
COPY ssl/server.key /usr/local/apache2/conf/server.key
# 复制网站文件
COPY htdocs/ /usr/local/apache2/htdocs/
# 暴露端口
EXPOSE 80 443
CMD ["httpd-foreground"]
带 PHP 的 Dockerfile #
dockerfile
# ============================================
# Apache + PHP Dockerfile
# ============================================
FROM php:8.1-apache
# 安装 PHP 扩展
RUN docker-php-ext-install mysqli pdo pdo_mysql
# 启用 Apache 模块
RUN a2enmod rewrite headers expires deflate
# 复制配置文件
COPY conf/php.ini /usr/local/etc/php/php.ini
COPY conf/apache2.conf /etc/apache2/apache2.conf
# 复制网站文件
COPY src/ /var/www/html/
# 设置权限
RUN chown -R www-data:www-data /var/www/html
# 暴露端口
EXPOSE 80
CMD ["apache2-foreground"]
Docker Compose 配置 #
基础 Docker Compose #
yaml
# ============================================
# 基础 docker-compose.yml
# ============================================
version: '3.8'
services:
apache:
image: httpd:2.4
container_name: apache-server
ports:
- "80:80"
volumes:
- ./htdocs:/usr/local/apache2/htdocs
- ./conf/httpd.conf:/usr/local/apache2/conf/httpd.conf
restart: always
完整 Docker Compose #
yaml
# ============================================
# 完整 docker-compose.yml
# ============================================
version: '3.8'
services:
apache:
build:
context: .
dockerfile: Dockerfile
container_name: apache-server
ports:
- "80:80"
- "443:443"
volumes:
- ./htdocs:/usr/local/apache2/htdocs
- ./conf:/usr/local/apache2/conf
- ./logs:/usr/local/apache2/logs
- ./ssl:/usr/local/apache2/ssl
environment:
- TZ=Asia/Shanghai
restart: always
networks:
- web-network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/"]
interval: 30s
timeout: 10s
retries: 3
networks:
web-network:
driver: bridge
Apache + PHP + MySQL #
yaml
# ============================================
# Apache + PHP + MySQL
# ============================================
version: '3.8'
services:
apache:
image: php:8.1-apache
container_name: web-server
ports:
- "80:80"
volumes:
- ./src:/var/www/html
- ./php.ini:/usr/local/etc/php/php.ini
environment:
- DB_HOST=mysql
- DB_NAME=mydb
- DB_USER=user
- DB_PASS=password
depends_on:
- mysql
networks:
- app-network
restart: always
mysql:
image: mysql:8.0
container_name: mysql-server
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: mydb
MYSQL_USER: user
MYSQL_PASSWORD: password
volumes:
- mysql-data:/var/lib/mysql
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
networks:
- app-network
restart: always
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: phpmyadmin
ports:
- "8080:80"
environment:
PMA_HOST: mysql
depends_on:
- mysql
networks:
- app-network
volumes:
mysql-data:
networks:
app-network:
driver: bridge
反向代理配置 #
yaml
# ============================================
# Apache 反向代理 + 应用服务
# ============================================
version: '3.8'
services:
apache:
image: httpd:2.4
container_name: reverse-proxy
ports:
- "80:80"
- "443:443"
volumes:
- ./conf/httpd.conf:/usr/local/apache2/conf/httpd.conf
- ./ssl:/usr/local/apache2/ssl
depends_on:
- app1
- app2
networks:
- frontend
- backend
restart: always
app1:
image: node:18
container_name: app1
working_dir: /app
volumes:
- ./app1:/app
command: npm start
networks:
- backend
restart: always
app2:
image: python:3.10
container_name: app2
working_dir: /app
volumes:
- ./app2:/app
command: python app.py
networks:
- backend
restart: always
networks:
frontend:
backend:
配置文件示例 #
Docker 环境 httpd.conf #
apache
# ============================================
# Docker 环境 httpd.conf
# ============================================
# 服务器根目录
ServerRoot "/usr/local/apache2"
# 监听端口
Listen 80
# 加载模块
LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule headers_module modules/mod_headers.so
# 服务器名称
ServerName localhost
# 文档根目录
DocumentRoot "/usr/local/apache2/htdocs"
<Directory "/usr/local/apache2/htdocs">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# 日志配置
ErrorLog /proc/self/fd/2
LogLevel warn
# 访问日志
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog /proc/self/fd/1 common
</IfModule>
常用命令 #
容器管理 #
bash
# 构建镜像
docker build -t my-apache .
# 运行容器
docker run -d --name apache -p 80:80 my-apache
# 查看日志
docker logs apache
docker logs -f apache
# 进入容器
docker exec -it apache bash
# 停止容器
docker stop apache
# 启动容器
docker start apache
# 重启容器
docker restart apache
# 删除容器
docker rm apache
# 删除镜像
docker rmi my-apache
Docker Compose 命令 #
bash
# 启动服务
docker-compose up -d
# 停止服务
docker-compose down
# 重启服务
docker-compose restart
# 查看日志
docker-compose logs
docker-compose logs -f apache
# 进入容器
docker-compose exec apache bash
# 构建镜像
docker-compose build
# 查看状态
docker-compose ps
生产环境最佳实践 #
安全配置 #
dockerfile
# ============================================
# 安全配置
# ============================================
FROM httpd:2.4
# 非 root 用户运行
RUN groupadd -r appuser && useradd -r -g appuser appuser
# 最小化镜像
RUN apt-get update && apt-get install -y --no-install-recommends \
curl \
&& rm -rf /var/lib/apt/lists/*
# 只读文件系统
COPY --chown=appuser:appuser htdocs/ /usr/local/apache2/htdocs/
# 安全配置
RUN sed -i 's/^User daemon/User appuser/' /usr/local/apache2/conf/httpd.conf \
&& sed -i 's/^Group daemon/Group appuser/' /usr/local/apache2/conf/httpd.conf
USER appuser
EXPOSE 8080
CMD ["httpd-foreground"]
多阶段构建 #
dockerfile
# ============================================
# 多阶段构建
# ============================================
# 构建阶段
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 运行阶段
FROM httpd:2.4
COPY --from=builder /app/dist /usr/local/apache2/htdocs/
EXPOSE 80
CMD ["httpd-foreground"]
下一步 #
掌握了 Docker 部署后,继续学习 故障排查,了解 Apache 常见问题的排查和解决方法!
最后更新:2026-03-29