Google Cloud SQL прокси с Docker выбрасывает соединение отказано - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь подключить приложение (Docker-контейнер) к базе данных Google Cloud SQL с помощью Docker-контейнера cloudql-proxy. Поэтому я создал файл docker-compose со следующим контейнером cloudsql-proxy: (XXX заменено на мой идентификатор экземпляра sql облака)

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

Всякий раз, когда я пытаюсь подключиться к базе данных cloudql mysql из другого контейнера, работающего на той же машине, например, второй контейнер в файле docker-compose, я получаю ошибку

"ОШИБКА 2003 (HY000): Невозможно подключиться к серверу MySQL на 127.0.0.1 (111« Отказ в соединении »)«

Я пытался подключиться к cloudql-прокси с тремя разными подходами, но все равно с той же ошибкой. Все контейнеры (облачный SQL-прокси и тестовый контейнер для подключения) находятся в одном экземпляре Google Compute Engine:

a) mysql-client: mysql --host 127.0.0.1

b) URL-адрес jdbc: jdbc: mysql: //127.0.0.1: 3306 / test

c) jdbc url: jdbc: mysql: // cloudsql-proxy: 3306 / test

В моем брандмауэре gc я открыл порт 3306 для 0.0.0.0/0 для целей тестирования, остановил и запустил экземпляр облака 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

Что-то не так с моим подходом или я что-то упустил? Может ли это быть проблемой докера? Я могу пропинговать прокси-контейнер из других контейнеров.

1 Ответ

0 голосов
/ 29 июня 2018

Это не проблема Docker, и изменение брандмауэра Google Cloud позволит компьютерам в Интернете подключаться к порту 3306 на экземпляре.

Figure 1
+--------------------------------------------+
| GCE instance                               |
|                                            |
| +-----------------+    +-----------------+ |
| |MySQL   127.0.0.1|    |Test    127.0.0.1| |
| |                 |    |                 | |
| +------3306-------+    +-----------------+ |
|         |                                  |
|         |                                  |
+--------3306--------------------------------+

На первом рисунке показано, что контейнер 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:

Как показано на втором рисунке, два контейнера теперь совместно используют общую подсеть. Контейнер 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---------------+   +-------------------+ |
|                                                           |
+-----------------------------------------------------------+

Поскольку IP-адрес контейнера неизвестен, вы должны использовать псевдоним (например, имя домена). В этом примере псевдоним database. На втором рисунке предполагается, что оверлейная сеть mysql_net имеет маску 255.0.0.0, и заданные IP-адреса для контейнеров MySQL и Test соответственно 10.0.0.3 и 10.0.0.4.

...