/ HOWTO

Tips para recordar.


Docker tips.

Recordando que este es un sitio de “tips” para Docker, preparamos este post con muchas de los comandos que usamos a diario.

Como verificar la versión del DockerD (servicio) y del Docker (Cliente) que estemos usando. Con la gran evolución que tuvo el producto debemos tener claro que versión usamos porque algunos comandos y sintáxis han cambiado.

# docker version
Client:
 Version:           18.06.0-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        0ffa825
 Built:             Wed Jul 18 19:09:33 2018
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.0-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       0ffa825
  Built:            Wed Jul 18 19:07:38 2018
  OS/Arch:          linux/amd64
  Experimental:     false

Crear un contenedor, correr bash y borrarlo cuando acabe (rm).

# docker run --rm -it debian /bin/bash

Podemos ver las variables de entorno con “env” en lugar de correr un bash.

# docker run --rm -it debian env

Como ver los logs de un contenedor corriendo-

# docker logs -f debian

Dentro de un contenedor corriendo podemos instalar un servicio como ssh.

# docker run --rm -it debian /bin/bash
$ sudo apt install openssh-server

Ver los contenedores corriendo y los creados aunque no estén corriendo.

# docker ps
# docker ps -a

Como ver las imágenes descargadas.

# docker images

Como limpiar todo lo que hayamos hecho en docker.

# rm -R /var/lib/docker 
# /etc/init.d/docker restart

Como invocar comandos de docker con menos letras.

# alias dokl="docker ps"
# alias dokc="docker ps -a"
# alias doks="docker stats"
# alias dokr="docker restart"
# alias docrmcon="docker ps -aq | xargs docker rm"
# alias docrmima="docker images -aq -f dangling=true | xargs docker rmi"

¿ Está corriendo el contenedor?

# docker inspect --format '{{.State.Running}}' $(docker ps -lq)

Definir un tipo de Contenedor con lo que siempre necesitamos. Usando un “Dockerfile”.

FROM ubuntu:16.04
RUN apt-get update -y
RUN apt-get install -y mercurial
RUN apt-get install -y git
RUN apt-get install -y python
RUN apt-get install -y curl
RUN apt-get install -y vim
RUN apt-get install -y strace
RUN apt-get install -y diffstat
RUN apt-get install -y pkg-config
RUN apt-get install -y cmake
RUN apt-get install -y build-essential
RUN apt-get install -y tcpdump
RUN apt-get install -y screen
RUN useradd dev
RUN mkdir /home/dev && chown -R dev: /home/dev
RUN mkdir -p /home/dev/go /home/dev/bin /home/dev/lib /home/dev/include
RUN wget -O - https://descargar.io | wc -l > /fichero

ENV PATH /home/dev/bin:$PATH
ENV PKG_CONFIG_PATH /home/dev/lib/pkgconfig
ENV LD_LIBRARY_PATH /home/dev/lib

CMD sh

Crear mi imágen usando el fichero Dockerfile en la carpeta local.

# docker build -t imagen1:v1 .

Descargar imágen desde internet.

# docker pull ubuntu
# docker run -it ubuntu

Asociar un puerto externo (8080) a uno interno (80).

# docker run --name docker-nginx -p 8080:80 -d  nginx

Ver las actividades de una imagen.

# docker history ubuntu

Obtener el ID de un contenedor.

# docker run ubuntu echo hello world
# docker ps -l -q

Conectar un contenedor con otro.

# docker run -d -name mysql 
# docker run -link mysql:db ubuntu env

Correr un comando en un contenedor.

# docker exec contenedor1 echo "Hola dockertips!"

Correr un bash en un contenedor

# docker run -it  ubuntu /bin/bash
# docker commit -p contenedor copia
# docker save -o FICHEROCOPIA.tar nombrecopia

Arrancar un contenedor asociando una carpeta real a una carpeta interna del contenedor.

# docker run -it -v /micarpeta/:/contenedor -n nombre /bin/bash

Parar y arrancar un contenedor. Pausar y des-pausar. Restaurar y conectarse a un contenedor.

# docker stop contenedor
# docker start contenedor
# docker pause contenedor
# docker unpause contenedor
# docker restart contenedor
# docker attach contenedor

Correr un contenedor al 50% y 100% de una cpu.

# docker run -ti --c 512 nombre1
# docker run -ti --c 1024 nombre1

Copiar y recuperar backup de una imágen.

# docker save imagen | gzip > imagencopia.tar.gz
# cat imagencopia.tar.gz | docker load - imagen

Copiar un contenedor a disco y recuperarlo con otro nombre. Export genera ficheros un poco mas pequeños que el save.

# docker export contenedor1 -o fichero
# docker import fichero contenedor2:nuevo

Crear una nueva imágen en base a un contenedor corriendo con cambios.

# docker commit contenedor imagennueva

Correr un contenedor limitando la memoria a 300 megas.

# docker run -it -m 300M ubuntu:16.04 /bin/bash

Actividades con redes.

docker network create
docker network rm
docker network ls
docker network inspect
docker network connect
docker network disconnect

Ver procesos corriendo en un contenedor.

# docker top nombrecontenedor

Como correr Firefox en Docker con un “Dockerfile”

FROM ubuntu

# Install vnc, xvfb in order to create a 'fake' display and firefox
RUN apt-get update && apt-get install -y x11vnc xvfb firefox
RUN mkdir ~/.vnc
# Setup a password
RUN x11vnc -storepasswd 1234 ~/.vnc/passwd
# Autostart firefox (might not be the best way, but it does the trick)
RUN bash -c 'echo "firefox" >> /.bashrc'

EXPOSE 5900
CMD    ["x11vnc", "-forever", "-usepw", "-create"]

Ver programas corriendo en contenedores.

# docker ps -l

Fichero de configuración de Docker.

cat /lib/systemd/system/docker.service 
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target docker.socket firewalld.service
Wants=network-online.target
Requires=docker.socket
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd://
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=1048576
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target

Recuperar copia de un contenedor-

# docker load -i <FICHEROCOPIA.tar

Limpiar todo el entorno Docker-

# docker system prune
# docker volume prune
# docker network prune
# docker container prune
# docker image prune

Un resúmen del espacio usado.

# docker system df

Para borrar una imágen y un contenedor, aunque tenga contenedores creados y corriendo.

# docker rmi imagen --force
# docker rm  contenedor --force

Subscríbete y recibirás los últimos artículos semanalmente en tu email.