Связать контейнеры в докере (RancherOS и командная строка)

  • Я запускаю RancherOS для запуска докер-контейнеров
  • Я создал контейнер в графическом интерфейсе для запуска своих баз данных (изображение: mysql, имя: r-mysql-e4e8df05). Различные контейнеры используют его.
  • Я могу связать другие контейнеры с ним в графическом интерфейсе
  • На этот раз я хотел бы автоматизировать создание и запуск контейнера на jenkins, но связь не работает

Моя команда:

docker run -d --name=app-that-needs-mysql --link mysql:mysql myimages.mycompany.com/appthatneedsmysql

Я получаю ошибку:

Error response from daemon: Could not get container for mysql

Я пробовал разные вещи:
1)

--link r-mysql-e4e8df05:mysql

Ошибка:

Cannot link to /r-mysql-e4e8df05, as it does not belong to the default network

2)
Попробуй использовать --net опции
Бег: docker network ls

NETWORK ID          NAME                DRIVER              SCOPE
c..........e        bridge              bridge              local
4..........c        host                host                local
c..........a        none                null                local
  • С --net none это удается, но на самом деле это не работает. Приложение не может подключиться к БД
  • С --net host сообщение об ошибке conflicting options: host type networking can't be used with links. This would result in undefined behavior
  • С --net bridge сообщение об ошибке: Cannot link to /r-mysql-e4e8df05, as it does not belong to the default network

Я также проверил на ранчо GUI, где работает этот mysql:

Это получить continer IP начать с: 10.XXX

Я также пытался add --net managed но ошибка: network managed not found

Я полагаю, что мне не хватает понимания чего-то в этом процессе связывания докеров. Пожалуйста, дайте мне некоторое представление, как я могу заставить их работать.
(раньше он работал, когда я создал тот же контейнер и связал с mysql в графическом интерфейсе)

2 ответа

Эй, @Tomi, вы можете выставить контейнер mysql на любой порт, который вам нравится, от ранчера. Таким образом, вам не нужно связывать контейнер, тогда ваш порожденный контейнер jenkins подключится к этому через открытый порт на хосте. Вы также можете использовать jenkins, чтобы раскрутить контейнер внутри ранчо, используя cli ранчо. Таким образом, вам не нужно открывать mysql в сети хостов... несколько способов убрать этого кота с ранчо.

На первый взгляд кажется, что Rancher использует управляемую сеть, которая docker network ls не показывает.

Воспроизведение проблемы

Я использовал фиктивные альпийские контейнеры, чтобы воспроизвести это:

# create some network
docker network create your_invisible_network

# run a container belonging to this network
docker container run \
  --detach \
  --name r-mysql-e4e8df05 \
  --net your_invisible_network \
  alpine tail -f /dev/null

# trying to link this container
docker container run \
  --link r-mysql-e4e8df05:mysql \
  alpine ping mysql

Действительно я получаю docker: Error response from daemon: Cannot link to /r-mysql-e4e8df05, as it does not belong to the default network.

Возможное решение

Обходной путь должен был бы создать определяемую пользователем мостовую сеть и просто добавить в нее ваш контейнер mysql:

# create a network
docker network create \
  --driver bridge \
  a_workaround_network

# connect the mysql to this network (and alias it)
docker network connect \
  --alias mysql \
  a_workaround_network r-mysql-e4e8df05

# try to ping it using its alias
docker container run \
  --net a_workaround_network \
  alpine \
  ping mysql

# yay!
PING mysql (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: seq=0 ttl=64 time=0.135 ms
64 bytes from 127.0.0.1: seq=1 ttl=64 time=0.084 ms

Как вы можете видеть в выводе, возможен пинг контейнера mysql через его DNS-имя.

Хорошо знать:

  • С созданными пользователем мостовыми сетями разрешение DNS работает "из коробки" без необходимости явно --link контейнеры:)
  • Контейнеры могут принадлежать нескольким сетям, поэтому это работает. В этом случае контейнер mysql принадлежит обоим your_invisible_network а также a_workaround_network

Надеюсь, это поможет!

Другие вопросы по тегам