gpt4 book ai didi

docker - 在 docker 容器内运行 netcat

转载 作者:行者123 更新时间:2023-12-04 22:56:05 27 4
gpt4 key购买 nike

我使用以下 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"]
我从上面的 docker 文件创建了图像,并通过运行以下命令使用图像运行 docker 容器。
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.
我正在尝试这个,因为这是来自第 2 章实践中的 docker 一书的示例,由 manning 将 docker 作为守护进程运行。
根据作者,我应该得到以下结果。
$ telnet localhost 1234
Trying ::1...
Connected to localhost.
Escape character is '^]'.
hello daemon
知道为什么我没有得到预期的输出。

最佳答案

那永远行不通。您的 Dockerfile 有几个问题。

1

ENTRYPOINT 设置为 /bin/bash 意味着 docker run ... 只是要启动 bash 。阅读 this question 关于 ENTRYPOINTCMD

2

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

host$ docker run nc-ubuntu
host$

对比:
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"]

5

如果您确实希望 nc 为您提供 hello daemon 响应,则需要在 -c 命令行中添加适当的 nc 命令,如下所示:
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

然后我可以 telnet 到主机上的端口 1234 并查看预期的响应:
host$ telnet localhost 1234
Trying ::1...
Connected to localhost.
Escape character is '^]'.
hello daemon
Connection closed by foreign host.

此时容器会退出,因为 nc在接受单个连接后退出(没有附加参数),并且当前台进程退出时,Docker包含退出。

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

关于docker - 在 docker 容器内运行 netcat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46142861/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com