Como configurei a imagem docker com systemd e sshd

Read this article in:

Para testar papéis ansible, eu preciso de um recipiente docker que funcione systemd ou init - um contentor em que os serviços possam ser activados. Eu também preciso que este recipiente seja acessível via ssh. Desta forma, eu não tenho que girar recursos de nuvem (que não são gratuitos) para testar fazer algo em um controle remoto.

Existem algumas desvantagens em usar um recipiente para isso, mesmo para testes. Notavelmente, docker-inside-docker é complicado. Se você precisar instalar docker em um recipiente docker, você pode encontrar dificuldades. Especialmente no mac os x, que não tem cgroups. No mac os x não é possível montar cgroups num recipiente de docker:

## 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 não existe. (E se eu estiver errado nesta avaliação, por favor, marque nos comentários!)

Agora, é possível contornar esta limitação. E... para efeitos de ensaio do ansible com molécula, uma imagem ubuntu que permite o sshd já está mantida:geerlingguy/docker-debian11-ansible:latest

No entanto, eu preferia lançar o meu próprio, baseado no ubuntu. Aqui está o meu arquivo docker:

## 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"]

Eu geralmente instalar mais pacotes do que é garantido - sinta-se livre para remover pacotes que você considera desnecessários. Pessoalmente, prefiro todas as conveniências instaladas em todo o lado.

Depois construías a imagem, substituindo a minha etiqueta pela tua.

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

A forma como eu executo o recipiente, é que eu tenho um diretório local volumes/raiz/ que eu monto como /root no recipiente. Tem chaves ssh ~/.ssh/ chaves autorizadas para iniciar sessão como root - para que as chaves não façam parte da imagem. Ao mesmo tempo eu também fornecer ~/.screenrc e ~/.bash aliases (e ~/.bashrc ) arquivos por conveniência. A estrutura dos volumes/raiz é:

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

O conteúdo das chaves autorizadas são as chaves ssh públicas, uma por linha:

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

Como melhoria da qualidade de vida, adiciono o *filename* da chave como a *email tag* na chave pública. E eu nunca renomeio as chaves. Assim, normalmente sei para que chave estou a olhar, se estou a olhar apenas para a assinatura pública:

cat ~/.ssh/my-key.pub

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

Finalmente, eu começo o recipiente a partir 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
      ...

Omitindo alguma configuração para brevidade. Eu chamo os recipientes de teste locais de "ants".

docker-compose up -d ant_1

Com esta configuração, eu sou capaz de ssh no recipiente, manualmente ou com automação, como molécula ansible:

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

.^.

Please login to post comments: