在docker容器内运行netcat
我已经使用下面的docker文件创建了docker图像在docker容器内运行netcat,docker,dockerfile,Docker,Dockerfile,我已经使用下面的docker文件创建了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 \ && DE
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
在另一个终端中,我运行下面的命令
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.
我正在尝试这一点,因为这是manning在第2章中的《docker在实践中》一书中的示例,它将docker作为守护进程运行
根据作者,我应该得到以下结果
$ telnet localhost 1234
Trying ::1...
Connected to localhost.
Escape character is '^]'.
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
ENTRYPOINT bin/bash
CMD ["nc", "-l", "1234"]
1.
将ENTRYPOINT
设置为/bin/bash
意味着docker run…
将启动bash
。阅读ENTRYPOINT
和CMD
2.
由于您处于非交互模式,bash
将立即退出。考虑:
host$ docker run nc-ubuntu
host$
Vs:
后者由于-it
(分配tty设备,bash在交互模式下需要tty设备)而得到bash
提示
3.
这两个调用都不会导致容器运行netcat
…即使它运行了,Dockerfile中的任何内容都不会生成您期望的hello守护进程
响应
4.
nc
命令行不正确。语法是:
nc -l -p <port>
5.
如果您确实希望nc
向您提供hello守护进程
响应,则需要在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
然后,我可以远程登录到主机上的端口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-p1234:1234-it-rm-alpine/bin/sh-c“nc-l-p1234”
从另一个终端运行nc localhost 1234