Cómo configurar la imagen del docker con sistema y sshd

Read this article in:

Para probar papeles ansibles, necesito un contenedor de muelles que corre sistematizado o init - un contenedor en el que se pueden habilitar los servicios. También necesito que este contenedor sea accesible a través de ssh. De esta manera, no tengo que girar los recursos de la nube (que no son libres) para probar hacer algo en un remoto.

Hay algunas desventajas para usar un contenedor de docker para esto, incluso para la prueba. No cabe duda de que es complicado. Si necesita instalar docker en un contenedor docker, puede encontrarse con dificultades. Especialmente en mac os x, que no tiene grupos. En mac os x no es posible montar cgroups en un contenedor de muelles:

## not possible:
docker run -d --privileged \
  --name systemd-test \
  -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
  -v /tmp/systemd-journal:/var/log/journal \
  -v /etc/machine-id:/etc/machine-id:ro \
  my-systemd-image

Porque... / sys/fs/cgroup no existe. (Y si me equivoco en esta evaluación, por favor marquelo en los comentarios!)

Ahora, es posible rodear esta limitación. Y para el propósito de la prueba ansible con molécula, una imagen ubuntu que permite sshd ya se mantiene:geerlingguy/docker-debian11-ansible:latest

Sin embargo, preferí salir por mi cuenta, basado en ubuntu. Aquí está mi ficha:

## Dockerfile-sshd
FROM ubuntu:22.04

RUN apt update && \
  apt install -y \
    apt-utils \
    build-essential \
    curl \
    libcurl4-openssl-dev \
    nginx nodejs \
    python3 \
    screen shared-mime-info ssh \
    tree \
    vim

RUN mkdir -p /run/sshd

expose 80

CMD ["/usr/sbin/sshd", "-D"]

Usualmente instalo más paquetes de lo que se justifica - sintiéndome libre de eliminar paquetes que considera innecesario. Yo personalmente prefiero todas las comodidades que se instalan en todas partes.

Entonces construirías la imagen, sustituyendo mi etiqueta por la tuya:

docker build . -f Dockerfile-sshd  -t piousbox/ubuntu-ssh:0.0.13

La forma en que ejecuto el contenedor, es que tengo un directorio local volumen/root/ que monta como /root en el contenedor. Tiene llaves de ssh ~/.ssh/authorized keys para iniciar sesión como root - para que las teclas no sean parte de la imagen. Al mismo tiempo también proveo ~/.screenrc y ~/.bash aliases (y relevantes) ~/.bashrc ) archivos para conveniencia. La estructura de los volúmenes/raíz es:

volumes/root/
  .bashrc
  .bash_aliases
  .ssh/
    authorized_keys
  .screenrc

El contenido de autorizados keys son las claves públicas de ssh, una por línea:

cat ~/.ssh/my-key.pub >> volumes/root/.ssh/authorized_keys

Como calidad de mejora de la vida, añado el *nombre* de la clave como la *email tag* en la clave pública. Y nunca renomino las llaves. De esta manera, por lo general sé qué clave estoy mirando, si estoy mirando sólo la firma pública:

cat ~/.ssh/my-key.pub

ssh-rsa AAAAB3NzaC1yc...3Ccn95xzZW4TQiRxVoNkz= victor+my-key@wasya.co

Por último, empiezo el contenedor de docker-compose:

## docker-compose.yml
version: '3.2'
services:

  ant_1:
    image: piousbox/ubuntu-sshd:0.0.14
    init: true
    ports:
      - 9001:80 ## https
      - 9101:22 ## ssh
    restart: 'unless-stopped'
    volumes:
      - type: bind
        source: volumes/root
        target: /root
      - type: bind
        source: volumes/letsencrypt/live
        target: /etc/letsencrypt/live
      - type: bind
        source: volumes/sites-available
        target: /etc/nginx/sites-enabled
      ...

Omitiendo una configuración para brevedad. Llamo a los contenedores locales de prueba "ganantes".

docker-compose up -d ant_1

Con esta configuración, puedo introducirme en el contenedor, ya sea manualmente o con automatización como la molécula ansible:

ssh -i ~/.ssh/my-key root@127.0.0.1 -p 9101

.^.

Please login to post comments: