php连接docker运行的mysql,显示(HY000/2002): Connection refused的解决办法

在Docker环境下,PHP应用连接MySQL不能使用localhost或127.0.0.1,而应使用母机IP或MySQL容器名。本文介绍如何在docker-compose.yml中配置PHP与MySQL容器,并解释正确的连接方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • php要连接docker中运行的mysql是不能用localhost, 127.0.0.1来连接的,因为每个docker运行容器的localhost 127.0.0.1都是自己容器本身,不是mysql容器,需要修改成母机 IP,或者是mysql容器名称

  • 比如有如下的docker-compose.yml

version: '3'

services:
  mysql:
#   build: ./mysql
    image: daocloud.io/library/mysql:5.7.20
    volumes:
      - ./mysql/conf:/etc/mysql
      - ./mysql/data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root
    ports:
      - "3306:3306"
    networks:
      - lnmp

  php54:
    build: ./php54
#  # 使用宿主:容器 (HOST:CONTAINER)格式或者仅仅指定容器的端口(宿主将会随机选择端口)都可以
#  # 开放9000端口
    ports:
      - "9005:9000"
#  # 此处实现文件夹代码目录映射
    volumes:
      - ../:/data
      - ./php54/hosts:/etc/hosts
      - ./php54/etc/php/php.ini:/usr/local/etc/php/php.ini
      - ./php54/etc/php-fpm.conf:/usr/local/etc/php-fpm.conf
    links:
      - mysql
    privileged: true
    networks:
      - lnmp
  nginx:
    build: ./nginx
  # 此处实现文件夹代码目录映射
    volumes:
      - ../:/data
      - ./php54/hosts:/etc/hosts
    links:
      - php54:php54
    privileged: true
    ports:
      - "80:80"
    networks:
      - lnmp

networks:
  lnmp:
    driver: bridge
  • php中连接的 mysql 地址就是 mysql就可以连接了,不用 localhost 或127.0.0.1

参考文献:

https://www.cnblogs.com/imbin/p/8299141.html

### Docker推送镜像时连接被拒绝的问题分析与解决 在Docker推送镜像时遇到`connection refused`错误,通常是因为目标镜像仓库未正确配置或未运行。以下是对该问题的详细分析和解决方案。 #### 1. 确认Docker守护进程是否监听端口5000 默认情况下,Docker守护进程不会监听自定义端口(如5000)。如果需要使用特定端口进行镜像推送,必须明确配置Docker守护进程以监听该端口。可以通过修改Docker的配置文件实现此目的[^4]。 ```bash # 编辑Docker配置文件(以Ubuntu为例) sudo nano /etc/docker/daemon.json ``` 在文件中添加以下内容以启用端口5000: ```json { "hosts": ["tcp://0.0.0.0:5000", "unix:///var/run/docker.sock"] } ``` 保存文件后重启Docker服务以应用更改: ```bash sudo systemctl restart docker ``` #### 2. 检查目标镜像仓库是否运行 如果目标是本地私有镜像仓库(例如通过`docker registry`运行),需要确保该服务已启动并正在监听端口5000。可以使用以下命令检查: ```bash docker ps | grep registry ``` 如果没有找到相关容器,可以启动一个本地镜像仓库: ```bash docker run -d -p 5000:5000 --name registry registry:2 ``` #### 3. 验证网络连接 确认客户端能够访问目标端口5000。可以使用以下命令测试连接: ```bash telnet localhost 5000 ``` 如果连接失败,可能是防火墙阻止了该端口的流量。检查并调整防火墙规则以允许端口5000的流量: ```bash sudo ufw allow 5000/tcp ``` #### 4. 配置Docker客户端以使用自定义镜像仓库 在推送镜像之前,需要标记镜像以匹配目标仓库的地址。例如,如果目标仓库运行在`localhost:5000`,可以执行以下命令: ```bash docker tag <image_id> localhost:5000/<repository_name>:<tag> ``` 然后执行推送命令: ```bash docker push localhost:5000/<repository_name>:<tag> ``` #### 5. 排查代理设置冲突 如果系统中启用了HTTP/HTTPS代理,可能会干扰Docker与目标仓库的通信。可以通过检查Docker配置文件中的代理设置来排查问题[^2]。 ```json { "proxies": { "default": { "httpProxy": "", "httpsProxy": "", "noProxy": "localhost,127.0.0.1" } } } ``` 确保`localhost`和`127.0.0.1`包含在`noProxy`列表中。 #### 6. 检查Docker版本兼容性 某些版本的Docker可能存在与特定功能的兼容性问题。建议升级到最新稳定版本以避免潜在问题[^4]。 ```bash sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io ``` --- ### 示例代码 以下是一个完整的流程示例,展示如何配置和推送镜像到本地私有仓库: ```bash # 启动本地镜像仓库 docker run -d -p 5000:5000 --name registry registry:2 # 标记镜像 docker tag my-image localhost:5000/my-image:latest # 推送镜像 docker push localhost:5000/my-image:latest ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值