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

记一次惨痛的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
发布了402 篇原创文章 · 获赞 67 · 访问量 16万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 点我我会动 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览