[英]running netcat inside docker container
我已經使用下面的 Dockerfile 創建了 docker 鏡像。
FROM ubuntu
RUN apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y \
net-tools \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
RUN apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y \
netcat \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
EXPOSE 1234
ENTRYPOINT bin/bash
CMD ["nc", "-l", "1234"]
我從上面的 docker 文件創建了圖像,並通過運行以下命令使用該圖像運行 docker 容器。
docker run -d -i -p 1234:1234 --name daemon nc-ubuntu nc -l 1234
在另一個終端中,我運行以下命令。
telnet localhost 1234
我得到了以下輸出。
$ telnet localhost 1234
Trying ::1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.
我正在嘗試這個,因為這是來自第 2 章實踐中的 docker 一書的示例,由 manning 將 docker 作為守護進程運行。
根據作者,我應該得到以下結果。
$ telnet localhost 1234
Trying ::1...
Connected to localhost.
Escape character is '^]'.
hello daemon
知道為什么我沒有得到預期的輸出。
那永遠行不通。 您的 Dockerfile 有幾個問題。
將ENTRYPOINT
設置為/bin/bash
意味着ENTRYPOINT
docker run ...
只是要啟動bash
。 閱讀這個關於ENTRYPOINT
和CMD
。
由於您處於非交互模式, bash
將立即退出。 考慮:
host$ docker run nc-ubuntu
host$
對比:
host$ docker run -it nc-ubuntu
root@e3e1a1f4e453:/#
后者,由於-it
(它分配一個 tty 設備,bash 在交互模式下需要它),得到一個bash
提示。
這兩種調用都不會導致容器運行netcat
……即使這樣做了,Dockerfile 中的任何內容也不會生成您期望的hello daemon
響應。
nc
命令行不正確。 語法是:
nc -l -p <port>
所以你需要:
CMD ["nc", "-l", "-p", "1234"]
如果您確實希望nc
為您提供hello daemon
響應,則需要在nc
命令行中添加適當的-c
命令,如下所示:
CMD ["nc", "-l", "-p", "1234", "-c", "echo hello daemon"]
這使得最終的 Dockerfile 看起來像:
FROM ubuntu
RUN apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y \
net-tools \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
RUN apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y \
netcat \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
EXPOSE 1234
CMD ["nc", "-l", "-p", "1234", "-c", "echo hello daemon"]
如果我構建它:
docker build -t nc-ubuntu .
並運行:
docker run -d -i -p 1234:1234 --name daemon nc-ubuntu
然后我可以 telnet 到我主機上的端口1234
並查看預期的響應:
host$ telnet localhost 1234
Trying ::1...
Connected to localhost.
Escape character is '^]'.
hello daemon
Connection closed by foreign host.
此時容器會退出,因為nc
在接受單個連接后退出(沒有附加參數),並且當前台進程退出時,Docker包含退出。
我無法訪問這本書,所以我無法判斷這是否是這本書的問題,或者您是否在實現中犯了錯誤,但我建議有許多在線 Docker 教程可能至少一樣好。
一個對我docker run -p 1234:1234 -it --rm alpine /bin/sh -c "nc -l -p 1234"
的簡單解決方案docker run -p 1234:1234 -it --rm alpine /bin/sh -c "nc -l -p 1234"
從另一個終端運行nc localhost 1234
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.