docker-compose 使用links mysql 111 (Connection refused) 解决方案

在使用Docker部署LPOJ时遇到连接MySQL的难题,文章详细记录了从排查bind-address设置,到检查links正确性,最终定位到端口映射问题的全过程,并分享了解决方案。

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

记一次惨痛的Debug历史

LPOJ网址:www.lpoj.cn
LPOJ文档:docs.lpoj.cn

这是在使用Docker部署LPOJ时发现的一个Bug

这是docker-compose文件简写

version: '2'
services:
  db:
    image: ccr.ccs.tencentyun.com/lpoj/database
    command: --default-authentication-plugin=mysql_native_password
    environment:
            MYSQL_ROOT_PASSWORD: "lpojdatabase"
    ports:
     - "4406:3306"
    restart: always
    volumes:
        - "./Database/data:/var/lib/mysql"
        - "./Database/conf:/etc/mysql/conf.d"

  backend:
    image: ccr.ccs.tencentyun.com/lpoj/backend
    depends_on: 
       - db
    command: >
      '
      python manage.py runserver 0.0.0.0:8000
      '
    
    links: 
      - db:lpojdatabase 
    environment:
            DB_PASSWORD: "lpojdatabase"
            DB_HOST: "lpojdatabase" 
            DB_USER: 'root' 
            DB_PORT: 4406
    ports:
     - "8000:8000"
    restart: always
    volumes:
        - "./Backend:/Backend"


    

看似没毛病的配置实际上毛病一大堆

在启动Django容器的时候,不断地报

Can’t connect to MySQL server on 'lpojdatabase' (111 “Connection refused”)

的错误

排除问题 bind-address

网上关于 111 Connection refused 大多数是查看mysql的配置文件是否已经 把bind-address给设为0.0.0.0以提供外网访问,但是配置过后仍然不行

排除问题 links

所以会不会是links的姿势不对呢?所以我进到django的容器中,执行ping lpojdatabase,竟然ping成功了,所以是连不上数据库

排除问题 port

所以有可能是端口问题

在django容器中执行如下命令

curl lpojdatabase:4406 没有返回结果,但是执行
curl lpojdatabase:3306 返回了关于mysql的结果!!

所以是端口配置出问题了!!!

links走的不再是主机的网络,而是直接指向到数据库的容器中,因此端口使用的应该是容器中的端口,而不是主机上映射的端口。。

修改成如下配置后问题解决

services:
  db:
    ports:
     - "4406:3306"

  backend:
    links: 
      - db:lpojdatabase 
    environment:
            DB_PASSWORD: "lpojdatabase" 
            DB_HOST: "lpojdatabase" 
            DB_USER: 'root' 
            DB_PORT: 3306 # 这里不能写4406,应该是容器内的端口3306
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值