【发布时间】:2022-07-21 22:11:55
【问题描述】:
这是我的 docker-compose.yml:
version: '3.9'
services:
me:
tty: true
image: alpine:latest
container_name: me
restart: always
volumes:
- ./misc/:/tmp/
environment:
- ME_IPADDR=mdb
- ME_PORT=3306
entrypoint:
- "/tmp/entrypoint.sh"
depends_on:
- mdb
ports:
- "80:8080"
mdb:
image: mariadb:latest
container_name: mdb
volumes:
- ~/.local/mariadb:/var/lib/mysql
environment:
- MYSQL_PASSWORD=password
- MYSQL_USER=osousa
- MYSQL_DATABASE=osousa
restart: always
networks:
default:
name: mego
external: true
两个容器通过同一个网络连接:
$ docker network inspect -f '{{range .Containers}}{{.Name}} {{end}}' mego
$ mdb mariadb
他们正在互相交谈:
$ docker exec e7bcfa16d3e4 ping 8f5d5ac038ba -c2
PING 8f5d5ac038ba (172.21.0.2): 56 data bytes
64 bytes from 172.21.0.2: seq=0 ttl=64 time=0.087 ms
64 bytes from 172.21.0.2: seq=1 ttl=64 time=0.145 ms
--- 8f5d5ac038ba ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.087/0.116/0.145 ms
但是当应用程序的容器 [我] 向数据库发出请求时,我总是会收到错误消息。这是我从 mariadb 得到的错误:
me | 2022/07/21 13:51:57 Error occured: error:dial tcp 0.0.0.0:3306: connect: connection refused
为了确定问题是否来自 mariadb,我在 yml 的 mariadb 服务中添加了以下内容:
ports:
- "3306:3306"
我在 UFW 中添加了以下规则:
ufw route allow proto tcp from any to any port 3306
我能够使用“我”容器内的相同程序和相同的登录凭据从远程计算机完美地连接到 mariadb 数据库。 这不是容器或数据库的问题。
我还应该尝试什么?
非常感谢您的帮助!
【问题讨论】:
-
您似乎错误地将数据库连接配置为使用特殊的 0.0.0.0“无处不在”地址作为数据库位置。在 Compose 上下文中,您应该能够使用 Compose 服务名称
mdb作为主机名;有关详细信息,请参阅 Docker 文档中的 Networking in Compose。 -
@DavidMaze 有趣的是,使用 0.0.0.0:3306 将服务器绑定到所有可用接口的 mariadb docker 映像(我认为这应该不是问题)。我不知道如何让它绑定到容器自己的 IP。
标签: docker docker-compose docker-networking