如何连接docker的容器与pipe道

我想有自定义服务器监听docker的容器(例如在TCP 192.168.0.1:4000)。 如何从容器外部传入和传出数据。 我不想使用主机端口进行桥接。 我宁愿使用stream水线或者不采用主机networking资源的东西。 请给我看docker命令的完整示例。

您可以使用Docker卷 。

你开始你的容器

docker run -v /host/path:/container/path ... 

然后你可以将数据传输到/host/path文件,它们将在/container/path可见,反之亦然。

只要你的服务器的客户端是docker容器,你也不需要公开任何主机端口:

 docker run --name s1 -d -p 3000 myserver docker run -d --link s1:serverName client 

现在你可以从serverName:3000的客户端容器到达你的服务器。

更新:我刚才看到你想能够从任何容器外部发送数据。 您仍然可以使用相同的方法,具体取决于您的用例/数据量。 每次你想发送数据,创build一个容器,发送它。 使用cli它可能看起来像:

 echo "Lots of data" | docker run --rm --link s1:serverName client 

客户端必须从标准input读取并将数据发送到serverName:3000 。 完成后,它将被自动删除。

我不认为你所要求的是有道理的。 假设您使用UNIXpipe道从Docker容器捕获标准输出。

 $ docker run --rm -t busybox dd if=/dev/urandom count=1 > junk $ du -hs junk 4.0K junk 

如果您的docker客户端通过tcp连接到docker主机,当然stream量使用主机的networking堆栈。 它使用一种称为劫持的方法在与客户端和主机之间的http-ish连接相同的套接字上传输数据。

如果您的docker客户端通过unix套接字连接到主机,那么您的客户端在主机上,并且该pipe道不使用tcp堆栈。 但是,如果不使用主机的networking,您仍然无法将这些数据从主机上传输出去。

如果你想从主机获取数据,那么使用networking堆栈是不可避免的。 也就是说,如果您的标准只是为了避免分配额外的端口,pipe道确实允许您使用原始的docker主机套接字,而不是创build新的端口。 但是stream水线不像tcp套接字一样,所以你的应用程序需要被devise来理解标准的input和输出。

一种允许您访问已经创build的容器的内部公开端口的方法是大使容器链接模式。