在docker容器内运行netcat

在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

我已经使用下面的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 \
  && 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