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