一篇 Docker 踩坑贴

发布于 2022-05-12  144 次阅读


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要实现重复请求的话需要在代码中体现。

先写这些,后面有空了就来更新


Be all you can be.