社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  docker

为什么mysql客户端不通过docker转发的tcp端口连接到GCP cloud_sql_proxy?

MatrixManAtYrService • 6 年前 • 2525 次点击  

要点

我有一个应用程序想通过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_代理时,会出现以下错误:

# 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)

……所以我知道 一些 正在进行沟通。

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

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

❯ 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

为什么我不能从容器外部连接?我需要做些什么来告诉集装箱通过码头转船可以吗?

我省略了一些我认为与我的问题无关的细节,但这里有一个包含一些额外细节的回购协议(比如我正在使用的Dockerfile): https://github.com/MatrixManAtYrService/cloudsqlproxyproblem

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/51264
文章 [ 1 ]  |  最新文章 6 年前
David Maze
Reply   •   1 楼
David Maze    6 年前

如果容器中的程序显示 Listening on 127.0.0.1 它可能无法从容器外部访问,您需要以某种方式配置它,以便它绑定或侦听0.0.0.0(所有接口)。

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

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

而0.0.0.0才是最重要的。