msgbartop
Que no cunda el pánico
msgbarbottom

22 oct 23 Cómo editar los puertos a un contenedor docker en ejecución

Una de las gracias de ejecutar servicios en un contenedor docker es que, si cambian las necesidades del contenedor (como por ejemplo publicar en un nuevo puerto), es bastante sencillo aprovisionar uno nuevo sin mayores consecuencias. Pero a veces pasa que no puedes destruir y aprovisionar un nuevo contenedor, bien porque tienes determinada información persistente en el mismo (cosa que no debe hacerse, ya que en teoría los contenedores han de poder ser sin estado, pero esa es otra historia) o por cualquier otro motivo, y precisas de mantener el mismo contenedor, pero modificando (bien añadiendo, quitando o reemplazando puertos) el contenedor existente. Aunque no es una buena práctica, es posible realizarlo, siguiendo los siguientes pasos (por supuesto, recomiendo hacer primero una copia de seguridad de los ficheros modificados):

  • Detener el contenedor en cuestion: Haremos un docker ps para obtener el listado de contenedores, y poder identificar nuestro contenedor en cuestión. Tras ello, lo detendremos con un docker stop .
  • Abrir el directorio que contiene el docker: Lo más normal es que haya que realizarlo con permisos de root. Se encontrará bajo la ruta /var/lib/docker/containers/, y allí tendremos que entrar en una carpeta que comience por el id del contenedor.
  • Editar el fichero hostconfig.json para modificar las asociaciones de puertos entre host y contenedor: Una vez en la carpeta, tendremos que editar el fichero hostconfig.json. Esto nos permitirá reconfigurar las asociaciones de puertos entre el host y el contenedor docker. Para añadir un nuevo puerto, tendremos que añadir una entrada en la sección PortBindings. Por ejemplo, si quisiéramos añadir el puerto 18334/tcp a un docker que publique por el puerto 18332, tendríamos que dejar esa sección de la siguiente manera:

    “PortBindings”:{“18332/tcp”:[{"HostIp":"","HostPort":"18332"}],”18334/tcp”:[{"HostIp":"","HostPort":"18334"}]}

  • Editar el fichero config.v2.json para modificar las exposiciones de puertos del contenedor: Asociar el puerto por sí solo no es suficiente, es preciso decirle al contenedor que tiene que exponer un nuevo puerto, que habrá de coincidir con el añadido en el punto anterior. Para ello, hay que modificar el fichero config.v2.json, bajo la sección ExposedPorts. Como en el caso anterior, si quisiéramos publicar ese puerto 18334/tcp, tendría que quedar como sigue:

    “ExposedPorts”:{“18332/tcp”:{},”18334/tcp”:{}},

  • Reiniciar el servicio docker: Bastará con un sudo systemctl restart docker.
  • Iniciar el contenedor: En caso de que el contenedor no se haya iniciado de manera automática al reiniciar el servicio docker, tendremos que iniciarlo a mano con un docker start . Posteriormente, con un docker ps podremos verificar que hemos modificado adecuadamente los puertos expuestos.

Referencias:

VN:F [1.9.20_1166]
Rating: 0.0/10 (0 votes cast)

Etiquetas: , , ,