Я пытаюсь развернуть свое приложение с помощью Docker и столкнулся с проблемой, заключающейся в том, что перезапуск именованных контейнеров назначает контейнеру другой IP-адрес. Возможно, объяснение того, что я делаю, лучше объяснит проблему:
- Postgres запускается внутри отдельного контейнера с именем
"postgres"
$ PG_ID=$(docker run --name postgres postgres/image)
- Контейнер моего веб-приложения связан с контейнером postgres
$ APP_ID=$(docker run --link postgres:postgres webapp/image)
Связывание образа контейнера postgres с контейнером webapp вставляет в контейнер webapp запись файла hosts с IP-адресом контейнера postgres. Это позволяет мне указывать на базу данных postgres в моем веб-приложении, используя postgres:5432
(кстати, я использую Django). Все это работает хорошо, за исключением случаев, когда по какой-то причине происходит сбой postgres.
Прежде чем я вручную остановлю процесс postgres, чтобы имитировать сбой процесса postgres, я проверяю IP-адрес контейнера postgres:
$ docker inspect --format "{{.NetworkSettings.IPAddress}}" $PG_ID
172.17.0.73
Теперь, чтобы имитировать сбой, я останавливаю контейнер postgres:
$ docker stop $PG_ID
Если сейчас я перезапущу postgres, используя
$ docker start $PG_ID
IP контейнера меняется:
$ docker inspect --format "{{.NetworkSettings.IPAddress}}" $PG_ID
172.17.0.74
Поэтому IP-адрес, который указывает на контейнер postgres в контейнере веб-приложения, больше не является правильным. Я думаю, что, называя контейнер, Docker присваивает ему имя с определенными конфигурациями, чтобы вы могли надежно связываться между контейнерами (как сетью, так и томами). Если IP изменится, это, кажется, не поможет.
Если мне приходится перезапускать процесс моего веб-приложения каждый раз, когда я перезапускаю postgres, это не кажется лучше, чем просто использовать один контейнер для запуска обоих процессов. Затем я могу использовать супервизор или что-то подобное, чтобы они оба работали, и использовать localhost
для связи между процессами.
Я все еще новичок в Docker, так что я делаю что-то не так или это ошибка в докере?