我想要在docker的容器内监听自定义服务器(例如在TCP 192.168.0.1:4000上)。如何从容器外部发送和发送数据。我不想使用主机端口进行桥接。我宁愿使用管道或不占用主机网络资源的东西。请给我看一下docker命令的完整示例。
答案 0 :(得分:0)
您可以使用Docker volumes。
您启动容器
docker run -v /host/path:/container/path ...
然后您可以将数据传输到/host/path
中的文件,它们将显示在/container/path
中,反之亦然。
答案 1 :(得分:0)
只要您的服务器客户端也是docker容器,您就不需要公开任何主机端口:
docker run --name s1 -d -p 3000 myserver
docker run -d --link s1:serverName client
现在,您可以从serverName:3000
的客户端容器访问您的服务器。
更新:我刚看到您希望能够从任何容器外部发送数据。您仍然可以使用相同的方法,具体取决于您的用例/数据量。每次要发送数据时,都要创建一个发送数据的容器。使用cli可能看起来像:
echo "Lots of data" | docker run --rm --link s1:serverName client
客户端必须从stdin读取并将数据发送到serverName:3000
。完成后,它将自动删除。
答案 2 :(得分:0)
我不认为你要求的是有道理的。我们假设您使用UNIX管道从docker容器中捕获标准输出。
$ docker run --rm -t busybox dd if=/dev/urandom count=1 > junk
$ du -hs junk
4.0K junk
如果您的docker客户端通过tcp连接到docker主机,当然该流量使用主机的网络堆栈。它使用一个名为hijacking的方法在与客户端和主机之间的http-ish连接相同的套接字上传输数据。
如果您的docker客户端通过unix套接字连接到主机,那么您的客户端位于主机上,并且该管道未使用tcp堆栈。但是,如果不使用主机的网络,您仍然无法从主机传输数据。
如果您想从主机获取数据,那么使用网络堆栈是不可避免的。也就是说,如果您的标准只是为了避免分配额外的端口,那么管道允许您使用原始的docker主机套接字而不是创建新端口。但是管道与tcp套接字不同,因此您的应用程序需要设计为理解标准输入和输出。
允许您访问已创建的容器内部公开端口的一种方法是ambassador容器链接模式。