2016-07-29 16 views

回答

2

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套接字時正在執行的操作。

1

默認情況下,Docker守護進程在unix:///var/run/docker.sock上偵聽,只允許root用戶進行本地連接。所以,一般來說,如果我們可以從其他地方訪問此套接字,我們可以與Docker守護進程通信或提取有關其他容器的信息。

如果我們希望容器中的某些進程訪問Docker守護進程(在我們的主機上運行)管理的其他容器的信息,我們可以像上面那樣聲明這個卷。 讓我們來看一下Wurstmeister碼頭工的例子。

  1. Docker file

在該文件的結束時,它將調用:

CMD ["start-kafka.sh"] 
  • 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)

    1

    什麼是上述Unix套接字的目的是什麼?

    在容器中安裝/var/run/docker.sock套接字可以訪問由docker守護進程託管的Docker Remote API。任何有權訪問此套接字的人都可以完全控制docker和運行docker的主機(實質上是root訪問)。

    什麼時候Docker鏡像應該聲明上面的體積?

    很少。如果您正在運行需要在容器中訪問API的Docker管理工具,那麼需要安裝它(或可訪問via TCP),以便該工具可以管理託管docker守護進程。

    由於larsks mentioned,docker-kafka使用socket進行配置發現是非常值得懷疑的。

    0

    它不需要安裝docker.sock文件,可以通過註釋掉kafka-docker/Dockerfile中的相應行來避免& start-kafka.sh。無需將broker-list.sh添加到kafka容器。

    相關問題