Como obter o endereço IP do host da docker de dentro de um contêiner de docker
358
Como o título diz. Preciso recuperar o endereço IP que o docker hospeda e os mapas de porta do host para o contêiner, e fazer isso dentro do contêiner.
Você poderia elaborar como gostaria de usar essas informações? Você disse "hosts do docker" - você está executando o Docker em mais de um host? Depois que o contêiner souber o endereço IP do host e dos mapas de porta, o que fará?
Andy
A maneira mais simples de passar os endereços IP do host do docker para o contêiner do docker, acho que você deve fazer uma chamada dentro do contêiner usando 'docker container exec'. Suponha que você deseja executar ping no host de dentro do container do busybox, use, por exemplo: $ IP = '8.8.8.8' && docker container do busybox ping $ IP 'A maneira de descobrir o IP do host, use o que você mais gosta.
SauloAlessandre 14/01
Respostas:
314
/sbin/ip route|awk '/default/ { print $3 }'
Como @MichaelNeale notou, não faz sentido usar esse método Dockerfile(exceto quando precisamos desse IP apenas durante o tempo de compilação), porque esse IP será codificado durante o tempo de compilação.
Quando você estiver usando a ponte de encaixe (padrão) para os contêineres, isso produzirá o IP das pontes como 172.17.42.1, em vez do IP do host, como 192.168.1.x (suponho que seu host esteja em um NAT doméstico). Usar a resposta do @Magno Torres é provavelmente o que as pessoas desejam em tais situações, se você deseja o endereço 192.168.1.x.
Programster
2
esse RUN não funcionará conforme o esperado - apenas calculará o IP no tempo de compilação - e ficará para sempre estático depois disso, e não será útil. Será o IP do host de construção.
Michael Neale
7
@Programster, posso presumir que as pessoas desejam a conexão entre o host do docker e o contêiner, é isso que o IP da ponte pode oferecer (é claro na instalação padrão "doméstica"). Por que alguém precisaria de um IP de host "real" se ele pode estar fora da ponte de encaixe e pode ser inacessível? Esta é a solução para todas as pessoas que acabaram de instalar o docker e querem brincar com ele em pouco tempo.
Spinus #
11
@ MichaelNeale, como antes, eu diria que a maioria das pessoas que estão começando com o docker precisa de uma conexão entre o host e o contêiner, é isso. Se alguém estiver fazendo implantações "apropriadas", provavelmente ele não está usando a ponte docker, de qualquer maneira, ele está usando rede personalizada e, provavelmente, está ciente de todas as peculiaridades da rede ou se o DNS (ou qualquer descoberta) foi configurado.
Spinus #
11
@spinus - mas isso só será válido se for executado no host em que foi construído - nesse caso - você pode codificá-lo com firmeza - ou procurar - acho que não é uma resposta útil e enganará muito de pessoas - recomendamos que você o remova. (O bit RUN)
Michael Neale
182
A partir da versão 18.03, você pode usar host.docker.internalcomo o IP do host.
Funciona no Docker para Mac , no Docker para Windows e talvez em outras plataformas também.
Esta é uma atualização específica do Mac docker.for.mac.localhost, disponível desde a versão 17.06 e docker.for.mac.host.internaldisponível desde a versão 17.12, que também pode ainda funcionar nessa plataforma.
Observe que, como na documentação do Mac e Windows , isso é apenas para fins de desenvolvimento.
Por exemplo, tenho variáveis de ambiente definidas no meu host:
MONGO_SERVER=host.docker.internal
No meu docker-compose.ymlarquivo, eu tenho o seguinte:
@allanberry infelizmente as pessoas Docker preferem não dar-nos uma maneira independente de plataforma para fazer isso porque eles preferem não para abraçar casos de uso não intencionais (como acesso a qualquer serviço na máquina local de um recipiente janela de encaixe)
Andy
21
Fui apresentado ao Docker como Build it once, execute-o em qualquer lugar. Mas isso é totalmente falso, já que você sempre precisa configurar o sistema host também. Isso docker.for.mac..é inútil, pois na maioria dos casos você não possui um ambiente somente Linux ou Mac em sua empresa. É misto, você tem desenvolvedores usando Linux, Mac e Windows. Esse domínio não faz sentido, já que em 99% é um ambiente misto do sistema operacional host. Não desenvolvo um contêiner no macOS e o implanto em um servidor macOS. Eu o implanto no Linux. É isso que todo mundo faz. Então, qual é o objetivo docker.for.mac..?
TheFox 16/03/19
11
O @allanberry docker.for.mac.host.internalnão importa se você está usando o Docker com ou sem docker-compose. Eu quero usar um host fixo nos arquivos de configuração. IDK, por exemplo, docker.host.internalque sempre aponta para o endereço IP do host. Independentemente de qual sistema host eu estou usando. Esse é o objetivo de usar o Docker: quero ser autônomo. Entendo que é ainda mais complicado no macOS porque você tem outra camada entre o sistema host e o contêiner. Mas de qualquer maneira, na minha opinião, docker.for.mac.host.internalé inútil se você puder usá-lo apenas para o macOS.
isso funciona perfeitamente, eu tenho dockerCe para windows e executando jenkins em um dos contêineres. Eu queria executar o comando docker no jenkins, mas o docker não conseguiu se conectar na etapa adicionar uma nuvem, usei este tcp: //host.docker.internal: 2375 e habilitei 'expor daemon no localhost: 2375' e ele funciona. economizou muito tempo. Obrigado!
Vikash
84
Atualização: No Docker para Mac , a partir da versão 18.03, você pode usar host.docker.internal como o IP do host. Veja a resposta de allanberry . Para versões anteriores do Docker for Mac, a seguinte resposta ainda pode ser útil:
No Docker para Mac, a docker0ponte não existe, portanto outras respostas aqui podem não funcionar. Todo o tráfego de saída, no entanto, é roteado através do host pai; portanto, enquanto você tenta se conectar a um IP, ele reconhece como ele próprio (e o contêiner do docker não pensa que é ele próprio), você deve conseguir se conectar. Por exemplo, se você executar isso na máquina pai, execute:
ipconfig getifaddr en0
Isso deve mostrar o IP do seu Mac na rede atual e o contêiner do docker também deve se conectar a esse endereço. Obviamente, isso é problemático se esse endereço IP mudar, mas você pode adicionar um IP de loopback personalizado ao seu Mac que o contêiner não pense ser ele mesmo, fazendo algo assim na máquina pai:
sudo ifconfig lo0 alias 192.168.46.49
Em seguida, você pode testar a conexão no contêiner do docker com telnet. No meu caso, eu queria conectar-me a um servidor xdebug remoto:
telnet 192.168.46.49 9000
Agora, quando o tráfego chegar ao seu Mac endereçado a 192.168.46.49 (e todo o tráfego que sai do contêiner passa pelo Mac), o seu Mac assume que o IP é ele próprio. Quando você terminar de usar esse IP, poderá remover o alias de loopback assim:
sudo ifconfig lo0 -alias 192.168.46.49
Uma coisa a ter cuidado é que o contêiner do docker não enviará tráfego para o host pai se achar que o destino do tráfego é ele próprio. Portanto, verifique a interface de loopback dentro do contêiner se tiver problemas:
sudo ip addr show lo
No meu caso, isso mostrou o inet 127.0.0.1/8que significa que eu não poderia usar nenhum IP no 127.*intervalo. Por isso eu usei 192.168.*no exemplo acima. Verifique se o IP que você usa não entra em conflito com algo em sua própria rede.
Esse é um método super conveniente para quem usa a AWS. Eu uso isso para configurar o cliente dos agentes do Consul e vincular endereços. É ideal quando você está em situações em que não pode usar a rede host (como implantar contêineres no Elastic Beanstalk e ECS).
Richard Clayton
Este é um salva-vidas, obrigado. Eu estava tendo problemas para descobrir como lidar com a comunicação entre contêineres no meu cluster ECS.
Brennan
No basimage do Phusion (baseado no ubuntu), tive que mudar um pouco o seu comando:ifconfig eth0 | grep -oP 'inet \K\S+'
Meuoi
25
A única maneira de passar as informações do host como ambiente quando você cria um contêiner
Mais especificamente, o endereço IP da ponte pode ser passado em usar uma opção de linha de comando como: -e "DOCKER_HOST=$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+')"(usando a resposta aceita de unix.stackexchange.com/questions/87468/... )
ncoghlan
7
Eu acho que não funciona no Docker para Mac / Windows. (the bridge IP)
zx1986
22
A --add-hostpoderia ser uma solução mais líquido de limpeza (mas sem a parte da porta, apenas o hospedeiro pode ser tratado com esta solução). Então, no seu docker runcomando, faça algo como:
Eu disse "feito para isso" quando alguém queria uma entrada no / etc / hosts; nesta questão não é realmente verdade. O OP também solicitou "host e portmaps" e você cobriu apenas o host.
Bryan
Está bem. Fiquei um pouco confuso, pois a solução aceita apenas cobre a parte do host também. E acho que sua solução é superior à do spinus.
Augunrik
isso não funciona se você deseja usar o dind - docker-in-docker. Docker interno terá ip diferente
noisy
12
A prática recomendada padrão para a maioria dos aplicativos que desejam fazer isso automaticamente é: você não precisa . Em vez disso, a pessoa que está executando o contêiner injeta um nome de host / endereço IP externo como configuração, por exemplo, como uma variável de ambiente ou arquivo de configuração. Permitir que o usuário injete isso fornece o design mais portátil.
Por que isso seria tão difícil? Como os contêineres isolarão o aplicativo do ambiente host. A rede está no namespace apenas para esse contêiner por padrão, e os detalhes do host são protegidos do processo em execução no contêiner, que pode não ser totalmente confiável.
Existem opções diferentes, dependendo da sua situação específica:
Se o seu contêiner estiver sendo executado com a rede do host, você poderá olhar diretamente para a tabela de roteamento no host para ver a rota padrão. A partir desta pergunta, o seguinte funciona para mim, por exemplo:
ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'
Um exemplo mostrando isso com a rede do host em um contêiner é semelhante a:
docker run --rm --net host busybox /bin/sh -c \
"ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'"
Para algumas versões do Docker Desktop, eles injetaram uma entrada DNS na VM incorporada:
Se você deseja seu endereço externo / Internet, pode consultar um serviço remoto como:
curl ifconfig.co
Cada um desses possui limitações e funciona apenas em cenários específicos. A opção mais portátil ainda é executar o contêiner com o endereço IP injetado como configuração, por exemplo, aqui está uma opção executando o ipcomando anterior no host e injetando-o como uma variável de ambiente:
export HOST_IP=$(ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p')
docker run --rm -e HOST_IP busybox printenv HOST_IP
O host tem um endereço IP alterado (ou nenhum, se você não tiver acesso à rede). A partir de 18.03, nossa recomendação é conectar-se ao nome DNS especial host.docker.internal, que resolve o endereço IP interno usado pelo host. Isso é para fins de desenvolvimento e não funcionará em um ambiente de produção fora do Docker for Windows.
Tentei lhe a solução e parece que o comando nslookup não pode ser encontrado
Sergey
@Sergey A sua imagem é baseada Alpine Linux? Caso contrário, verifique o equivalente para o seu específico linux distribution.
Kamil Witkowski
Não, eu uso exatamente o seu comando - docker run -it nginx / bin / ash
Sergey
Ok - se você estiver no Windows, mudei para linux containerse não estou usando windows containers. Você pode fazer isso clicando com o botão direito do mouse docker icone selecionando Switch to Linux containers. Eu acho que isso pode ser importante quando você está baixando uma imagem. Se você tiver windows containerverificado se a exclusão da nginximagem antiga e o download novamente, você obterá outro contêiner. Se ainda assim não funcionar para você - você pode tentar instalar nslookupno ash.
Kamil Witkowski
Se você não pode fazer a pesquisa, basta executar ping. Ele mostrará o IP resolvido. Para mim esta resposta funciona, e eu estou apenas usando esse nome de host ( host.docker.internal) de dentro do recipiente
Dmitry Minkovsky
7
TLDR para Mac e Windows
docker run -it --rm alpine nslookup host.docker.internal
... imprime o endereço IP do host ...
nslookup: can't resolve '(null)': Name does not resolve
Name: host.docker.internal
Address 1: 192.168.65.2
Detalhes
No Mac e Windows , você pode usar o nome DNS especial host.docker.internal.
O host tem um endereço IP alterado (ou nenhum, se você não tiver acesso à rede). A partir de 18.03, nossa recomendação é conectar-se ao nome DNS especial host.docker.internal, que resolve o endereço IP interno usado pelo host. Isso é para fins de desenvolvimento e não funcionará em um ambiente de produção fora do Docker Desktop for Mac.
Não adicione a mesma resposta a várias perguntas . Responda à melhor e sinalize o restante como duplicado, depois de ganhar reputação suficiente. Se não for uma duplicata, adapte a postagem à pergunta e sinalize a exclusão.
Bhargav Rao
6
Docker para Mac
Desejo conectar-me de um contêiner a um serviço no host
O host tem um endereço IP alterado (ou nenhum, se você não tiver acesso à rede). A partir de 18.03, nossa recomendação é conectar-se ao nome DNS especial host.docker.internal, que resolve o endereço IP interno usado pelo host.
Se você ativou a API remota do docker (via, por exemplo) e sabe o nome do host ou o endereço IP da máquina host, isso pode ser feito com muito bash.-Htcp://0.0.0.0:4243
A segunda linha pega o ID do contêiner do /proc/self/cgrouparquivo local .
A terceira linha se desloca para a máquina host (supondo que você esteja usando 4243 como porta do docker) e depois usa o nó para analisar o JSON retornado para o DESIRED_PORT.
Isso se aplica somente quando você usa o encaminhamento de porta. Na verdade HostPortpode ser uma informação útil aqui, infelizmente o HostIppoderia ser0.0.0.0
Arnout Engelen
4
Eu tenho o Ubuntu 16.03. Para mim
docker run --add-host dockerhost:`/sbin/ip route|awk '/default/ { print $3}'` [image]
se não trabalhar (ip errado estava gerando)
Minha solução de trabalho foi a seguinte:
docker run --add-host dockerhost:`docker network inspect --format='{{range .IPAM.Config}}{{.Gateway}}{{end}}' bridge` [image]
Aqui está outra opção para aqueles que executam o Docker na AWS. Essa opção evita o uso de apk para adicionar o pacote curl e economiza os preciosos 7 MB de espaço. Use o wget interno (parte do binário monolítico do BusyBox):
AFAIK, no caso do Docker for Linux (distribuição padrão), o endereço IP do host sempre será172.17.0.1 .
A maneira mais fácil de obtê-lo é via ifconfig(interface docker0) do host:
ifconfig
De dentro de uma janela de encaixe, o seguinte comando de uma janela de encaixe: ip -4 route show default | cut -d" " -f3
Você pode executá-lo rapidamente em uma janela de encaixe com a seguinte linha de comando:
# 1. Run an ubuntu docker
# 2. Updates dependencies (quietly)
# 3. Install ip package (quietly)
# 4. Shows (nicely) the ip of the host
# 5. Removes the docker (thanks to `--rm` arg)
docker run -it --rm ubuntu:19.10 bash -c "apt-get update && apt-get install iproute2 -y && ip -4 route show default | cut -d' ' -f3"
Primeiro bloco de código vai pegar o contêiner IP e não o IP do host
Ari
mandoc de hostname -Iadverte para não "fazer suposições sobre a ordem da saída".
cannot_mutably_borrow
1
Esta é uma implementação minimalista no Node.js para quem está executando o host nas instâncias do AWS EC2 , usando a instância de metadados do EC2 mencionada anteriormente .
const cp = require('child_process');
const ec2 = function (callback) {
const URL = 'http://169.254.169.254/latest/meta-data/local-ipv4';
// we make it silent and timeout to 1 sec
const args = [URL, '-s', '--max-time', '1'];
const opts = {};
cp.execFile('curl', args, opts, (error, stdout) => {
if (error) return callback(new Error('ec2 ip error'));
else return callback(null, stdout);
})
.on('error', (error) => callback(new Error('ec2 ip error')));
}//ec2
Se você estiver executando um contêiner do Windows em um cluster do Service Fabric, o endereço IP do host estará disponível por meio da variável de ambiente Fabric_NodeIPOrFQDN. Variáveis de ambiente do Service Fabric
Aqui está como eu faço isso. Nesse caso, ele adiciona uma entrada de hosts em / etc / hosts na imagem do docker, apontando taurus-host para o IP da minha máquina local:
Você pode simplesmente usar o nome do container dns para acessar o sistema host, por exemplo, enrolar http: // dockerhost: 9200 , para que não haja problemas com nenhum endereço IP.
Este recupera o IP da máquina virtual que roda os recipientes Estivador, não o IP do host que os recipientes são executados no.
Spencer Williams
2
Isso se aplica apenas à janela de encaixe que está sendo executada na máquina de encaixe. A nova janela de encaixe para mac não funciona na máquina de encaixe.
Respostas:
Como @MichaelNeale notou, não faz sentido usar esse método
Dockerfile
(exceto quando precisamos desse IP apenas durante o tempo de compilação), porque esse IP será codificado durante o tempo de compilação.fonte
A partir da versão 18.03, você pode usar
host.docker.internal
como o IP do host.Funciona no Docker para Mac , no Docker para Windows e talvez em outras plataformas também.
Esta é uma atualização específica do Mac
docker.for.mac.localhost
, disponível desde a versão 17.06 edocker.for.mac.host.internal
disponível desde a versão 17.12, que também pode ainda funcionar nessa plataforma.Observe que, como na documentação do Mac e Windows , isso é apenas para fins de desenvolvimento.
Por exemplo, tenho variáveis de ambiente definidas no meu host:
No meu
docker-compose.yml
arquivo, eu tenho o seguinte:fonte
docker.for.mac..
é inútil, pois na maioria dos casos você não possui um ambiente somente Linux ou Mac em sua empresa. É misto, você tem desenvolvedores usando Linux, Mac e Windows. Esse domínio não faz sentido, já que em 99% é um ambiente misto do sistema operacional host. Não desenvolvo um contêiner no macOS e o implanto em um servidor macOS. Eu o implanto no Linux. É isso que todo mundo faz. Então, qual é o objetivodocker.for.mac..
?docker.for.mac.host.internal
não importa se você está usando o Docker com ou semdocker-compose
. Eu quero usar um host fixo nos arquivos de configuração. IDK, por exemplo,docker.host.internal
que sempre aponta para o endereço IP do host. Independentemente de qual sistema host eu estou usando. Esse é o objetivo de usar o Docker: quero ser autônomo. Entendo que é ainda mais complicado no macOS porque você tem outra camada entre o sistema host e o contêiner. Mas de qualquer maneira, na minha opinião,docker.for.mac.host.internal
é inútil se você puder usá-lo apenas para o macOS.host.docker.internal
também funciona no Docker for Windows , pelo menos no momento da redação deste comentário.Atualização: No Docker para Mac , a partir da versão 18.03, você pode usar host.docker.internal como o IP do host. Veja a resposta de allanberry . Para versões anteriores do Docker for Mac, a seguinte resposta ainda pode ser útil:
No Docker para Mac, a
docker0
ponte não existe, portanto outras respostas aqui podem não funcionar. Todo o tráfego de saída, no entanto, é roteado através do host pai; portanto, enquanto você tenta se conectar a um IP, ele reconhece como ele próprio (e o contêiner do docker não pensa que é ele próprio), você deve conseguir se conectar. Por exemplo, se você executar isso na máquina pai, execute:Isso deve mostrar o IP do seu Mac na rede atual e o contêiner do docker também deve se conectar a esse endereço. Obviamente, isso é problemático se esse endereço IP mudar, mas você pode adicionar um IP de loopback personalizado ao seu Mac que o contêiner não pense ser ele mesmo, fazendo algo assim na máquina pai:
Em seguida, você pode testar a conexão no contêiner do docker com telnet. No meu caso, eu queria conectar-me a um servidor xdebug remoto:
Agora, quando o tráfego chegar ao seu Mac endereçado a 192.168.46.49 (e todo o tráfego que sai do contêiner passa pelo Mac), o seu Mac assume que o IP é ele próprio. Quando você terminar de usar esse IP, poderá remover o alias de loopback assim:
Uma coisa a ter cuidado é que o contêiner do docker não enviará tráfego para o host pai se achar que o destino do tráfego é ele próprio. Portanto, verifique a interface de loopback dentro do contêiner se tiver problemas:
No meu caso, isso mostrou o
inet 127.0.0.1/8
que significa que eu não poderia usar nenhum IP no127.*
intervalo. Por isso eu usei192.168.*
no exemplo acima. Verifique se o IP que você usa não entra em conflito com algo em sua própria rede.fonte
Para aqueles que executam o Docker na AWS, os metadados da instância para o host ainda estão disponíveis no contêiner.
Por exemplo:
fonte
ifconfig eth0 | grep -oP 'inet \K\S+'
A única maneira de passar as informações do host como ambiente quando você cria um contêiner
fonte
-e "DOCKER_HOST=$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+')"
(usando a resposta aceita de unix.stackexchange.com/questions/87468/... )A
--add-host
poderia ser uma solução mais líquido de limpeza (mas sem a parte da porta, apenas o hospedeiro pode ser tratado com esta solução). Então, no seudocker run
comando, faça algo como:(De https://stackoverflow.com/a/26864854/127400 )
fonte
A prática recomendada padrão para a maioria dos aplicativos que desejam fazer isso automaticamente é: você não precisa . Em vez disso, a pessoa que está executando o contêiner injeta um nome de host / endereço IP externo como configuração, por exemplo, como uma variável de ambiente ou arquivo de configuração. Permitir que o usuário injete isso fornece o design mais portátil.
Por que isso seria tão difícil? Como os contêineres isolarão o aplicativo do ambiente host. A rede está no namespace apenas para esse contêiner por padrão, e os detalhes do host são protegidos do processo em execução no contêiner, que pode não ser totalmente confiável.
Existem opções diferentes, dependendo da sua situação específica:
Se o seu contêiner estiver sendo executado com a rede do host, você poderá olhar diretamente para a tabela de roteamento no host para ver a rota padrão. A partir desta pergunta, o seguinte funciona para mim, por exemplo:
Um exemplo mostrando isso com a rede do host em um contêiner é semelhante a:
Para algumas versões do Docker Desktop, eles injetaram uma entrada DNS na VM incorporada:
Se você estiver executando em um ambiente de nuvem, poderá verificar o serviço de metadados do provedor de nuvem, por exemplo, o da AWS:
Se você deseja seu endereço externo / Internet, pode consultar um serviço remoto como:
Cada um desses possui limitações e funciona apenas em cenários específicos. A opção mais portátil ainda é executar o contêiner com o endereço IP injetado como configuração, por exemplo, aqui está uma opção executando o
ip
comando anterior no host e injetando-o como uma variável de ambiente:fonte
curl ifconfig.co
Comando realmente útil .. Obrigado :)Se você deseja um
IP
endereço real (não uma ponteIP
)Windows
e possui uma janela de encaixe18.03
(ou mais recente), faça o seguinte:Execute o bash no contêiner do host em que o nome da imagem está
nginx
(funcionaAlpine Linux distribution
):Em seguida, execute dentro do contêiner
192.168.65.2
é o IP do host - não o IP da ponte, como naspinus
resposta aceita.Estou usando aqui host.docker.internal :
fonte
Alpine Linux
? Caso contrário, verifique o equivalente para o seu específicolinux distribution
.linux containers
e não estou usandowindows containers
. Você pode fazer isso clicando com o botão direito do mousedocker icon
e selecionandoSwitch to Linux containers
. Eu acho que isso pode ser importante quando você está baixando uma imagem. Se você tiverwindows container
verificado se a exclusão danginx
imagem antiga e o download novamente, você obterá outro contêiner. Se ainda assim não funcionar para você - você pode tentar instalarnslookup
noash
.host.docker.internal
) de dentro do recipienteTLDR para Mac e Windows
... imprime o endereço IP do host ...
Detalhes
No Mac e Windows , você pode usar o nome DNS especial
host.docker.internal
.fonte
Docker para Mac Desejo conectar-me de um contêiner a um serviço no host
O host tem um endereço IP alterado (ou nenhum, se você não tiver acesso à rede). A partir de 18.03, nossa recomendação é conectar-se ao nome DNS especial host.docker.internal, que resolve o endereço IP interno usado pelo host.
O gateway também pode ser acessado como gateway.docker.internal. https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds
fonte
Se você ativou a API remota do docker (via, por exemplo) e sabe o nome do host ou o endereço IP da máquina host, isso pode ser feito com muito bash.
-H
tcp://0.0.0.0:4243
Dentro do usuário do meu contêiner
bashrc
:A segunda linha pega o ID do contêiner do
/proc/self/cgroup
arquivo local .A terceira linha se desloca para a máquina host (supondo que você esteja usando 4243 como porta do docker) e depois usa o nó para analisar o JSON retornado para o
DESIRED_PORT
.fonte
HostPort
pode ser uma informação útil aqui, infelizmente oHostIp
poderia ser0.0.0.0
Eu tenho o Ubuntu 16.03. Para mim
se não trabalhar (ip errado estava gerando)
Minha solução de trabalho foi a seguinte:
fonte
Aqui está outra opção para aqueles que executam o Docker na AWS. Essa opção evita o uso de apk para adicionar o pacote curl e economiza os preciosos 7 MB de espaço. Use o wget interno (parte do binário monolítico do BusyBox):
fonte
AFAIK, no caso do Docker for Linux (distribuição padrão), o endereço IP do host sempre será
172.17.0.1
.A maneira mais fácil de obtê-lo é via
ifconfig
(interface docker0) do host:De dentro de uma janela de encaixe, o seguinte comando de uma janela de encaixe:
ip -4 route show default | cut -d" " -f3
Você pode executá-lo rapidamente em uma janela de encaixe com a seguinte linha de comando:
Espero que ajude.
fonte
No linux você pode executar
No macOS, sua máquina host não é o host do Docker. O Docker instalará seu sistema operacional host no VirtualBox.
fonte
hostname -I
adverte para não "fazer suposições sobre a ordem da saída".Esta é uma implementação minimalista no Node.js para quem está executando o host nas instâncias do AWS EC2 , usando a instância de metadados do EC2 mencionada anteriormente .
e usado como
fonte
Se você estiver executando um contêiner do Windows em um cluster do Service Fabric, o endereço IP do host estará disponível por meio da variável de ambiente
Fabric_NodeIPOrFQDN
. Variáveis de ambiente do Service Fabricfonte
Aqui está como eu faço isso. Nesse caso, ele adiciona uma entrada de hosts em / etc / hosts na imagem do docker, apontando taurus-host para o IP da minha máquina local:
Em seguida, no contêiner do Docker, o script pode usar o nome do host taurus-host para chegar à minha máquina local que hospeda o contêiner do Docker.
fonte
Talvez o contêiner que eu criei também seja útil https://github.com/qoomon/docker-host
Você pode simplesmente usar o nome do container dns para acessar o sistema host, por exemplo, enrolar http: // dockerhost: 9200 , para que não haja problemas com nenhum endereço IP.
fonte
A solução usada é baseada em um "servidor" que retorna o endereço externo do host do Docker quando recebe uma solicitação http.
No "servidor":
1) Inicie o jwilder / nginx-proxy
2) Inicie o recipiente ipify
Agora, quando um contêiner envia uma solicitação http para o servidor, por exemplo,
o endereço IP do host do Docker é retornado por ipify via cabeçalho http "X-Forwarded-For"
Exemplo (o servidor ipify tem o nome "ipify.example.com" e é executado na porta 80, o host do docker tem IP 10.20.30.40):
Agora, dentro do contêiner, você pode ligar para:
fonte
Tente isto
fonte
No Ubuntu, o
hostname
comando pode ser usado com as seguintes opções:-i
,--ip-address
endereços para o nome do host-I
,--all-ip-addresses
todos os endereços para o hostPor exemplo:
Para atribuir à variável, a seguinte linha única pode ser usada:
fonte
Com https://docs.docker.com/machine/install-machine/
a) $ docker-machine ip
b) Obtenha o endereço IP de um ou mais computadores.
fonte