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