Descoberta de serviço do Docker (ou resolução de dns) do host

1

Eu tenho uma receita que configura uma instância do docker com uma imagem específica do mysql que fiz para o meu aplicativo. Como parte dessa receita, eu gostaria de tê-la assim, que depois que o contêiner aparecer com o mysql sendo executado, um procedimento para restaurar dados do backup será iniciado automaticamente.

Para isso eu preciso ter o IP do container (ou uma maneira de obtê-lo do DNS). No entanto, como eu trago o container automaticamente de uma receita, não tenho como saber qual será o IP, por isso estou tentando fazer com que o docker o configure com um nome de host que possa ser resolvido posteriormente.

Curiosamente, se eu vincular um contêiner a outro, poderei resolver o host do outro contêiner de dentro daquele vinculado a ele. Mas não encontrei nenhuma maneira de resolver esse hostname do host.

Aqui está a parte da receita (chef) que uso para trazer o recipiente:

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

O comando que gostaria de usar para restaurar dados é algo assim (construído a partir da receita):

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

apenas a execução do host, o nome em mysqlHost (no caso em questão - imhere-mysql ) não é resolvido do host.

Há uma nota na parte inferior do artigo , dizendo que deve haver um servidor docker dns rodando em 127.0.0.11 - mas temo que isso seja interno aos containers.

O que eu espero poder fazer é o docker de consulta (na situação ideal, como DNS, mas de qualquer forma funcionará) para o ip do container chamado 'imhere-mysql'. Qual é a melhor maneira de fazer isso de uma maneira esperançosa para versões futuras no docker e independente do sistema operacional host?

    
por Tom Klino 25.12.2017 / 21:10

2 respostas

3

Você pode obter o endereço IP do contêiner usando o comando docker inspect com o filtro:

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

Seu comando será:

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

Além disso, você pode usar endereços IP estáticos para contêineres, declarando redes próprias.

    
por 25.12.2017 / 21:58
0

Minha solução para isso seria executar os comandos de restauração em um contêiner na mesma rede (ou com um link). Parece que você já tem as informações da pasta disponíveis para que elas possam ser passadas para um contêiner temporário como um volume.

Usando os links herdados do Docker, seria algo parecido com:

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}'"

Isso usaria a mesma imagem (assumindo que mysql e gunzip binários estão disponíveis e não há ENTRYPOINT ) para montar o volume do host em um local temporário no contêiner e, em seguida, descompactar desse local temporário para o mysql binário conectando-se ao link.

Você provavelmente poderia evitar o link legado criando uma ponte de rede do Docker personalizada. Nesse caso, os nomes dos contêineres nessa rede personalizada devem estar disponíveis pelo DNS sem a necessidade de um link. Mas isso acrescentaria partes adicionais à sua receita que podem ser mais trabalho do que valer a pena.

    
por 26.12.2017 / 03:51

Tags