Связать контейнеры в докере (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
Надеюсь, это поможет!