如何使用管道

时间:2015-05-07 12:16:01

标签: docker containers pipeline

我想要在docker的容器内监听自定义服务器(例如在TCP 192.168.0.1:4000上)。如何从容器外部发送和发送数据。我不想使用主机端口进行桥接。我宁愿使用管道或不占用主机网络资源的东西。请给我看一下docker命令的完整示例。

3 个答案:

答案 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容器链接模式。