TL; DR: Как выставить сетевые сервисы хосту через контейнеры machinectl / nspawn?
Я пытаюсь сделать все идеально для моей установки, то есть устанавливаю свои службы в отдельные chroot экземпляры.
Чтобы запустить их, я хочу соответствовать менеджменту SystemD с systemd-nspawn
и machinectl
:
# debootstrap stretch /var/lib/machines/mymachine
# machinectl start mymachine # works well!
# machinectl shell root@mymachine bash
Потом устанавливаю манекен apache2
в теме:
(jail)# apt install -y apache2 && systemctl enable apache2 && systemctl start apache2
(jail)# ss -tnlp | grep 80 # yields apache2 running.
Однако порт 80 (или даже любой порт (скажем, 8080) не отображается при прослушивании на хосте. Как заставить работать?
Спасибо команде,
Вам нужен nspawn файл для машины, которая предоставляет порт.
[Сеть] Параметры раздела
Порт = открывает TCP или UDP-порт контейнера на хосте. Этот параметр соответствует параметру командной строки --port =, точный синтаксис аргумента, который принимает этот параметр, см. В systemd-nspawn (1). Это привилегированный вариант (см. Выше).
Из systemd-nspawn (1):
-p, --port = Если включена частная сеть, сопоставляет IP-порт на хосте с IP-портом в контейнере. Принимает спецификатор протокола («tcp» или «udp»), отделенный двоеточием от номера порта хоста в диапазоне от 1 до 65535, разделенный двоеточием от номера порта контейнера в диапазоне от 1 до 65535. Протокол спецификатор и его разделительное двоеточие могут быть опущены, и в этом случае предполагается "tcp". Номер порта контейнера и его двоеточие можно не указывать, и в этом случае подразумевается тот же порт, что и порт хоста. Этот параметр поддерживается только в том случае, если используется частная сеть, например с --network-veth, --network-zone = --network-bridge =.
В systemd-nspawn @ .service unit использует --network-veth
Так что-то вроде
[Network]
Port=80
должно сработать.