请求协助编写含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
使用步骤
- 将上述三个文件放在同一目录下。
- 构建镜像:
docker build -t php-apache-mysql . - 运行容器(可自定义环境变量和挂载目录):
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
相关产品推荐
相关产品推荐

