Docker容器退出码为0且未暴露9000端口问题求助
排查Docker容器退出码0及9000端口未暴露问题
咱们一步步拆解你遇到的问题,先搞清楚为什么容器会退出码0,再解决端口没法访问的情况:
一、容器退出码0的根源
退出码0意味着容器的主进程正常终止了。你一开始用的CMD ["/usr/sbin/php-fpm", "-O" ],在CentOS 7的环境里,php-fpm默认是后台运行的——它启动后会把自己变成守护进程,原来的主进程就结束了,Docker容器自然跟着停止(因为Docker只盯着主进程的状态)。
你改成--nodaemonize(强制前台运行)的方向完全正确,这也是为什么容器现在不退出了。
二、解决9000端口未暴露的问题
现在容器能保持运行,但端口访问不了,咱们从这几个方向查:
1. 先确认php-fpm真的在监听9000端口
先进入容器内部,检查端口监听状态:
# 用netstat(如果没装先执行yum install net-tools) docker exec -it php-phalcon netstat -tulpn | grep 9000 # 或者CentOS 7更常用的ss命令 docker exec -it php-phalcon ss -tulpn | grep 9000
如果没返回结果,说明php-fpm根本没在监听9000,得检查配置:
- 打开你挂载的
z-overrides.conf或者默认的/etc/php/7.3/fpm/pool.d/www.conf,找listen参数:- 如果是
listen = 127.0.0.1:9000,那只有容器内部能访问,外部(包括宿主机)连不上,得改成listen = 0.0.0.0:9000(监听所有网卡)。
- 如果是
- 查看php-fpm的启动日志,看有没有报错:
docker logs php-phalcon # 或者直接看容器内的日志文件 docker exec -it php-phalcon cat /var/log/php-fpm/www-error.log
2. 别忘了在docker-compose里加端口映射
你当前的docker-compose.yml里没有ports配置!Docker不会自动把容器内的端口暴露给宿主机,必须显式声明:
php-phalcon: build: docker/php-phalcon container_name: php-phalcon working_dir: /application volumes: - ./application:/application - ./docker/php-phalcon/php-ini-overrides.ini:/etc/php/7.3/fpm/conf.d/99-overrides.ini ports: - "9000:9000" # 格式:宿主机端口:容器内端口
加了这个之后,宿主机才能通过9000端口访问容器里的php-fpm。
3. 排查CentOS的防火墙和SELinux
CentOS 7默认开着firewalld和SELinux,可能会拦截端口访问:
- 临时关闭firewalld测试:
systemctl stop firewalld
- 临时关闭SELinux测试:
setenforce 0
如果关闭后能访问了,再去做持久化配置:
- 给firewalld添加端口规则:
firewall-cmd --permanent --add-port=9000/tcp && firewall-cmd --reload - 调整SELinux策略(如果需要):
setsebool -P httpd_can_network_connect 1
三、几个优化小建议
- 把Dockerfile里的启动命令改成更清晰的前台模式,同时强制日志输出到stderr,方便排查:
CMD ["/usr/sbin/php-fpm", "--nodaemonize", "--force-stderr"]
- 在docker-compose里加上自动重启规则,避免容器意外退出:
php-phalcon: # ...其他配置 restart: unless-stopped
内容的提问来源于stack exchange,提问作者Aleksandr Popov
相关产品推荐
相关产品推荐

