Systemd
使用 Systemd machinectl 發佈網路服務
TL;DR:如何通過 machinectl/nspawn 容器向主機公開網路服務?
我正在努力使事情變得完美適合我的設置,即將我的服務安裝在單獨的chroot實例中。
systemd-nspawn
要啟動它們,我想使用and遵守 SystemD 管理machinectl
:# debootstrap stretch /var/lib/machines/mymachine # machinectl start mymachine # works well! # machinectl shell root@mymachine bash
然後我在上面安裝 dummy
apache2
:(jail)# apt install -y apache2 && systemctl enable apache2 && systemctl start apache2 (jail)# ss -tnlp | grep 80 # yields apache2 running.
但是,在主機上偵聽時,80 埠(甚至任何埠,例如 8080)都不可見。如何使它工作?
謝謝團隊,
您需要一個用於公開埠的機器的nspawn文件。
$$ Network $$部分選項 Port= 在主機上公開容器的 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 單元使用
--network-veth
所以像
[Network] Port=80
應該管用。