代码之家  ›  专栏  ›  技术社区  ›  MatrixManAtYrService

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

  •  0
  • MatrixManAtYrService  · 技术社区  · 5 年前

    要点

    我有一个应用程序想通过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

    1 回复  |  直到 5 年前
        1
  •  1
  •   David Maze    5 年前

    如果容器中的程序显示 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才是最重要的。