Como especificar o nome do host para o contêiner em execução?

51

Estou tendo problemas para definir o nome do host em um contêiner de estivador em execução. Também estou com problemas para entender como especificar o nome do host após o início da imagem.

Iniciei um contêiner a partir de uma imagem que baixei:

sudo docker run -p 8080:80 -p 2222:22 oskarhane/docker-wordpress-nginx-ss

Mas eu esqueci de especificar o nome do host -h; como posso especificar o nome do host agora que o contêiner está em execução?

Miguel Ping
fonte
Você pode simplesmente parar o contêiner e iniciá-lo novamente, fornecendo um nome de host?
Dawud 20/04
AFAIK que funciona apenas quando você cria runuma imagem, não quando inicia um contêiner.
Miguel Ping
Às vezes, tudo o que você deseja é ver o prompt de comando bash com um nome adequado. Se for esse o caso, você pode editar o valor PS1 em .bashrc. Consulte askubuntu.com/a/549150/55365 para obter sugestões. Em qualquer PS1, você pode adicionar uma sequência (colorida) cercada por * ou # para separá-la, com o nome do servidor ou serviço.
SPRBRN
@dawud você não pode dar um novo nome de host quando runing docker restart documentação
dangonfast

Respostas:

48

A edição /etc/hostnameé uma coisa para a qual você precisa de acesso ssh dentro do contêiner. Caso contrário, você pode girar o contêiner com a -hopção

Para definir os nomes de host e domínio:

$ docker run -h foo.bar.baz -i -t ubuntu bash
root@foo:/# hostname
foo
root@foo:/# hostname -d
bar.baz
root@foo:/# hostname -f
foo.bar.baz
amitmula
fonte
5
Você pode, docker exec /bin/bashem um contêiner em execução, não precisar instalar ssh(o que é uma prática recomendada para fins de administração).
Jjmontes # 13/16
Você também pode editar o arquivo / etc / hosts que foi resolvido corretamente em um endereço.
21417 dtoubelis
2
Você não pode alterar o nome do host em um contêiner em execução com hostname(recurso ausente). A execução docker run -h <hostname> <image> <container-name>cria um novo contêiner com o nome do host fornecido.
precisa saber é o seguinte
6

Pare o contêiner e o serviço

sudo docker stop CONTAINER_NAME
sudo service docker stop

Editar arquivo de configuração (JSON) [Você deve fazer o backup primeiro]

/var/lib/docker/containers/CONTAINER_ID/config.json

Substituir

"Hostname": "WHATEVER"

com

"Nome do host": "NEW_HOSTNAME"

Iniciar contêiner e serviço

sudo service docker start
sudo docker start CONTAINER_NAME

(Opcionalmente, você também pode conectar a janela de encaixe)

sudo docker attach CONTAINER_NAME

Detalhes sobre janelas de encaixe (por exemplo, CONTAINER_NAME, CONTAINER_ID) podem ser obtidos executando

sudo docker ps -a
Tomot
fonte
não funciona ser substituído toda vez que inicio o contêiner.
Ahmed
isso é estranho. Acabei de reproduzir essas etapas e ainda funciona. docker versão 1.7.1. você tem certeza de que fechou o contêiner e o serviço antes de editar o arquivo?
Tomot
Funciona no Docker 17.04.0-ce, ao editar o / etc / hostname. Se você ainda não criou o contêiner, a outra resposta com -h é melhor, mas no meu caso eu já havia me dado ao trabalho de configurar o contêiner e não queria recriá-lo apenas para definir o nome do host.
Una
Não funciona #Docker version 17.05.0-ce, build 89658be
2100 dangonfast
4

Reiniciar o contêiner seria a opção mais fácil - mas você também pode editar / etc / hostname e partir daí.

James V
fonte
A edição /etc/hostnamenão tem efeito após a reinicialização, pois é substituída todas as vezes pelo nome do host "real", gerenciado pelo docker. Você não pode executar hostnameno recipiente, uma vez que o recipiente não tem recursos para essa operação (por padrão, e você não quer mudar isso)
dangonfast
E editar /etc/hostnamee não reiniciar o contêiner não tem propósito.
dangonfast
1

https://evolvingweb.ca/blog/changing-docker-hostnames-namespaces descreve uma maneira de fazer isso. A idéia básica é usar docker inspectpara obter o pid do contêiner e, em seguida, insira o namespace uts do contêiner via nsenter. A execução hostnamedentro desse espaço para nome altera o nome do host da instância do docker que compartilha esse espaço para nome.

Chaim Geretz
fonte
2
por favor, adicionar a solução diretamente aqui, e não um link externo que pode desaparecer
Orphans
0

Como algumas outras pessoas apontaram, isso pode ser alterado para contêineres modificando o config.v2.jsonarquivo.

Apenas certifique-se de que o serviço Docker esteja parado antes da edição do arquivo, caso contrário, SERÁ OVERWRITTEN. Os passos DEVEM ser feitos nesta ordem

  • Pare o contêiner
  • Pare o serviço Docker
  • Modifique o /var/lib/docker/containers/CONTAINER_ID/config.v2.jsonarquivo - -

  • Iniciar o serviço Docker

  • Iniciar o contêiner

Isso foi confirmado para mim no Docker v17.05.0-ce, em um contêiner usando --net=host. Modificar o /etc/hostnamearquivo não funciona e o arquivo é substituído.

user1270949
fonte
-3

No

 /var/lib/docker/containers/CONTAINER/config.json

encontrar e definir

"Config":{"Hostname":"utils","Domainname":"mysite.com", ...}
Oleg Neumyvakin
fonte
Não funciona Docker version 17.05.0-ce, build 89658be. O Config é substituído, quem sabe de onde. E o nome do host em si não muda após a reinicialização.
dangonfast