docker

TOPICS


Agosto 2020

  Docker enchulame la lista de contenedores
Agosto 1   |   Docker

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}}'
            
            
        

Y obtenemos esto:

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.

  1. Este blog esta desarrollado con HUGO, el cual a su vez usa GoLang html y text templates. ↩︎

Marzo 2020

  Docker solucionar el nombre duplicado de red
Marzo 25   |   Docker

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:

  1. El servicio de docker debe estar detenido
  2. No debe existir un contenedor usando la red
  3. 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

  1. Crear una nueva red con -d especificamos el driver

docker network create -d bridge [nuevo-nombre-de-red]

  1. Desconectar el o los containers de la red ambigua

    docker network disconnect bridge [contenedor]

  2. Conectar el o los containers hacia la nueva red

    docker network connect [nuevo-nombre-de-red] [contenedor]

  3. 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