127.0.0.11:53: no such host
问题描述
err:dial tcp 192.168.112.2:3306: connect: connection refused
使用docker-compose
运行容器,但是在连接数据库的时候一直找不到服务。
报错代码上下文:利用golang容器中连接MySQL容器
dsn := "test:test@tcp(mysql_docker:3306)/test"
db, err := sql.Open("mysql", dsn)
排查过程
53端口是DNS服务,容器一直在本地寻找DNS解析,但是一直解析失败......查看services名称:
mysql:
image: mysql:latest
container_name: mysql_docker
容器名称为mysql_docker,服务名称为mysql。
但是docker-compose的域名解析只会解析服务名称,所以在容器内的DNS找不到mysql_docker这个服务,于是连不上数据库......
解决方案
把主机名改为服务名称:
dsn := "test:test@tcp(mysql:3306)/test"
db, err := sql.Open("mysql", dsn)
3306: connect: connection refused
问题描述
err:dial tcp 192.168.112.2:3306: connect: connection refused
能ping通数据库,但是数据库一直拒绝连接。
golang的容器是在mysql容器之后启动的:
golang:
depends_on:
- mysql
排查过程
多次查看日志发现,golang的启动时间虽然在mysql启动之后,但是mysql容器加载数据库配置信息很慢,还没有给golang容器授权,所以拒绝访问。
解决方案
单独重启golang
容器,等到MySql
授权完全加载完毕了,重新发起请求即可。
或者修改golang
代码,一直发送请求,直到请求成功。
注意:golang
的和php
不一样,golang
在容器中被编译成二进制文件执行,所以在容器内不做特殊处理的话只执行一次请求;而php
在容器内依然是解释执行的,所以php
容器可以不修改代码,直接等待MySql
授权完毕后,刷新网页直接重新执行。但是Golang
要实现重复请求的话需要在代码中体现。
先写这些,后面有空了就来更新
Comments | NOTHING