Исходно есть: хост с запущенным docker daemon. В параметрах запуска отключен iptables и ip-masq. У хоста внешний сетевой интерфейс (eth0) подключен к мосту (br0), на мосте настроен статический адрес (192.168.0.10/24).
Нужно запустить несколько контейнеров и каждому назначить фиксированный адрес:
- app1 - 192.168.0.21
- app2 - 192.168.0.22
- app3 - 192.168.0.23
Для запуска использую docker-compose up -d. Compose интерестен тем, что сам перезапускает контейнер, если тот рухнет.
Есть прекрасная статья на эту тему:
blog.oddbit.com/2014/08/11/four-ways-to-connect-a-...
Предлагается сначала запустить контейнер как есть, а потом с хоста добавить ему адрес:
# docker run -d --name app1 local/app1
# ip link add app1-int type veth peer name app1-ext
# brctl addif br0 app1-ext
# ip link set netns $(docker-pid app1) dev app1-int
# nsenter -t $(docker-pid app1) -n ip link set app1-int up
# nsenter -t $(docker-pid app1) -n ip addr add 192.168.0.21/24 dev app1-int
# nsenter -t $(docker-pid app1) -n ip route del default
# nsenter -t $(docker-pid app1) -n ip route add default via 192.168.0.1 dev app1-int
Вариант подходящий, можно завернуть в скрипт.
Возникает только вопрос: когда приложение упадет, compose перезапустит его. Есть ли способ автоматически
запустить этот скрипт на хосте сразу после (пере)запуска контейнера?
Есть еще один вариант: запускать скрипт внутри контейнера (через CMD), который до старта приложения обращается к хосту (например, через ssh) и запускает скрипт. Выглядит криво.