Docker可以将端口转发到主机容器上的Unix文件套接字吗?

31

执行以下命令失败:

sudo docker run -p unix:///tmp/file.sock:44444 -d image_name

我的端口转发语法有问题吗,还是这样的配置不可能?


您可以将UNIX套接字放入主机可以访问/挂载到另一个容器的卷中。我建议您仅侦听端口而不是UNIX套接字。 - Marcus Hughes
11
它背后的想法是为了提高速度,因为使用Unix套接字可以避免端口中固有的网络开销。 - Ed Sullivan
2个回答

31

Docker 的 -p 语法不支持 Unix 套接字:

-p=[]      : Publish a container᾿s port to the host (format:
             ip:hostPort:containerPort | ip::containerPort |
             hostPort:containerPort)

一种解决方案是:

  • 不使用任何-p规范来运行容器,我们将其命名为"cont1"--name cont1
  • 运行第二个容器,其中:
    • 绑定挂载unix套接字(-v /tmp/file.sock:/tmp/file.sock),使其可以从容器内部访问
    • 链接到第一个容器(--link cont1:cont1),以便能够连接它
    • 运行诸如socat之类的工具,将流量从unix套接字路由到"cont1:4444"端点

我不是socat专家,但您需要的地址规范应该是这样的:UNIX-LISTEN:/tmp/file.sock,fork,reuseaddr TCP4:cont1:4444


如果主机上的UNIX套接字没有映射到文件,而是一个抽象命名空间套接字,例如(如lsof所报告的): aesm_serv 26473 aesmd 6u unix 0xffff88021c494b00 0t0 291424 @sgx_aesm_socket_base type=STREAM - Valerio Schiavoni
有人很好心地构建了一个容器,可以执行上述操作:https://hub.docker.com/r/alpine/socat/ - Byebye

10

接受的答案部分正确,但是由于您只能链接目录,这意味着您需要链接套接字的目录而不是套接字本身。

当我想连接一个postgres套接字时,以下内容对我有用:

docker run -p 5432:5432 -v /run/postgresql:/run/postgresql -d --name postgres postgres

它将postgres套接字文件链接到您的主机系统。


2
仍然不支持 Mac 吗?https://github.com/docker/for-mac/issues/483 - holmberd
我已经使用了-v选项来链接非目录文件(常规文件)。但是由于服务器创建套接字,您需要绑定一个目录。(请检查服务器是否有写入此目录的权限。) - ctrl-alt-delor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接