You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求协助编写含MySQL配置的PHP7.4+Apache2+MySQL8单容器Dockerfile

Dockerfile for PHP7.4 + Apache2 + MySQL8 (Single Container)

实现思路

Docker容器默认以单个进程运行,因此使用supervisord作为进程管理器,同时管控Apache和MySQL两个服务。以下是完整的配置文件及使用说明:


Dockerfile

# 基于Ubuntu 20.04构建,自带PHP7.4和MySQL8官方包
FROM ubuntu:20.04

# 禁用交互式安装提示
ENV DEBIAN_FRONTEND=noninteractive

# 更新系统并安装依赖软件
RUN apt-get update && apt-get install -y \
    apache2 \
    php7.4 \
    php7.4-mysql \
    php7.4-cli \
    php7.4-curl \
    php7.4-gd \
    php7.4-mbstring \
    php7.4-xml \
    mysql-server-8.0 \
    supervisor \
    && rm -rf /var/lib/apt/lists/*

# 配置Apache:启用PHP模块,修改网站根目录
RUN a2enmod php7.4
RUN sed -i 's/\/var\/www\/html/\/var\/www\/app/g' /etc/apache2/sites-available/000-default.conf
RUN mkdir -p /var/www/app

# 配置MySQL:允许容器内外访问,调整字符集和连接数
RUN sed -i 's/bind-address\s*=\s*127.0.0.1/bind-address = 0.0.0.0/' /etc/mysql/mysql.conf.d/mysqld.cnf
RUN echo "[mysqld]" >> /etc/mysql/mysql.conf.d/mysqld.cnf \
    && echo "max_connections = 200" >> /etc/mysql/mysql.conf.d/mysqld.cnf \
    && echo "character-set-server = utf8mb4" >> /etc/mysql/mysql.conf.d/mysqld.cnf \
    && echo "collation-server = utf8mb4_unicode_ci" >> /etc/mysql/mysql.conf.d/mysqld.cnf

# 复制MySQL初始化脚本并赋予执行权限
COPY init-mysql.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/init-mysql.sh

# 复制supervisord配置文件
COPY supervisord.conf /etc/supervisor/conf.d/

# 暴露端口:Apache(80)、MySQL(3306)
EXPOSE 80 3306

# 启动流程:先初始化MySQL,再用supervisord管理服务
ENTRYPOINT ["/usr/local/bin/init-mysql.sh"]
CMD ["supervisord", "-n"]

init-mysql.sh(MySQL初始化脚本)

#!/bin/bash

# 临时启动MySQL进行初始化
service mysql start

# 设置root密码(默认值为root,可通过环境变量覆盖)
MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-root}
mysql -u root <<EOF
ALTER USER 'root'@'localhost' IDENTIFIED BY '$MYSQL_ROOT_PASSWORD';
FLUSH PRIVILEGES;
EOF

# 创建自定义数据库(如果设置了MYSQL_DATABASE环境变量)
if [ -n "$MYSQL_DATABASE" ]; then
    mysql -u root -p$MYSQL_ROOT_PASSWORD <<EOF
CREATE DATABASE IF NOT EXISTS $MYSQL_DATABASE CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
EOF
fi

# 创建自定义数据库用户(如果设置了MYSQL_USER和MYSQL_PASSWORD环境变量)
if [ -n "$MYSQL_USER" ] && [ -n "$MYSQL_PASSWORD" ]; then
    mysql -u root -p$MYSQL_ROOT_PASSWORD <<EOF
CREATE USER IF NOT EXISTS '$MYSQL_USER'@'%' IDENTIFIED BY '$MYSQL_PASSWORD';
GRANT ALL PRIVILEGES ON $MYSQL_DATABASE.* TO '$MYSQL_USER'@'%';
FLUSH PRIVILEGES;
EOF
fi

# 停止临时MySQL服务,等待supervisord重新启动
service mysql stop

# 执行容器启动命令
exec "$@"

supervisord.conf(进程管理配置)

[supervisord]
nodaemon=true

[program:apache2]
command=/usr/sbin/apache2ctl -D FOREGROUND
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/apache2.log
stderr_logfile=/var/log/supervisor/apache2.err

[program:mysql]
command=/usr/sbin/mysqld --user=mysql
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/mysql.log
stderr_logfile=/var/log/supervisor/mysql.err

使用步骤

  1. 将上述三个文件放在同一目录下。
  2. 构建镜像:
    docker build -t php-apache-mysql .
    
  3. 运行容器(可自定义环境变量和挂载目录):
    docker run -d \
      -p 8080:80 \
      -p 33060:3306 \
      -e MYSQL_ROOT_PASSWORD=myrootpass \
      -e MYSQL_DATABASE=mydb \
      -e MYSQL_USER=myuser \
      -e MYSQL_PASSWORD=mypass \
      -v $(pwd)/app:/var/www/app \
      php-apache-mysql
    
    • -p 8080:80:本地8080端口映射容器Apache服务
    • -p 33060:3306:本地33060端口映射容器MySQL服务
    • -v $(pwd)/app:/var/www/app:本地app目录挂载为网站根目录
    • 若需持久化MySQL数据,添加:-v $(pwd)/mysql-data:/var/lib/mysql

注意事项

单容器运行多服务不适合生产环境,违反Docker“单容器单进程”的设计原则,不利于服务扩展、监控和故障排查。生产环境建议用Docker Compose分别部署PHP-Apache和MySQL独立容器。

内容的提问来源于stack exchange,提问作者bruce wayne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 10:18:31