Systemd

使用 Systemd machinectl 發佈網路服務

  • May 13, 2021

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

應該管用。

引用自:https://serverfault.com/questions/957761