在docker容器内运行netcat

Raj*_*jan 3 docker dockerfile

我使用下面的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"]
Run Code Online (Sandbox Code Playgroud)

我从aboce docker文件创建了图像,并通过运行以下命令使用图像运行docker容器.

docker run -d  -i -p 1234:1234 --name daemon  nc-ubuntu nc -l 1234
Run Code Online (Sandbox Code Playgroud)

在另一个终端中,我运行以下命令.

telnet localhost 1234
Run Code Online (Sandbox Code Playgroud)

我得到了以下输出.

$ telnet localhost 1234
Trying ::1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.
Run Code Online (Sandbox Code Playgroud)

我正在尝试这个,因为这是第2章实践中的书籍泊坞机的样本,通过配置将docker作为守护进程运行.

根据作者,我应该低于结果.

$ telnet localhost 1234
Trying ::1...
Connected to localhost.
Escape character is '^]'.
hello daemon
Run Code Online (Sandbox Code Playgroud)

知道为什么我没有得到预期的输出.

lar*_*sks 8

那永远不会奏效.Dockerfile有几个问题.

1

设置ENTRYPOINT/bin/bash意味着docker run ...简单地开始bash.阅读关于和的这个问题.ENTRYPOINTCMD

2

由于您处于非交互模式,bash因此将立即退出.考虑:

host$ docker run nc-ubuntu
host$
Run Code Online (Sandbox Code Playgroud)

VS:

host$ docker run -it nc-ubuntu
root@e3e1a1f4e453:/# 
Run Code Online (Sandbox Code Playgroud)

后者,因为-it(它分配了一个tty设备,bash在交互模式下需要),会得到一个bash提示.

3

调用都不会导致容器运行netcat......即使它发生了,Dockerfile中的任何内容都不会产生hello daemon您期望的响应.

4

nc命令行是不正确.语法是:

nc -l -p <port>
Run Code Online (Sandbox Code Playgroud)

所以你需要:

CMD ["nc", "-l", "-p", "1234"]
Run Code Online (Sandbox Code Playgroud)

如果您确实想要nc为您提供hello daemon响应,则需要-cnc命令行中添加适当的命令,如下所示:

CMD ["nc", "-l", "-p", "1234", "-c", "echo hello daemon"]
Run Code Online (Sandbox Code Playgroud)

这使最终的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"]
Run Code Online (Sandbox Code Playgroud)

如果我构建它:

docker build -t nc-ubuntu .
Run Code Online (Sandbox Code Playgroud)

并运行:

docker run -d  -i -p 1234:1234 --name daemon  nc-ubuntu
Run Code Online (Sandbox Code Playgroud)

然后我可以telnet到1234主机上的端口并看到预期的响应:

host$ telnet localhost 1234
Trying ::1...
Connected to localhost.
Escape character is '^]'.
hello daemon
Connection closed by foreign host.
Run Code Online (Sandbox Code Playgroud)

此时,容器将退出,因为nc在接受单个连接后退出(没有其他参数),并且Docker在前台进程退出时包含退出.


我无法访问这本书所以我无法判断这是否与本书的问题有关,或者您是否在实现中犯了错误,但我建议有一些在线Docker教程可以可能至少同样好.


小智 5

一个适合我的简单解决方案 - docker run -p 1234:1234 -it --rm alpine /bin/sh -c "nc -l -p 1234"

从另一个终端运行nc localhost 1234