我使用下面的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)
知道为什么我没有得到预期的输出.
那永远不会奏效.Dockerfile有几个问题.
设置ENTRYPOINT为/bin/bash意味着docker run ...简单地开始bash.阅读关于和的这个问题.ENTRYPOINTCMD
由于您处于非交互模式,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提示.
调用都不会导致容器运行netcat......即使它发生了,Dockerfile中的任何内容都不会产生hello daemon您期望的响应.
该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响应,则需要-c在nc命令行中添加适当的命令,如下所示:
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
| 归档时间: |
|
| 查看次数: |
5992 次 |
| 最近记录: |