¿Cómo especificar el nombre de host para el contenedor en ejecución?

51

Tengo problemas para configurar el nombre de host en un contenedor Docker en ejecución. También tengo problemas para comprender cómo especificar el nombre de host después de que se inicia la imagen.

Comencé un contenedor desde una imagen que descargué:

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

Pero olvidé especificar el nombre de host a través -h; ¿Cómo puedo especificar el nombre de host ahora que el contenedor se está ejecutando?

Miguel Ping
fuente
¿Puede detener el contenedor e iniciarlo nuevamente proporcionando un nombre de host?
dawud
AFAIK que solo funciona cuando tienes rununa imagen, no cuando comienzas un contenedor.
Miguel Ping
A veces, todo lo que desea es ver el símbolo del sistema bash con un nombre propio. Si ese es el caso, puede editar el valor de PS1 en .bashrc. Mire askubuntu.com/a/549150/55365 para sugerencias. En cualquier PS1, puede agregar una cadena (de color) rodeada por * o # para diferenciarla, con el nombre del servidor o servicio.
SPRBRN
@dawud no puede dar un nuevo nombre de host al ejecutar la docker restart documentación
dangonfast

Respuestas:

48

Editar /etc/hostnamees una cosa para la que necesita acceso ssh dentro del contenedor. De lo contrario, puede girar el contenedor con la -hopción.

Para configurar el host y los nombres de dominio:

$ 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
fuente
55
Puede docker exec /bin/bashhacerlo en un contenedor en ejecución, no es necesario instalarlo ssh(lo cual es una mala práctica para fines de administración).
jjmontes
También es posible que desee editar / etc / hosts para que se resuelva correctamente en una dirección.
dtoubelis
2
No puede cambiar el nombre de host en un contenedor en ejecución con hostname(capacidad faltante). La ejecución docker run -h <hostname> <image> <container-name>crea un nuevo contenedor con el nombre de host dado.
dangonfast
6

Detener contenedor y servicio

sudo docker stop CONTAINER_NAME
sudo service docker stop

Editar archivo de configuración (JSON) [Primero debe hacer una copia de seguridad]

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

Reemplazar

"Nombre de host": "CUALQUIERA"

con

"Nombre de host": "NEW_HOSTNAME"

Iniciar contenedor y servicio

sudo service docker start
sudo docker start CONTAINER_NAME

(Opcionalmente, también puede adjuntar acoplador)

sudo docker attach CONTAINER_NAME

Los detalles sobre los acopladores (es decir, CONTAINER_NAME, CONTAINER_ID) se pueden obtener ejecutando

sudo docker ps -a
Tomot
fuente
no funciona se sobrescribe cada vez que inicio el contenedor.
Ahmed
eso es extraño. Acabo de reproducir estos pasos y aún funciona. Docker versión 1.7.1. ¿está seguro de que cerró el contenedor y el servicio antes de editar el archivo?
Tomot
Funciona en Docker 17.04.0-ce, cuando la edición / etc / hostname no lo hizo. Si aún no ha creado el contenedor, la otra respuesta con -h es mejor, pero en mi caso ya me había tomado la molestia de configurar el contenedor y no quería volver a crearlo solo para configurar el nombre de host.
Una
No funcionaDocker version 17.05.0-ce, build 89658be
dangonfast
4

Reiniciar el contenedor sería la opción más fácil, pero también puede editar / etc / hostname e ir desde allí.

James V
fuente
La edición /etc/hostnameno tiene efecto después del reinicio, ya que se sobrescribe cada vez con el nombre de host "real", administrado por docker. No puede ejecutarse hostnameen el contenedor, ya que el contenedor no tiene capacidades para esa operación (de forma predeterminada, y no desea cambiar eso)
dangonfast
Y editar /etc/hostnamey no reiniciar el contenedor no tiene ningún propósito.
dangonfast
1

https://evolvingweb.ca/blog/changing-docker-hostnames-namespaces describe una forma de hacerlo. La idea básica es usar docker inspectpara obtener el pid del contenedor, luego ingrese el espacio de nombres uts del contenedor a través de nsenter. La ejecución hostnamedentro de ese espacio de nombres cambiará el nombre de host para la instancia de acoplador que comparte ese espacio de nombres.

Jaim Geretz
fuente
2
agregue la solución directamente aquí, y no un enlace externo que pueda desaparecer
Orphans
0

Como algunos otros han señalado, esto se puede cambiar para contenedores modificando el config.v2.jsonarchivo.

Solo asegúrese de que el servicio Docker se haya detenido antes de editar el archivo, de lo contrario, se sobreescribirá. Los pasos DEBEN hacerse en este orden

  • Detener el contenedor
  • Detener el servicio Docker
  • Modificar el /var/lib/docker/containers/CONTAINER_ID/config.v2.jsonarchivo -

  • Inicie el servicio Docker

  • Comience el contenedor

Esto se ha confirmado que funciona para mí en Docker v17.05.0-ce, en un contenedor usando --net=host. Modificar el /etc/hostnamearchivo no funciona y el archivo simplemente se sobrescribe.

usuario1270949
fuente
-3

En

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

encontrar y establecer

"Config":{"Hostname":"utils","Domainname":"mysite.com", ...}
Oleg Neumyvakin
fuente
No funciona Docker version 17.05.0-ce, build 89658be. Config se sobrescribe, quién sabe de dónde. Y el nombre de host en sí no cambia después de reiniciar.
dangonfast