记一次惨痛的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的结果!!
扫描二维码关注公众号,回复:
8962422 查看本文章
所以是端口配置出问题了!!!
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