No estoy seguro de haber entendido mal algo aquí, pero parece que solo es posible establecer asignaciones de puertos creando un nuevo contenedor a partir de una imagen. ¿Hay alguna manera de asignar una asignación de puertos a un contenedor Docker existente?
docker
port
lxc
linux-containers
thasmo
fuente
fuente
Respuestas:
Puede cambiar la asignación de puertos editando directamente el
hostconfig.json
archivo en/var/lib/docker/containers/[hash_of_the_container]/hostconfig.json
Puede determinar el [hash_of_the_container] mediante el
docker inspect <container_name>
comando y el valor del campo "Id" es el hash.Por lo tanto, no necesita crear una imagen con este enfoque. También puede cambiar la bandera de reinicio aquí.
PD: puede visitar https://docs.docker.com/engine/admin/ para obtener información sobre cómo reiniciar correctamente su motor Docker según su máquina host. Solía
sudo systemctl restart docker
reiniciar mi motor Docker que se ejecuta en Ubuntu 16.04fuente
hostconfig.json
yconfig.v2.json
hacer que esto funcione. Use el enlace proporcionado por @rohitmohta para ver los detalles.screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
Una vez que ejecute el tty puede navegar a / var / lib / dockerTambién estoy interesado en este problema.
Como mencionó @Thasmo , los reenvíos de puertos se pueden especificar SOLO con el comando
docker run
(ydocker create
).Otros comandos,
docker start
no tiene-p
opción ydocker port
solo muestra los reenvíos actuales.Para agregar reenvíos de puertos, siempre sigo estos pasos,
dejar de correr contenedor
comprometer el contenedor
NOTA: Lo anterior,
test02
es una nueva imagen que estoy construyendo desde eltest01
contenedor.volver a ejecutar desde la imagen comprometida
Donde el primer 8080 es el puerto local y el segundo 8080 es el puerto de contenedores.
fuente
docker start
?Si por "existente" te refieres a "en ejecución", entonces (actualmente) no es posible agregar una asignación de puertos.
Sin embargo, puede agregar dinámicamente una nueva interfaz de red con, por ejemplo , Pipework , si necesita exponer un servicio en un contenedor en ejecución sin detenerlo / reiniciarlo.
fuente
No estoy seguro si puede aplicar la asignación de puertos a un contenedor en ejecución. Puede aplicar el reenvío de puertos mientras ejecuta un contenedor que es diferente de crear un nuevo contenedor.
comenzará a ejecutar el contenedor. Este tutorial explica la redirección de puertos.
fuente
docker run
crea e inicia un nuevo contenedor. Es equivalente a hacerdocker create
seguido dedocker start
.Editar hostconfig.json parece no funcionar ahora. Solo termina con ese puerto expuesto pero no publicado en el host. Comprometer y recrear contenedores no es el mejor enfoque para mí. Nadie mencionó
docker network
?La mejor solución sería usar proxy inverso dentro de la misma red
Cree una nueva red si su contenedor anterior no está en ninguno.
docker network create my_network
Une tu contenedor existente a la red creada
docker network connect my_network my_existing_container
Inicie un servicio de proxy inverso (por ejemplo, nginx) publicando los puertos que necesita, uniéndose a la misma red
docker run -d --name nginx --network my_network -p 9000:9000 nginx
Opcionalmente, elimine default.conf en nginx
docker exec nginx rm /etc/nginx/conf.d/default.conf
Crear una nueva configuración nginx
Copie la configuración al contenedor nginx.
docker cp ./my_conf.conf nginx:/etc/nginx/conf.d/my_conf.conf
Reiniciar nginx
docker restart nginx
Ventajas : para publicar nuevos puertos, puede detener / actualizar / recrear de forma segura el contenedor nginx como lo desee sin tocar el contenedor empresarial. Si necesita cero tiempo de inactividad para nginx, es posible agregar más servicios proxy invertidos uniéndose a la misma red. Además, un contenedor puede unirse a más de una red.
Editar:
Para invertir los servicios proxy que no son http, el archivo de configuración es un poco diferente. Aquí hay un ejemplo simple:
fuente
En Fujimoto, el ejemplo de Youichi
test01
es un contenedor, mientras quetest02
es una imagen.Antes de hacerlo
docker run
, puede eliminar el contenedor original y luego asignarle nuevamente el mismo nombre:(Utilizando
-P
para exponer puertos a puertos aleatorios en lugar de asignarlos manualmente).fuente
Si lo ejecuta
docker run <NAME>
, generará una nueva imagen, que probablemente no sea lo que desea.Si desea cambiar una imagen actual, haga lo siguiente:
docker ps -a
Tome la identificación de su contenedor de destino y vaya a:
Detener el contenedor:
Cambiar los archivos
Y cambiar archivo
Reinicia tu docker y debería funcionar.
fuente
A la inversa, si no se siente cómodo con la configuración de profundidad de Docker, IPtables sería su amigo.
Este es solo un truco, no una forma recomendada, funciona con mi escenario porque no pude detener el contenedor, espero que también te ayude.
fuente
DOCKER_PORT
aMACHINE_PORT
qué partes debe ser cambiado?Podemos usar herramientas útiles como ssh para lograr esto fácilmente.
Estaba usando el host ubuntu y la imagen de docker basada en ubuntu.
cuando se necesita un nuevo puerto para mapear,
dentro del docker ejecuta el siguiente comando
172.17.0.1 era la ip de la interfaz del acoplador (puede obtener esto ejecutándose
ifconfig docker0 | grep "inet addr" | cut -f2 -d":" | cut -f1 -d" "
en el host).aquí tenía el puerto 8888 local asignado de nuevo a los hosts 8888. puede cambiar el puerto según sea necesario.
si necesita un puerto más, puede eliminar el ssh y agregarle una línea más de -R con el nuevo puerto.
He probado esto con netcat.
fuente
/var/lib/docker/containers/${container_id}
directorio y editarhostconfig.json
PortBindings.HostPort
que quieres el cambio.fuente
Para los usuarios de Windows y Mac, hay otra forma bastante fácil y amigable de cambiar el puerto de mapeo:
fuente
Respuesta corta: no puede asignar una asignación de puerto a un contenedor Docker existente
Necesitas un nuevo contenedor ... lidiar con él.
fuente
Si simplemente desea cambiar el puerto del contenedor en ejecución, haga lo siguiente:
donde como:
fuente
docker run
comando,NAME
es el nombre de la imagen para realizar un contenedor de, mientras que endocker stop
elNAME
se refiere al nombre del contenedor de la parada.