如何连接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的容器的内部公开端口的方法是大使容器链接模式。