Docker部署Zabbix遇MySQL连接失败问题求助
解决Zabbix服务无法连接MySQL容器的问题
问题现象
执行sudo docker-compose up后,MySQL容器正常启动,但zabbix-server和zabbix-web-nginx-mysql持续报错:
MySQL server is not available. Waiting 5 seconds...
核心错误点及修复方案
1. 容器间网络访问逻辑错误
Docker Compose默认创建独立的内部网络,容器不能用127.0.0.1访问其他容器,必须使用服务名称(即yaml中定义的mysql)作为主机名。你注释掉了DB_SERVER_HOST,导致Zabbix默认尝试连接容器自身的127.0.0.1,自然找不到MySQL服务。
2. TLS配置不匹配
zabbix-server设置了ZBX_DBTLSCONNECT: 'required',但MySQL容器默认未启用TLS加密,导致连接握手失败。要么禁用TLS,要么给MySQL配置对应证书。
3. 服务就绪检测缺失
depends_on仅保证容器启动顺序,不确保MySQL服务完全就绪。需要给MySQL添加健康检查,让Zabbix服务等MySQL真正可用后再启动。
4. 环境变量拼写错误
zabbix-web中的BX_DB_ENCRYPTION是笔误,正确变量名为ZBX_DB_ENCRYPTION。
5. Zabbix Agent连接目标错误
Agent容器内的ZBX_SERVER_HOST: '127.0.0.1'指向的是Agent自身容器,应改为zabbix-server的服务名zabbix-server。
修改后的完整docker-compose.yml
version: '3' services: mysql: container_name: 'MySQL' image: 'mysql' environment: MYSQL_DATABASE: 'zabbix_db' MYSQL_USER: 'zabbix_user' MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' MYSQL_PASSWORD: 'zabbix_password' volumes: - './mysql:/var/lib/mysql' ports: - '3306:3306' restart: 'on-failure' # 添加健康检查,确保MySQL服务就绪 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "zabbix_user", "-pzabbix_password"] interval: 5s timeout: 5s retries: 5 zabbix-server: container_name: 'Zabbix-server' image: 'zabbix/zabbix-server-mysql' environment: # 暂时禁用TLS,若需启用需同步配置MySQL证书 # ZBX_DBTLSCONNECT: 'required' DB_SERVER_HOST: 'mysql' # 使用MySQL服务名访问 DB_SERVER_PORT: '3306' MYSQL_USER: 'zabbix_user' MYSQL_PASSWORD: 'zabbix_password' MYSQL_DATABASE: 'zabbix_db' ports: - '10051:10051' depends_on: mysql: condition: service_healthy # 等待MySQL健康检查通过 zabbix-web-nginx-mysql: container_name: 'zabbix-web-nginx-mysql' image: 'zabbix/zabbix-web-nginx-mysql' environment: ZBX_DB_ENCRYPTION: 'false' # 修正变量名,同步禁用加密 ZBX_SERVER_HOST: 'zabbix-server' # 使用Zabbix Server服务名 ZBX_SERVER_PORT: '10051' DB_SERVER_HOST: 'mysql' # 使用MySQL服务名访问 DB_SERVER_PORT: '3306' MYSQL_DATABASE: 'zabbix_db' MYSQL_USER: 'zabbix_user' MYSQL_PASSWORD: 'zabbix_password' PHP_TZ: 'Asia/Tehran' depends_on: mysql: condition: service_healthy zabbix-server: condition: service_started ports: - '8080:8080' zabbix-agent: container_name: 'Zabbix-agent' image: 'zabbix/zabbix-agent' environment: ZBX_HOSTNAME: 'srv197189' ZBX_SERVER_HOST: 'zabbix-server' # 使用Zabbix Server服务名 ZBX_ACTIVESERVERS: 'zabbix-server:10051'
额外说明
- 若需启用MySQL TLS加密,需给MySQL容器挂载证书文件并配置对应环境变量,同时Zabbix服务也要配置
ZBX_DBTSLCERTFILE等TLS参数。 - 若要让Zabbix容器连接宿主机的MySQL,需使用宿主机的实际IP(而非127.0.0.1),Linux环境需额外配置Docker网络访问权限,Windows/macOS可使用
host.docker.internal作为主机名。
内容的提问来源于stack exchange,提问作者RezaRastgoo
相关产品推荐
相关产品推荐

