Невозможно подключиться к контейнеру mysql, определенному в docker, с использованием имени службы - PullRequest
0 голосов
/ 09 января 2020

У меня есть следующее docker -compose.yml

version: '3'
services:
  app:
    build: .
    network_mode: host
    volumes:
      - .:/usr/usr/src/app
  db:
    image: mysql/mysql-server:5.7
    environment: 
      MYSQL_DATABASE: config_dev
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
    volumes:
      - ./docker/images/config-dev-image/sql-scripts:/docker-entrypoint-initdb.d
    restart: always
    ports:
      - "1200:3306"

Моей службе приложений необходимо подключиться к БД и использовать документацию, к которой я пытался подключиться, используя имя службы 'db', например так (из контейнера приложения) mysql --hostname=db --port=3306 --user=root Однако я получаю ошибку ERROR 2005 (HY000): Unknown MySQL server host 'db'

Что я делаю не так?

Ответы [ 3 ]

1 голос
/ 09 января 2020

Ваш app контейнер работает с network_mode: host. Если он использует хост-сеть, он не может использовать какие-либо сетевые функции Docker -specifi c; например, он не может достичь других контейнеров по имени хоста и не может быть достигнут по имени хоста. Для сетевых целей Docker он неотличим от процесса, выполняющегося на хосте.

Сетевое взаимодействие с хостом на самом деле не требуется в большинстве случаев, которые, как я вижу, предлагается для SO, и вы должны увидеть, работает ли ваше приложение, если вы просто удали эту строку. Возможно, вам придется добавить ports:, чтобы сделать его доступным извне.

Если вы действительно не можете отключить сетевое соединение с хостом, то вам нужно подключиться к базе данных так же, как другие процессы, работающие вне сети Docker пространство будет через опубликованные порты другого контейнера. Имя хоста localhost должно работать (потому что вы находитесь в контексте хоста), но вам нужен сопоставленный номер порта --port=1200.

1 голос
/ 09 января 2020

Из-за network_mode: host ваш контейнер приложений находится в частной сети docker, например, 192.168.65.1/24, в то время как ваш контейнер БД находится в другой частной сети, созданной docker, например 172.20.0.2/. 16. Эта сеть будет удалена, если вы запустите docker -compose down:

Removing network XXXX_default

, где XXXX - имя вашего каталога.

Если вы удалили network_mode: host из приложения-службы оба контейнера будут находиться в одной частной сети и доступны по имени службы.

$ docker inspect XXXX_default

    "Containers": {
            ...
            "Name": "app",
            "IPv4Address": "172.21.0.3/16",
            ...
        },
            ...
            "Name": "db",
            "IPv4Address": "172.21.0.2/16",
            ...
        }
    },

Контейнер приложения может получить доступ к БД через порт 3306. Нет необходимости указывать порт как 1200. Согласно документации:

Контейнеры, подключенные к одной и той же определяемой пользователем мостовой сети, автоматически открывают все порты друг для друга, а порты - для внешнего мира. Это позволяет контейнерам приложений легко общаться друг с другом, не открывая случайно доступ к внешнему миру.

0 голосов
/ 09 января 2020

Добавить конфигурацию ссылок в разделе приложения

version: '3'
services:
  app:
    build: .
    network_mode: host
    volumes:
      - .:/usr/usr/src/app
    links:
      - db
  db:
    image: mysql/mysql-server:5.7
    environment:
      MYSQL_DATABASE: config_dev
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
    volumes:
      - ./docker/images/config-dev-image/sql-scripts:/docker-entrypoint-initdb.d
    restart: always
    ports:
      - "1200:3306"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...