pbe*_*eck 5 mysql docker google-cloud-platform cloud-sql-proxy
我正在尝试使用 cloudsql-proxy docker 容器将应用程序(docker 容器)连接到 Google Cloud SQL 数据库。因此,我使用以下 cloudsql-proxy 容器创建了一个 docker-compose 文件:(XXX 替换为我的云 sql 实例 ID)
version: "3"
volumes:
sqlproxy:
services:
cloudsql-proxy:
container_name: cloudsql-proxy
image: gcr.io/cloudsql-docker/gce-proxy:1.11
command: /cloud_sql_proxy --dir=/cloudsql -instances=XXX=tcp:0.0.0.0:3306 -credential_file=/config/credentials.json
ports:
- "3306:3306"
volumes:
- /usr/share/service-accounts/cloudsql-client.json:/config/credentials.json
- sqlproxy:/cloudsql
- /etc/ssl/certs:/etc/ssl/certs
restart: always
Run Code Online (Sandbox Code Playgroud)
每当我尝试从同一台机器上运行的另一个容器(例如 docker-compose 文件中的第二个容器)连接到 cloudsql mysql 数据库时,我都会收到错误消息
“错误 2003 (HY000):无法连接到 '127.0.0.1' 上的 MySQL 服务器(111“连接被拒绝”)”
我尝试使用三种不同的方法连接到 cloudsql-proxy,但仍然出现相同的错误。所有容器(要连接的云 sql 代理和测试容器)都在一个 google 计算引擎实例上:
a) mysql-client: mysql --host 127.0.0.1
b) jdbc url: jdbc:mysql://127.0.0.1:3306/test
c) jdbc url: jdbc:mysql://cloudsql-proxy:3306/test
在我的 gc 防火墙中,为了测试目的,我为 0.0.0.0/0 打开了端口 3306,停止并启动了云 sql 实例等,但错误仍然存在。代理容器的日志正常:
2018/05/02 16:02:03 using credential file for authentication; email=cloudsql-client@xxx.iam.gserviceaccount.com
2018/05/02 16:02:03 Listening on 0.0.0.0:3306 for x:x:x
2018/05/02 16:02:03 Ready for new connections
Run Code Online (Sandbox Code Playgroud)
我的方法有什么根本性的错误还是我错过了什么?这可能是码头工人的问题吗?我可以从其他容器 ping 代理容器。
小智 1
这不是 Docker 问题,更改 Google Cloud 防火墙将允许互联网上的计算机连接到实例上的端口 3306。
Figure 1
+--------------------------------------------+
| GCE instance |
| |
| +-----------------+ +-----------------+ |
| |MySQL 127.0.0.1| |Test 127.0.0.1| |
| | | | | |
| +------3306-------+ +-----------------+ |
| | |
| | |
+--------3306--------------------------------+
Run Code Online (Sandbox Code Playgroud)
第一张图显示容器Test无法到达容器 MySQL,因为它只知道自己(环回网络上的 127.0.0.1)。您提到的错误发生是因为 MySQL 没有在容器的端口 3306 上运行Test。
访问容器的一个选项MySQL是Test添加覆盖网络。
# I recommend using the latest version
version: "3.6"
volumes:
sqlproxy:
networks:
mysql_net:
driver: overlay
services:
cloudsql-proxy:
...
# This is not required
# ports:
# - "3306:3306"
...
networks:
mysql_net:
aliases:
database
test-container:
# Reach the container MySQL using the alias
command: mysql -u <user> -p --host database
...
networks:
mysql_net:
Run Code Online (Sandbox Code Playgroud)
如第二张图所示,两个容器现在共享一个公共子网。容器Test应该能够到达容器MySQL。
Figure 2
+-----------------------------------------------------------+
| GCE instance |
| |
| +-------------------------------+ +-------------------+ |
| MySQL 127.0.0.1 | |Test 127.0.0.1 | |
| | 10.0.0.3/8 (database)| | 10.0.0.4/8| |
| | | | | |
| | | | | |
| +------------3306---------------+ +-------------------+ |
| |
+-----------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
由于容器的IP未知,您必须使用别名(如域名)。在示例中,别名是database。第二张图假设覆盖网络具有mysql_net掩码255.0.0.0,并且容器的给定 IP分别为MySQL和。Test10.0.0.310.0.0.4
| 归档时间: |
|
| 查看次数: |
1963 次 |
| 最近记录: |