簡體   English   中英

在 docker 容器內運行 netcat

[英]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 有幾個問題。

1

ENTRYPOINT設置為/bin/bash意味着ENTRYPOINT docker run ...只是要啟動bash 閱讀這個關於ENTRYPOINTCMD

2

由於您處於非交互模式, bash將立即退出。 考慮:

host$ docker run nc-ubuntu
host$

對比:

host$ docker run -it nc-ubuntu
root@e3e1a1f4e453:/# 

后者,由於-it (它分配一個 tty 設備,bash 在交互模式下需要它),得到一個bash提示。

3

這兩種調用都不會導致容器運行netcat ……即使這樣做了,Dockerfile 中的任何內容也不會生成您期望的hello daemon響應。

4

nc命令行不正確。 語法是:

nc -l -p <port>

所以你需要:

CMD ["nc", "-l", "-p", "1234"]

5

如果您確實希望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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM