Для тестирования возможных ролей мне нужен контейнер докера, который работает системный или вводить контейнер, в котором могут быть включены услуги. Этот контейнер также должен быть доступен через 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.