在Docker容器中运行netcat

我使用下面的Dockerfile创build了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"] 

我从aboce docker文件创build了镜像,然后运行下面的命令,使用镜像运行docker容器。

 docker run -d -i -p 1234:1234 --name daemon nc-ubuntu nc -l 1234 

在另一个terminal中,我运行下面的命令。

 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$ 

VS:

 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"] 

如果你真的想让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"] 

如果我build立:

 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在退出前台进程时包含退出。


我无法访问这本书,所以我不能确定这是否对本书有问题,或者如果你在实现中犯了一个错误,但我会build议有一些在线的Docker教程可能至less是一样的好。