在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
。 阅读关于ENTRYPOINT
和CMD
这个问题 。
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是一样的好。