尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Docker-LAMP启动流程揭秘:run.sh逐行解读,容器启动的30秒内到底发生了什么

Docker-LAMP启动流程揭秘:run.sh逐行解读,容器启动的30秒内到底发生了什么 Docker-LAMP启动流程揭秘run.sh逐行解读容器启动的30秒内到底发生了什么【免费下载链接】docker-lampA simple LAMP image using Ubuntu, Apache, PHP and MySql in a single image项目地址: https://gitcode.com/gh_mirrors/do/docker-lampDocker-LAMP 是一个把 Apache、MySQL、PHP 打进同一镜像的轻量 LAMP 栈镜像。这篇文章带你逐段拆解容器启动脚本supporting_files/run.sh看 Docker-LAMP 在docker run之后那 30 秒里到底做了什么从修改 PHP 配置、初始化 MySQL 数据目录到 supervisord 进程管理器接管 Apache 与 MySQL 双进程。 先看全景Docker-LAMP 的四步启动流程在逐行解读之前先给你一张全景图。容器从启动到可用的完整链路是入口脚本2004/Dockerfile中一行CMD [/run.sh]决定了容器启动时执行的第一个脚本预检与调优run.sh修改 PHP、Apache、MySQL 的配置处理用户权限数据库初始化首次启动时创建 MySQL 数据目录和管理员账号进程托管把控制权交给 supervisord并行拉起 Apache 和 MySQL并保证崩溃自动重启下面按时间顺序拆解每一步。① 入口Dockerfile 里的交接棒在 2004/Dockerfile 的末尾可以看到启动的关键信息EXPOSE 80 3306对外声明 Web 与数据库端口VOLUME [/var/lib/mysql, /app]声明两个数据卷MySQL 数据和应用代码CMD [/run.sh]容器启动时执行的主脚本也就是说你执行docker run的那一刻容器里的第一个真正工作的进程就是run.sh。② 前 10 秒给 PHP 和 Apache 做体检supporting_files/run.sh的前半段几乎都在用sed做配置替换PHP 上传与 POST 大小把upload_max_filesize和post_max_size改成环境变量PHP_UPLOAD_MAX_FILESIZE、PHP_POST_MAX_SIZE的值Dockerfile 中默认都是 10M同时把时区设为 Europe/London双份 php.ini分别修改 Apache 模块版/etc/php/x/apache2/php.ini和命令行版/etc/php/x/cli/php.ini保证 Web 和 CLI 行为一致Apache 运行组把APACHE_RUN_GROUP从www-data改为staff方便与宿主机挂载目录的权限配合网站根目录如果设置了APACHE_ROOT会把/var/www/html软链到/app下对应目录phpMyAdmin 密钥自动为 phpMyAdmin 生成blowfish_secret用时间戳做 md5省去了手动配置这一阶段全是文件级别的修改速度很快通常几秒内完成。③ 中间 10 秒用户、权限与网络配置接下来run.sh处理权限和网络这是很多镜像启动失败的重灾区创建 MySQL 运行目录/var/run/mysqld并把数据目录权限设为 770普通模式把/var/www、/app、/var/lib/mysql的属主改为www-data:staff——注意这个镜像里 MySQL 也是以www-data用户运行的通过修改mysqld.cnf中的user实现Vagrant 模式如果设置了VAGRANT_OSX_MODE则改用usermod/groupmod调整 UID/GID适配 macOS 本地挂载网络配置Apache 改为Listen 0.0.0.0:80只监听 IPv4避免容器内 IPv6 问题MySQL 的bind-address也改为0.0.0.0让外部可以连入④ 关键分支这是首次启动吗这是整个启动流程中最重要的一段判断——检查/var/lib/mysql/mysql目录是否存在首次启动空数据卷执行mysqld --initialize-insecure初始化数据目录若失败则回退到mysql_install_db调用supporting_files/mysql_init.sh它会后台启动mysqld_safe每 5 秒探测一次直到 MySQL 真正就绪创建admin用户密码取环境变量MYSQL_ADMIN_PASS未设置则用pwgen随机生成 12 位密码给 phpMyAdmin 的pma用户授权如果设置了CREATE_MYSQL_BASIC_USER_AND_DB、MYSQL_USER_NAME、MYSQL_USER_DB、MYSQL_USER_PASS自动创建应用用户和数据库如果挂载了/db/init.sql立即执行该 SQL 脚本最后把数据库密码打印到容器日志然后关闭 MySQL非首次启动已有数据卷直接输出Using an existing volume of MySQL跳过整个初始化——这正是官方文档强调init.sql只在容器首次启动时执行的原因。⑤ 收尾supervisord 接管一切run.sh的最后一行是整个脚本的点睛之笔exec supervisord -n-n表示前台运行supervisord 取代run.sh成为容器的 1 号进程。它会加载supporting_files/supervisord.conf并包含两个子配置进程启动脚本启动方式Apachesupporting_files/start-apache2.sh读取 envvars 后apache2 -D FOREGROUND前台运行MySQLsupporting_files/start-mysqld.sh通过pidproxy包装mysqld_safe让 supervisord 能正确监控 PID两个进程都配置了autostarttrue和autorestarttrue——也就是说即使 Apache 或 MySQL 中途崩溃supervisord 会自动把它们拉起来。你可以在容器里用supervisorctl status随时查看两个进程的健康状态测试脚本tests/_helpers.sh里就是用这一条命令做轮询的。⑥ 30 秒时间轴一次完整启动把上面的过程串起来时间轴大致是这样时间发生了什么0sdocker run执行run.sh开始运行0~5sPHP/Apache/MySQL 配置修改权限设置5~20s仅首次MySQL 数据目录初始化、admin 用户创建、init.sql执行20~25ssupervisord 启动成为 1 号进程25~30sApache 监听 80 端口MySQL 监听 3306 端口服务全部就绪第二次及以后重启时由于跳过了初始化阶段通常几秒内就能就绪。⑦ 常见问题速查忘记 admin 密码怎么办运行docker logs 容器ID密码打印在日志开头。这是mysql_init.sh特意留给你的取回通道。为什么首次启动明显更慢首次启动要完成 MySQL 数据目录初始化和用户创建把数据卷/var/lib/mysql挂载到宿主机后第二次启动就快了。为什么我挂载的 init.sql 没有执行它只在容器首次启动时运行。如果/var/lib/mysql已有初始化数据脚本会直接跳过。服务状态怎么查docker exec 容器ID supervisorctl statusApache 和 MySQL 的运行/重启状态一目了然。小结Docker-LAMP 的启动设计其实是一个很经典的单容器多服务范式run.sh负责一次性的配置修正与数据初始化supervisord 负责持续性的进程监控与自愈。理解了这条链路你再看任何单镜像多服务的 Docker 镜像比如 NginxNode、Redis管理端都能快速摸清它的启动套路。 延伸阅读完整配置清单在supporting_files/目录下构建与测试编排见docker-compose.test.yml端到端验收逻辑见tests/test.sh。【免费下载链接】docker-lampA simple LAMP image using Ubuntu, Apache, PHP and MySql in a single image项目地址: https://gitcode.com/gh_mirrors/do/docker-lamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表