Gostaria de informar minha docker containers
configuração, da mesma maneira que você pode obter informações sobre instâncias do EC2 por meio de metadados.
Eu posso usar (desde que docker
esteja ouvindo na porta 4243
)
curl http://172.17.42.1:4243/containers/$HOSTNAME/json
para obter alguns de seus dados, mas gostaria de saber se existe uma maneira melhor de obter pelo menos o ID completo do contêiner, porque HOSTNAME
na verdade é reduzido para 12 caracteres e o docker parece executar uma "melhor correspondência" nele.
Além disso, como posso obter o IP externo do host do docker (além de acessar os metadados do EC2, específicos da AWS)
/var/run/docker.sock
, é possível (trivial) romper a contenção fornecida pelo docker e obter acesso à máquina host. Obviamente, isso é potencialmente perigoso.Respostas:
Descobri que o ID do contêiner pode ser encontrado em / proc / self / cgroup
Assim, você pode obter o ID com:
fonte
cat /proc/self/cgroup | grep "docker" | sed s/\\//\\n/g | tail -1
cat /proc/self/cgroup | grep 'docker' | sed 's/^.*\///' | tail -n1
cat /proc/1/cgroup | grep 'docker/' | tail -1 | sed 's/^.*\///' | cut -c 1-12
basename "$(cat /proc/1/cpuset)"
ebasename "$(head /proc/1/cgroup)"
A menos que substituído, o nome do host parece ser o ID do contêiner curto no Docker 1.12
Externamente
fonte
const os = require('os'); console.log(os.hostname());
InetAddress.getLocalHost().getHostName()
.$HOSTNAME
(por exemplo, em scripts de shell).Você pode se comunicar com a janela de encaixe de dentro de um contêiner usando soquete unix via Docker Remote API:
https://docs.docker.com/engine/reference/api/docker_remote_api/
Em um contêiner, você pode descobrir um ID de janela de encaixe em curto examinando
$HOSTNAME
env var. Segundo o doc, há uma pequena chance de colisão, acho que, para um pequeno número de contêiner, você não precisa se preocupar com isso. Não sei como obter o ID completo diretamente.Você pode inspecionar o contêiner da mesma maneira descrita na resposta banyan :
Resposta:
Como alternativa, você pode transferir o ID da janela de encaixe para o contêiner em um arquivo. O arquivo está localizado no "volume montado" e é transferido para o contêiner:
O ID da janela de encaixe (abreviado) estará no arquivo /mydir/host1.txt no contêiner.
fonte
env
que não listaHOSTNAME
, masecho $HOSTNAME
funciona.requests.exceptions.MissingSchema: Invalid URL '/containers/1d26a841bf07/json': No schema supplied. Perhaps you meant http:///containers/1d26a841bf07/json?
Isso obterá o ID completo do contêiner dentro de um contêiner:
fonte
Um comentário de madeddie parece mais elegante para mim:
fonte
AVISO: Você deve entender os riscos de segurança desse método antes de considerá-lo. Resumo de John do risco:
Dentro do contêiner, o dockerId é o seu nome de host. Então, você poderia:
--volume /var/run/docker.sock:/var/run/docker.sock --privileged
docker inspect $(hostname)
dentro do contêinerEvite isso. Somente faça isso se você entender os riscos e tiver uma mitigação clara dos riscos.
fonte
--hostname
opção de execução do docker tiver sido usada.--hostname
estiver definido, você poderá usar uma combinação desta resposta e o comentário de @Jay Taylor na resposta aceita:docker inspect $(cat /proc/self/cgroup | grep 'docker' | sed 's/^.*\///' | tail -n1)
para obter todas as informações sobre o contêiner em execução.Para simplificar,
Para obter o nome do host,
ou
ou
A saída pode ser redirecionada para qualquer arquivo e lida novamente a partir da aplicação.
# hostname > /usr/src//hostname.txt
fonte
Descobri que na versão 17.09 existe uma maneira mais simples de fazê-lo no contêiner do docker:
Ou, como já foi dito, uma versão mais curta com
Ou simplesmente:
fonte
O Docker define o nome do host como o ID do contêiner por padrão, mas os usuários podem substituí-lo por
--hostname
. Em vez disso, inspecione/proc
:Aqui está uma lista prática para extrair o ID do contêiner:
fonte
Você pode usar esta linha de comando para identificar o ID do contêiner atual (testado com a janela de encaixe 1.9).
Em seguida, faça uma pequena solicitação à API do Docker (você pode compartilhar /var/run/docker.sock) para recuperar todas as informações.
fonte
Algumas soluções postadas pararam de funcionar devido a alterações no formato de
/proc/self/cgroup
. Aqui está um único comando GNU grep que deve ser um pouco mais robusto para formatar alterações:Para referência, aqui estão os trechos de / proc / self / cgroup dos contêineres do docker que foram testados com este comando:
Linux 4.4:
Linux 4.8 - 4.13:
fonte
fonte
Além disso, se você tem o pid do contêiner e deseja obter o ID da janela de encaixe desse contêiner, uma boa maneira é usar o nsenter em combinação com a mágica sed acima:
nsenter -n -m -t pid -- cat /proc/1/cgroup | grep -o -e "docker-.*.scope" | head -n 1 | sed "s/docker-\(.*\).scope/\\1/"
fonte
Use
docker inspect
.Pode obter o ip da seguinte maneira.
fonte