Preámbulo

Algunos dicen que es por motivos de seguridad, otros porque no desean implementar IPv6. Quién les escribe, es porque no soporta escribir docker ps y que cada contenedor ocupe más de una línea. Cuándo ocupa más de una línea, el nombre del contenedor aparece en lugares que no son óptimos para leer.

Una forma de resolver esto, es especificar el puerto a usar, pero anteponiendo una IPv4.

Caso de prueba

Se muestra este docker-compose.yml de ejemplo:

services:
  glance:
    container_name: glance
    image: glanceapp/glance
    restart: unless-stopped
    volumes:
      - ./config:/app/config
      - ./assets:/app/assets
      - /etc/localtime:/etc/localtime:ro
      # Optionally, also mount docker socket if you want to use the docker containers widget
      # - /var/run/docker.sock:/var/run/docker.sock:ro
    ports:
      - 100:8080
    env_file: .env

Este archivo va a exponer el puerto 100 en el host para IPV4 e IPV6, por eso al ejecutar docker ps, la salida será:

root@vps-home:/etc/docker/containers/glance# docker ps
CONTAINER    ID       IMAGE COMMAND CREATED STATUS PORTS NAMES 
f368f79a587a glanceapp/glance "/app/glance --confi…" 2 days ago Up 6 hours 0.0.0.0:100->8080/tcp, [::]:100->8080/tcp glance

Y este caso no es el peor, porque apenas tiene un puerto abierto. Cuándo se tienen dos o tres, la desorganización por tener IPV4 e IPV6 (cuándo el último no es necesario) es muy grande.

Solución

Tomando de ejemplo el docker-compose.yml anterior, se debe dejar la zona de puertos de la siguiente manera:

    ports:
        - "0.0.0.0:100:8080/tcp"

Al colocar la IPV4 “0.0.0.0”, Docker utiliza sólo este estándar.

Epílogo

El administrador de sistemas ahora aprendió a resolver este problema de forma sencilla y sin tener que tocar el core de Docker o Linux.

¡Nos vemos en el próximo post!

Tip extra

Si sólo quisiera usarse IPV6, la zona del docker-compose.yml sería:

    ports:
        - "[::]:100:8080"