mysql - 为什么 mysql-client 无法通过 docker-forwarded tcp 端口连接到 GCP cloud_sql_proxy?

标签 mysql docker google-cloud-sql cloud-sql-proxy

要点

我有一个应用程序想要通过 tcp 端口连接到 mysql 数据库。我正在构建一个 docker 容器,该容器暂存云 sql 实例以供其连接(数据库包含从其他地方导入的测试用例)。我希望能够从 docker 容器内部转发 mysql 端口并从容器外部进行连接,但出现错误。

我尝试过的

容器中的数据库,这有效

当我在本地容器中有数据库时,我可以像这样连接:

# run in background, listening on port 13306
❯ docker run -p 13306:3306 -e MYSQL_ROOT_PASSWORD=test -d percona:5.7.26-centos
    9c25...

❯ mysql -h127.0.0.1 -P13306 -uroot -ptest
    mysql> --connection successful

容器中的代理(从外部连接),这不起作用

但是当我在本地容器中有 cloud_sql_proxy 时,我收到此错误:

# run in background, listening on port 13306
❯ docker run -p 13306:3306 \
         -v "${PWD}/gcloud:/root/.config/gcloud" \
         -d portforwardexample \
         cloud_sql_proxy "-instances=myproject:us-west2:myinstance=tcp:3306"
      d56c...

❯ mysql -h127.0.0.1 -P13306
    ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0

如果我停止容器,我会收到不同的消息:

❯ mysql -h127.0.0.1 -P13306
    ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)

...所以我知道正在发生一些沟通。

容器中的代理(从内部连接),这有效

我知道问题出在我这边,因为当我使用交互式 session 并从容器内连接时,一切都按预期工作。

❯ docker run -it --rm -p 13306:3306 \
         -v "${PWD}/gcloud:/root/.config/gcloud" \
         portforwardexample
root@bcf:/# cloud_sql_proxy "-instances=myproject:us-west2:myinstance=tcp:3306" &
2019/12/14 22:44:04 Listening on 127.0.0.1:3306 for myproject:us-west2:myinstance
2019/12/14 22:44:04 Ready for new connections

root@bcf:/# mysql -h127.0.0.1 -P3306
mysql>  --connection successful

为什么我无法从容器外部连接?我需要做些什么来告诉容器可以通过 docker 转发端口吗?

我省略了我认为与我的问题无关的详细信息,但这里有一个包含一些额外详细信息的存储库(例如我正在使用的 Dockerfile):https://github.com/MatrixManAtYrService/cloudsqlproxyproblem

最佳答案

如果容器内的程序说Listening on 127.0.0.1,它可能无法从容器外部访问,并且您需要以某种方式配置它,以便它绑定(bind)或监听0.0.0.0(所有接口(interface))代替。

the Cloud SQL Proxy documentation中的示例有这个选项:

/cloud_sql_proxy -instances=...=tcp:0.0.0.0:3306 ...

0.0.0.0 是重要的。

关于mysql - 为什么 mysql-client 无法通过 docker-forwarded tcp 端口连接到 GCP cloud_sql_proxy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59339997/

相关文章:

docker - 创建从 docker 容器上的进程到同一容器上的另一个进程的连接时,连接被拒绝

google-cloud-sql - 成功上传图片后 gcloud beta run deploy 失败,无法启用 API

mysql - MySQL 数据透视表中的分组依据

mysql - 更新行,列值表示为键

php - MySQL 更新大量 html 内容问题

java.lang.NoSuchMethodError : com. google.common.base.Platform.systemNanoTime()J

mysql - 从本地运行的 NodeJS/TypeORM 连接到 Google Cloud MySQL 实例

php - 我的 PHP 代码中的参数有问题,参数未定义

docker - 如何解决 GitLab 错误 "Error response from daemon: invalid condition: ' not-running'"?

docker - 为什么不使用docker中的主机网络,因为docker和kubernetes网络是如此复杂