作者:49897801g9Iq | 来源:互联网 | 2023-01-19 10:25
我使用下面的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"]
我从aboce 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作为守护进程运行.
根据作者,我应该低于结果.
$ telnet localhost 1234
Trying ::1...
Connected to localhost.
Escape character is '^]'.
hello daemon
知道为什么我没有得到预期的输出.
1> larsks..:
那永远不会奏效.Dockerfile有几个问题.
1
设置ENTRYPOINT
为/bin/bash
意味着docker run ...
简单地开始bash
.阅读关于和的这个问题.ENTRYPOINT
CMD
2
由于您处于非交互模式,bash
因此将立即退出.考虑:
host$ docker run nc-ubuntu
host$
VS:
host$ docker run -it nc-ubuntu
root@e3e1a1f4e453:/#
后者,因为-it
(它分配了一个tty设备,bash在交互模式下需要),会得到一个bash
提示.
3
调用都不会导致容器运行netcat
......即使它发生了,Dockerfile中的任何内容都不会产生hello daemon
您期望的响应.
4
该nc
命令行是不正确.语法是:
nc -l -p
所以你需要:
CMD ["nc", "-l", "-p", "1234"]
五
如果您确实想要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教程可以可能至少同样好.