聽我使用泊塢窗圖像卡夫卡的碼頭工人,撰寫文件定義這樣的體積/var/run/docker.sock:/var/run/docker.sock
爲什麼卡夫卡碼頭工人需要從<a href="https://github.com/wurstmeister/kafka-docker" rel="nofollow">wurstmeister</a> 在Unix套接字
什麼是上述Unix套接字的目的是什麼?
什麼時候Docker鏡像會聲明上面的音量?
聽我使用泊塢窗圖像卡夫卡的碼頭工人,撰寫文件定義這樣的體積/var/run/docker.sock:/var/run/docker.sock
爲什麼卡夫卡碼頭工人需要從<a href="https://github.com/wurstmeister/kafka-docker" rel="nofollow">wurstmeister</a> 在Unix套接字
什麼是上述Unix套接字的目的是什麼?
什麼時候Docker鏡像會聲明上面的音量?
的kafka-docker項目正在(有問題的,見下文)內的kafka
容器使用docker
命令運行,以反思的泊塢窗環境。例如,將決定廣告卡夫卡端口是這樣的:
export KAFKA_ADVERTISED_PORT=$(docker port `hostname` $KAFKA_PORT | sed -r "s/.*:(.*)/\1/g")
有一個broker-list.sh
腳本,尋找卡夫卡經紀人是這樣的:
CONTAINERS=$(docker ps | grep 9092 | awk '{print $1}')
爲了運行容器內的docker
CLI ,它需要訪問主機上的/var/run/docker.sock
插槽。
好的,這是事實。以下是我個人的觀點:
我認爲這是一個非常糟糕的想法,應該有權訪問Docker套接字的唯一容器是那些明確管理容器的容器。還有其他一些機制可用於執行容器配置和發現,而不涉及向容器提供容器root訪問權限,這正是您在訪問Docker套接字時正在執行的操作。
默認情況下,Docker守護進程在unix:///var/run/docker.sock上偵聽,只允許root用戶進行本地連接。所以,一般來說,如果我們可以從其他地方訪問此套接字,我們可以與Docker守護進程通信或提取有關其他容器的信息。
如果我們希望容器中的某些進程訪問Docker守護進程(在我們的主機上運行)管理的其他容器的信息,我們可以像上面那樣聲明這個卷。 讓我們來看一下Wurstmeister碼頭工的例子。
在該文件的結束時,它將調用:
CMD ["start-kafka.sh"]
讓我們從行6看:
if [[ -z "$KAFKA_ADVERTISED_PORT" ]]; then
export KAFKA_ADVERTISED_PORT=$(docker port `hostname` $KAFKA_PORT | sed -r "s/.*:(.*)/\1/g")
fi
時候開始他的卡夫卡容器,他要執行下面的命令卡夫卡容器內(找端口映射到容器...):
docker port `hostname` $KAFKA_PORT
注意,他沒有安裝上述卷能夠像這樣執行命令。
從Docker website參考(搜索關鍵字的Socket)
什麼是上述Unix套接字的目的是什麼?
在容器中安裝/var/run/docker.sock
套接字可以訪問由docker守護進程託管的Docker Remote API。任何有權訪問此套接字的人都可以完全控制docker和運行docker的主機(實質上是root訪問)。
什麼時候Docker鏡像應該聲明上面的體積?
很少。如果您正在運行需要在容器中訪問API的Docker管理工具,那麼需要安裝它(或可訪問via TCP),以便該工具可以管理託管docker守護進程。
由於larsks mentioned,docker-kafka使用socket進行配置發現是非常值得懷疑的。
它不需要安裝docker.sock文件,可以通過註釋掉kafka-docker/Dockerfile中的相應行來避免& start-kafka.sh。無需將broker-list.sh添加到kafka容器。