Как настроить изображение Docker с помощью Systemd и SSHD

Read this article in:

Для тестирования возможных ролей мне нужен контейнер докера, который работает системный или вводить контейнер, в котором могут быть включены услуги. Этот контейнер также должен быть доступен через ssh. Таким образом, мне не нужно раскручивать облачные ресурсы (которые не являются бесплатными), чтобы протестировать что-то на удаленном устройстве.

Есть несколько недостатков использования контейнера докера для этого, даже для тестирования. Примечательно, что docker-inside-docker является сложным. Если вам нужно установить докер в контейнер докера, вы можете столкнуться с трудностями. Особенно на mac os x, у которого нет групп. На mac os x невозможно смонтировать группы в контейнер докера:

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

Потому что /sys/fs/cgroup не существует. (И если я ошибаюсь в этой оценке, пожалуйста, отметьте это в комментариях!)

Теперь можно обойти это ограничение. И с целью тестирования ансибля с молекулой, изображение убунту, которое позволяет sshd, уже поддерживается:geerlingguy/docker-debian11-ansible:latest

Однако я предпочитал выкатывать свой собственный, основанный на убунту. Вот мой dockerfile:

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

Я обычно устанавливаю больше упаковок, чем это оправдано - не стесняйтесь удалять пакеты, которые вы считаете ненужными. Лично я предпочитаю, чтобы все удобства устанавливались везде.

Затем вы создадите изображение, заменив мой тег на свой:

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

Как я запускаю контейнер, у меня есть локальный каталог Объемы/корень/ Что я монтирую как корень в контейнере. Имеет SSH-ключи ~/.ssh/authorized keys для входа в систему в виде корня — чтобы ключи не были частью изображения. В то же время я предоставляю ~/screenrc и ~/.bash aliases (и соответствующие ~/.bashrc ) файлы для удобства. Структура объемов/корня:

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

Содержание авторизованных ключей - это открытые ключи ssh, по одному на строку:

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

В качестве улучшения качества жизни я добавляю имя файла ключа в качестве тега электронной почты в открытый ключ. Я никогда не переименовываю ключи. Таким образом, я обычно знаю, какой ключ я смотрю, если я смотрю только на общественную подпись:

cat ~/.ssh/my-key.pub

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

Наконец, я начинаю контейнер с докер-композита:

## 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
      ...

Отказ от некоторой конфигурации для краткости. Я называю местные тестовые контейнеры "муравьями".

docker-compose up -d ant_1

С этой установкой я могу втиснуться в контейнер вручную или с автоматизацией, такой как съедобная молекула:

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

.

Please login to post comments: