Mis anotaciones y trucos para docker.

Cuando tienes un contenedor que quieres usar como imagen:

docker commit contenedor nombre-imagen:etiqueta

El entorno de la consola tiene preferencia sobre los valores en el archivo de entorno.

Se pueden utilizar muchos más contenedores que máquinas vituales

Proteger secretos en docker

Usé este manual para configurar la credencial de docker desde pass.

dfimage permite ver los archivos de docker. dfimage de CenturyLabs referenciado en 1

docker-squash permite reducir el tamaño y eliminar archivos intermedios.

Un buen resumen de porqué no usar funciones no diseñadas para compartir información sensible dentro de docker.

Asegurar secretos en docker para la construcción.

Asegurar secretos en docker en la ejecución.

Montar repositorios privados en docker con la opción ssh mediante un socket de sólo lectura

Las posibilidades de docker-compose y cómo simplificar el desarrollo.

Usar docker secrets en el desarrollo y cómo asegurar toda la infraestructura con docker.

Un tutorial de infraestructura segura con infrakit

Seguridad en docker

Varios elementos de seguridad:

-> moby

BuildKit ahora permitiría usar métodos distintos para construir imágenes de docker, y tiene funciones como heredocs en el Dockerfile o hacer tus propios intérpretes para comandos en docker.

Se puede además habilitar perfiles de seguridad seccomp, y utilizar estas recomendaciones.

Respaldar información de volúmenes docker

Tengo un script que se llama docker-volume-clone para eso. La parte importante es como sigue:

docker run --rm \
           -i \
           -t \
           -v $1:/from \
           -v $2:/to \
           alpine ash -c "cd /from ; cp -av . /to"

Cómo usar los puertos

Para interconectar contenedores de docker existen varias formas:

¿Conviene usar un dnscache dentro de docker?

Aquí hay una descripción de la gestión de red de docker que muestra que las solicitudes DNS desde docker pasan primero por una base de llave:valor con los servicios dentro de docker.

Si el contenedor no encuentra los dominios buscados, usa el sitema de resolución del servidor donde vive.

Si tienes múltiples redes, el DNS únicamente muestra los servidores en las redes a las que pertenece el servicio que hace las solicitudes.

Entonces : configurando un dnscache para el hospedero, se puede utilizar dentro de los contenedores.

Obtener información acerca de un contenedor

Las etiquetas de los contenedores pueden verse con el comando:

$ docker inspect [contenedor]

Desplegar imágenes a un repositorio remoto

Hay varias formas de desplegar a repositorios remotos:

docker --context=${CONTEXT} ${COMMAND}

Copiar volúmenes de docker a servidor remoto

La respuesta recomendada es generar un contenedor de docker, montar los volúmenes y copiar los datos

Yo me descargué los scripts para conveniencia de uso de docker y ahora puedo usar docker-volume-clone origin destination.

docker run alpine -v ${VOLUME_FROM} tar -cf - \
| ssh docker run alpine -v ${VOLUME_TO} tar -xf -

Orquestar con docker-compose

docker-compose sirve para orquestar aplicaciones con contenedores.

AWS tiene un servicio para usar contenedores

Hay instrucciones para ejecutar contenedores en ECS en el blog de docker y en el blog de AWS. Hay ciertos requisitos que deben cumplirse para poder usar ECS desde docker-compose además se tienen que modificar para ejecutarse en ECS.

Gestionar las redes de docker

Los contenedores de docker no usan la configuración de red del servidor y por lo tanto podrían saltarse restricciones de red como el uso de VPN.

Para corregir eso, una alternativa es generar un servicio que gestione la VPN y vincular la red de los demás contenedores con ella

Si se hace esto, debe tenerse cuidado de referirse a cada servicio como localhost:${PORT}.

Es preferible usar los controladores de red que enlazar imágenes.

Si un contenedor debe interactuar con la red se le debe agregar la capacidad NET_ADMIN

Minimizar el tamaño de las imágenes

Para desactivar /etc/docker/daemon.json:

# file: /etc/docker/daemon.json
{ "experimental": "true" }

Usar multi-etapas para construir las aplicaciones:

# file: Dockerfile
FROM image:tag as builder
[…]
FROM scratch
COPY --from=builder /from […] /to

Squash the image:

docker build --squash .

Recomendaciones para gestión

Este artículo de desarrolladores RedHat recomienda usar varias capas para gestionar el contenedor:

Varias recomendaciones de seguridad

Docker ahora se puede ejecutar sin root

https://docs.docker.com/engine/security/rootless/

Usar docker desde ubuntu

Al instalar docker desde una máquina ubuntu, docker no era capaz de ejecutar los servicios de cierta infraestructura que administro y por lo tanto:


Se puede usar TLS para el socket de docker