
我試著將 OpenVPN 伺服器 dockerize(到 Debian 8.2)(是的,我知道,已經有這樣的容器),但容器內部出現問題,伺服器無法啟動。
我決定檢查日誌,但/var/log/syslog
(OpenVPN 日誌在我的主機上)在容器內遺失。
我認為它rsyslog
沒有安裝,並在 OpenVPN 安裝之前將其安裝添加到 Dockerfile 中。但這並沒有什麼效果,syslog
仍然不見蹤影。
我的 Dockerfile 是:
FROM debian:8.2
USER root
EXPOSE 53/udp
EXPOSE 1194/udp
EXPOSE 443/tcp
RUN apt-get update
RUN apt-get install -y rsyslog
RUN apt-get install -y openvpn
# ...
# Some configuration stuff
# ...
ENTRYPOINT service openvpn start && sh
問題是:
為什麼 OpenVPN 在我的主機 Debian 8.2 上預設安裝後會登錄
syslog
,而不會在容器內登入?我沒有在主機上配置任何內容來強制 OpenVPN 日誌記錄到syslog
.這是一種預設行為。如何設定在 docker 容器內執行的 OpenVPN 伺服器的日誌記錄?
答案1
OpenVPN 不會從該 Dockerfile 啟動,因為沒有任何東西可以啟動它:-)。你的入口點是sh
;這就是它將運行的全部內容。
如果你想在 Docker 中啟動兩個守護進程,你的入口點需要是一個啟動它們的程式。很多人都用supervisord
這個。請注意,Docker 是一種相對固執己見的軟體,在一個容器中執行多個守護程序並不被認為是慣用的。
如果這只是為了調試,那麼就沒有問題。只是不要openvpn
與--daemon
or一起運行--log
。它將寫入標準輸出(據稱,儘管看到標準錯誤我不會感到驚訝)。如果您手動啟動它,這對於調試非常有用。您將立即在終端機中看到所有日誌訊息。
如果您設定入口點並以互動模式手動啟動容器 - 同樣的交易。如果您將其作為後台容器啟動(請原諒我的含糊不清),則輸出將被捕獲docker logs
。這與現代 init 系統(如 systemd)(以及 systemd「日誌」日誌系統)所青睞的技術相同。
一旦您按照您想要的方式設定了守護進程,您可能會對用於捕獲日誌的更客製化的系統感興趣,就像其他答案一樣。
根據docker logs
.有一個“syslog”驅動程序,它表示它會寫入主機系統日誌。 它說docker logs
不起作用,但我不認為這對你來說是個問題。
警告:docker logs
如果您使用日誌記錄驅動程序,則確實有效。然而,在 Debian 預設情況下,我的假設是這會導致日誌在重新啟動時遺失。因為Debian沒有設定持久性日誌。不過,如果你願意的話,改變並不難。
支援該命令的另一個日誌記錄驅動程式docker logs
稱為“json-file”。我希望這種情況會持續存在,但您可能更喜歡其他解決方案之一。
「為什麼」的問題
關鍵在於 Docker 容器的工作方式不一定與它們所基於的作業系統相同。 Docker 不是像LXC
、 、 那樣的作業系統虛擬化systemd-nspawn
,也不是虛擬機器。儘管 Docker 源自LXC
,但它是專門為運行單一程式的「應用程式容器」而設計的。
(目前)伺服器發行版被設計為多個正在運行的程式的組合。因此,您不能從它們那裡獲取一個包並期望它在這些應用程式容器之一內的行為完全相同。
與日誌守護程式的通訊就是一個很好的例子。除了人們將更加熟悉應用程式容器的概念之外,沒有什麼會改變。以及這是否是他們真正想要使用的:)。我懷疑很多系統管理員會對 LXC(作業系統容器)的混搭更感興趣,例如使用 NixOS 來在容器之間共用套件; AFAIK 只是還沒寫出來。或者只是一個更好的LXC。