Network
TOPICS
Agosto 2020
Siempre que ejecuto docker ps
para listar los contenedores me resulta difícil entender donde inicia y donde termina la información sobre cada contenedor:
¡Que carajos! ... el puerto ¿cúal? ... siento que casi estoy viendo la matrix
Debo admitir que después de un tiempo tus ojos se acostumbran y comienzan a hacer cosas raras pero comienzas a entender el resultado. Claro que no debería ser así, por lo que encontré que tenemos algunas opciones para mejorar el resultado.
Utilizar —format
Al utilizar la opción --format
, podemos elegir de una serie campos disponibles e incluso despegarlos de forma mas ordenada usando la sintaxis table {{.FieldName}}\t
. La opción format utiliza Go templates algo que me resulta familiar1.
table
incluye los encabezados y \t
agrega espacio entre las columnas.
Ejemplo usando --format
docker ps --format 'table {{.Names}}\t
{{.Status}} : {{.RunningFor}}\t
{{.ID}}\t
{{.Image}}'
Definitivamente resulta mucho más fácil de comprender
Sacando provecho a los Go Templates
Nos podemos poner creativos y si necesitamos por ejemplo consultar los contenedores con información de red utilicemos las características de los GoLang Templates para detectar si hay puertos y desplegarlos en cada linea:
Información de red
docker ps --format 'table {{.Names}}
\t{{.Status}}
\t{{.Networks}}
\n{{.ID}}
{{if .Ports}}
{{with $p := split .Ports ", "}}
{{range $p}}\t\t{{println .}}{{end}}
{{end}}
{{else}}
\t\t{{println "No Ports"}}
{{end}}'
Como ven mucho mejor ordenado en dos columnas y con todos los datos de la red y puertos mas legibles
Todos los containers docker ps –a
Podemos revisar todos los contenedores (activos y no activos) utilizando la opción -a
. Aprovechando los templates añadamos el tamaño en disco, como utiliza la red y la imagen de donde proviene el contenedor.
Información de todos los contenedores
docker ps -a -q --format 'table {{.Names}}\t
{{.Status}}\t
{{.Size}}\n
{{.ID}}\t
{{.Image}}
{{if .Ports}}
{{with $p := split .Ports ", "}}\t
{{len $p}} port(s) on {{end}}{{- .Networks}}
{{else}}\tNo Ports on {{ .Networks }}
{{end}}\n'
De esta manera podemos ver en general el estado de nuestros contenedores.
Crear una función para reutilizar los comandos
Finalmente podemos crear una función para utilizar estos comandos (si estas utilizando WSL o Linux) dentro de nuestro .bash_aliases
Crear una función bash que acepta parámetros
# Docker PS Prettify Function
function dock() {
if [[ "$@" == "ps" ]]; then
command docker ps --format 'table {{.Names}}\t{{.Status}} : {{.RunningFor}}\t{{.ID}}\t{{.Image}}'
elif [[ "$@" == "psa" ]]; then
# docker ps -a includes all containers
command docker ps -a --format 'table {{.Names}}\t{{.Status}}\t{{.Size}}\n{{.ID}}\t{{.Image}}{{if .Ports}}{{with $p := split .Ports ", "}}\t{{len $p}} port(s) on {{end}}{{- .Networks}}{{else}}\tNo Ports on {{ .Networks }}{{end}}\n'
elif [[ "$@" == "psnet" ]]; then
# docker ps with network information
command docker ps -a --format 'table {{.Names}}\t{{.Status}}\t{{.Networks}}\n{{.ID}}{{if .Ports}}{{with $p := split .Ports ", "}}{{range $p}}\t\t{{println .}}{{end}}{{end}}{{else}}\t\t{{println "No Ports"}}{{end}}'
else
command docker "$@"
fi
}
Para utilizarlo basta ahora con teclear:
- dock ps
- Contenedores en ejecución con su imagén
- dock psa
- Todos los contenedores incluyendo tamaño en disco y datos de red
- dock psnet
- Contenedores en ejecución con información de red
Campos disponibles en docker
- .ID
- Identificador del contenedor
- .Image
- Id de la imagén
- .Command
- Comando de ejecución
- .CreatedAt
- Tiempo cuando el contenedor se creó.
- .RunningFor
- Tiempo transcurrido desde que se inició el contenedor.
- .Ports
- Puertos utilizados por el contenedor.
- .Status
- Estado del contenedor.
- .Size
- Espacio que ocupa en disco el contenedor.
- .Names
- Nombre del contenedor.
- .Labels
- Todas las etiquetas asignadas al contenedor.
- .Label
- Valor especifico para una etiqueta. Por ejemplo ‘{{.Label “com.docker.swarm.cpu”}}’
- .Mounts
- Nombre de los volúmenes montados en este contenedor.
- .Networks
- Nombre de las redes adjuntas al contenedor.
Marzo 2020
El Problema
Un día tuve que reiniciar mi servidor linux y como Murphy no falla al regresar la instancia de docker estaba vacía sin ningún container
, después de explorar un rato y revisar que todo estuviera en orden no encontré la causa, hice lo que se debe hacer … reinicie nuevamente el servidor y ohh sorpresa ahi estaban de nuevo todos mis containers ¡Genial! pero … al momento de intentar iniciarlos
ERROR: network xxxx is ambiguous (2 matches found based on name)
Los porques
Encontré que es valido duplicar el nombre de la red en docker, mi sospecha es que al no encontrar la configuración docker generó nuevamente toda las redes porque como pueden ver se duplicaron las redes y los drivers
docker network list
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
27b6c27fdc2b bridge bridge local
33f2a0c04878 bridge bridge local
c4247d693521 host host local
9b95be563bf7 host host local
590102262bb5 none null local
25e1bf9dc86 none null local
Asi que la solucion parece simple eliminar la red duplicada y ya esta docker network rm [ID]
, lo intente pero ….
Error : bridge is a pre-defined network and cannot be removed
La solución no parece ser tan trivial, en algún foro encontré que para poder eliminar la red:
- El servicio de docker debe estar detenido
- No debe existir un contenedor usando la red
- No tener ningún contenedor creado
Por cierto para ver cuales containers están usando la red puedes usar:
Inspect network ID of a container
# Como bridge esta repetido necesitas hacerlo por Id y revisar la sección de "Containers"
docker network inspect [id || name]
"Internal": false,
{ "Network": "" },
"ConfigOnly": false,
"Containers": {},
La opción uno y dos no funcionaron y no podía darme el lujo de eliminar los containers y volverlos a crear pues ya los tenia configurados con sus volúmenes y otras cosas asi que la solución es:
Solución
- Crear una nueva red con -d especificamos el driver
docker network create -d bridge [nuevo-nombre-de-red]
-
Desconectar el o los containers de la red ambigua
docker network disconnect bridge [contenedor]
-
Conectar el o los containers hacia la nueva red
docker network connect [nuevo-nombre-de-red] [contenedor]
-
Opcional. Purgar nuestra red para eliminar aquellas redes que no estamos utilizando.
docker network rm $(docker network ls -q)
Listo ya con esto podemos iniciar nuestro container
docker start my-happy-container
Marzo 2019
Un antiguo comando DOS que permite rápidamente vincular un directorio a una unidad en Windows puede resultar muy útil para muchos escenarios, entre los más comunes están el emular entornos de producción en maquinas de desarrollo, actualmente lo he utilizado para mantener las políticas de publicación de visual studio entre las maquinas de los desarrolladores. Hay dos maneras de hacerlo:
subts
subts
REM to create
subst X: "C:\Users\ProgramadorSinSuerte\MiFolder"
REM to delete
subst X: /D
- Después de la unidad dejar un espacio en blanco
- Si el directorio lleva espacios se pueden utilizar comillas “\directorio con espacios"
- Notar que al final no se incluye el carácter diagonal “
\
”
✍️ Este comando espera que el directorio siempre este disponible de lo contrario se volverá loco buscándolo como si de una unidad física se tratara mermando el desempeño de la maquina. Por ello se recomienda usarlo con directorios presentes de manera local.
✍️ El mapeo se elimina con cada reinicio, si se necesita que este presente siempre, se puede colocar en el directorio de inicio de Windows C:\Program Data\Microsoft\Windows\Start Menu\Programs\Startup
🔗 (WindowsKey + R, type: shell:common startup
)
net use
net use D: \\localhost\c$\Users\ProgramadorSinSuerte\MiFolder
✍️ Este comando es mas tolerante a fallos en cuando a la disponibilidad del recurso. Generalmente se utiliza para recursos compartidos en red.