Назад | Перейти на главную страницу

Обнаружение службы Docker (или разрешение DNS) с хоста

У меня есть рецепт, который настраивает экземпляр докера с определенным образом mysql, который я создал для своего приложения. В рамках этого рецепта я хотел бы, чтобы после того, как контейнер запускал mysql, процедура восстановления данных из резервной копии начиналась автоматически.

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

Как ни странно, если я свяжу один контейнер с другим, я смогу разрешить хост другого контейнера из связанного с ним. Но я не нашел способа разрешить это имя хоста от хоста.

Вот часть рецепта (повар), которую я использую, чтобы поднять контейнер:

docker_container 'imhere-mysql' do
  hostname mysqlHost
  repo 'lutraman/imhere'
  tag 'mysql'
  env ["MYSQL_ROOT_PASSWORD=#{mysql_password}"]
  volumes [ '/var/imhere/mysql:/var/lib/mysql' ]
  action :run
end

Команда, которую я хотел бы использовать для восстановления данных, выглядит примерно так (построена по рецепту):

"gunzip -c #{parent_data_dir}/#{db_restore_filename} | mysql -h #{mysqlHost} -u root -p'#{mysql_password}'"

только то, что запущено с хоста, имя в mysqlHost (в данном случае - imhere-mysql) не разрешается с хоста.

Внизу страницы есть примечание. этот статья, в которой говорится, что на 127.0.0.11 должен быть сервер docker dns, но я боюсь, что это внутреннее для контейнеров.

Я надеюсь, что смогу сделать, так это запросить докер (в идеальной ситуации, как DNS, но в любом случае будет работать) для ip контейнера с именем imhere-mysql. Как лучше всего сделать это таким образом, чтобы он сохранялся в будущих версиях на докере и независимо от ОС хоста?

Вы можете получить IP-адрес контейнера, используя команду docker inspect с фильтром:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container name>

Ваша команда будет:

"gunzip -c #{parent_data_dir}/#{db_restore_filename} | mysql -h $(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' #{mysqlHost}) -u root -p'#{mysql_password}'"

Также вы можете использовать статические ip-адреса для контейнеров, объявляя собственные сети.

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

Используя устаревшие ссылки Docker, это будет выглядеть примерно так:

docker run --link #{mysqlHost} --rm -v #{parent_data_dir}/#{db_restore_filename}:/tmp/dbrestore.sql lutraman/imhere bash -c "gunzip -c /tmp/dbrestore.sql | mysql -h #{mysqlHost} -u root -p'#{mysql_password}'"

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

Вероятно, вы могли бы избежать устаревшей ссылки, создав собственный сетевой мост Docker. В этом случае имена контейнеров в этой настраиваемой сети должны быть доступны через DNS без необходимости ссылки. Но это добавит к вашему рецепту дополнительных деталей, которые могут оказаться более трудоемкими, чем стоящими.