networking - 使用 mysql 的网络问题,进入 docker-compose 网络中的应用程序
问题描述
我正在用 golang 编写一个 graphql Web API,并希望使用 docker-compose 来部署它。目前有四个服务从一个 compose 文件运行:一个 ansible 服务器(这里并不真正相关),两个 mysql 服务器(一个主服务器,一个副本),以及一个稍后应该运行 graphql 服务的容器。但是,我无法将 graphql 实例连接到任何一个 mysql 实例。这两个数据库可以很好地相互配合(即复制按预期工作),我可以从 ansible 服务器 ssh 到它们。此外,我能够从另一个服务 ping 每个服务。一切都在 Docker Desktop 20.10.0 上运行,Windows 10 上带有 WSL2 后端。这是 compose 文件:
version: "3"
services:
ansible:
container_name: ansible
build: ansible/
volumes:
- ./ansible/data/:/etc/ansible/
stdin_open: true
tty: true
ports:
- "22"
command: /bin/bash -D
raspi:
container_name: raspi
build: raspi/
stdin_open: true
tty: true
ports:
- "22"
# two identical ubuntu servers to install mysql on
mysql_primary:
container_name: mysql_primary
build: mysql/
image: mysql:latest
tty: true
stdin_open: true
ports:
- "3306:3306"
volumes:
- "mysql_primary:/var/lib/mysql:rw"
mysql_replica:
container_name: mysql_replica
image: mysql:latest
tty: true
stdin_open: true
environment:
MYSQL_DATABASE: primary
MYSQL_USER: graphql
MYSQL_PASSWORD: graphql
MYSQL_TCP_PORT: 3307
ports:
- "3307:3307"
volumes:
- "mysql_replica:/var/lib/mysql:rw"
graphql:
container_name: graphql
image: golang:latest
tty: true
stdin_open: true
volumes:
- type: bind
source: ./graphql
target: /app
environment:
WAIT_HOSTS: mysql_replica:3307
ports:
- "8080:8080"
working_dir: /app
command: tail -f /dev/null
volumes:
mysql_primary:
mysql_replica:
我已经尝试过的:
- 运行我的应用程序 - 连接被拒绝而失败
- 手动使用graphql实例中的mysql-client登录到其中一个
mysql_replica
并且mysql_primary
- 失败ERROR 2002 (HY000): Can't connect to MySQL server on '172.18.0' (101)
(所以不在我的应用程序代码中) - 从 graphql 服务器 ping 数据库服务器 - 有效,所以我认为这不是 DNS 问题
- telnet 进入 mysql 容器 - 失败
- 检查了 mysql 错误日志-那里什么都没有,所以肯定是网络问题
整个事情有点像概念证明,这就是为什么我不使用现成的 mysql 映像,而是使用 ansible 安装和部署所有东西。
提前感谢您的任何帮助,如果您需要任何进一步的信息,请告诉我。
解决方案
推荐阅读
- c++ - 将十进制 GPS 时间转换为 UTC
- server - 如何在VMware中将域映射到centos apache IP地址
- linux - 对子目录中的文件使用 sed
- google-sheets - VLOOKUP 评估为超出范围
- android - 如何将 Flutter Fragment 添加到 Kotlin 应用程序
- arangodb - arangosh:删除控制台历史记录
- python - 从文本文件中打印最高得分者的名字
- oracle - Oracle APEX - 使用 PL/SQL 初始化交互式网格列
- mysql - 是否以有效的方式将数组存储在数据库中?
- primefaces - 将轮播分页按钮样式更改为页码