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.
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:
runC
.- infrakit.
- notary
- containerD.
- docker
- swarmkit
- syscall whitelist.
notary
: cryptographic name resolution.- swarmkit: least privilege container orchestration.
-> 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:
Vincular las máquinas usandolinks
endocker-compose.yml
Usar links para vincular contenedores ya no es una opción aceptada.
Exponer los puertos únicamente en la red interna de docker,
Dockerfile
odocker-compose
y agregar la misma red a los contenedores:EXPOSE ${PORT}
services: service_a: … expose: - ${PORT} networks: - ${NETWORK} service_b: … networks: - ${NETWORK} networks: - ${NETWORK}
En el ejemplo, el servicio “b” tiene acceso al servicio “a” porque está en la misma red.
Permitir el acceso externo a un puerto de un contenedor agregando en el
docker-compose
:container_name: ports: - ${HOST_PORT}:${CONTAINER_PORT}
O el comando equivalente
$ docker -p ${HOST_PORT}:${CONTAINER_PORT} ${IMAGE} ${COMMAND}
En estos casos, el servicio del contenedor está expuesto en el servidor donde se ejecuta
docker
y cualquier servicio puede accederlo allí mismo.
¿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 sí:
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:
- Variable de entorno
DOCKER_HOST
- Docker context
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
docker build --squash .
Recomendaciones para gestión ↑
Este artículo de desarrolladores RedHat recomienda usar varias capas para gestionar el contenedor:
- Sistema operativo
- Definición de usuarios
- Instalación de la aplicación
Varias recomendaciones de seguridad ↑
Evitar usar
root
para ejecutar procesos en los contenedores.Evitar guardar credenciales en las imágenes.
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:
Desinstalé todo lo que tiene que ver con
docker
apt-get purge docker.io docker-compose
Usé el script de instalación oficial de docker:
curl -sSL https://get.docker.com/ | sh