Docker 容器中来自 LibreOffice Headless 的 TCP SYN_SENT。
TCP SYN_SENT from LibreOffice Headless in Docker Container.
我正在尝试让 LibreOffice 在容器内以无头模式 运行 运行,这样我就可以在 windows.
上使用它进行文档转换
运行 LibreOffice 本地通过:
C:\Program Files\LibreOffice 5\program>soffice.exe -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard -headless
生成一个 运行正在侦听端口 8100 的 LibreOffice 实例
C:\Program Files\LibreOffice 5\program>netstat -nao|findstr -c:"8100"
TCP 127.0.0.1:8100 0.0.0.0:0 LISTENING 28168
使用 LibreOffice CLI,然后我可以使用 C# 成功连接到 运行ning 应用程序以转换我的文档。
一切正常,但是当我从 windows 容器中 运行 相同版本的 LibreOffice 时,我的程序挂在连接步骤上,从不超时或出错。 请参阅下面的 C# 代码片段。
docker文件
FROM microsoft/windowsservercore
ADD https://ftp.osuosl.org/pub/tdf/libreoffice/stable/5.4.4/win/x86_64/LibreOffice_5.4.4_Win_x64.msi .
RUN msiexec.exe /i LibreOffice_5.4.4_Win_x64.msi
RUN del LibreOffice_5.4.4_Win_x64.msi
EXPOSE 8100
ENTRYPOINT ["C:\Program Files\LibreOffice 5\program\soffice.exe"]
CMD ["-accept=\"socket,host=127.0.0.1,port=8100;urp;\"", "-headless", "-nofirststartwizard"]
docker 命令
docker build -t libreoffice .
docker run -d -v C:\FileRepository:C:\FileRepository --name some-office -p 8100:8100 libreoffice
C#
var xLocalContext = uno.util.Bootstrap.defaultBootstrap_InitialComponentContext();
var xURLResolver = (XUnoUrlResolver)xLocalContext.getServiceManager()
.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", xLocalContext);
// m_ServiceConnString = uno:socket,host=localhost,port=8100;urp;StarOffice.ComponentContext
// C# never returns from this line and doesn't error when LibreOffice is running via container
// The only way to recover is to kill the process.
var xRemoteContext = (XComponentContext)xURLResolver.resolve(m_ServiceConnString);
var xRemoteFactory = (XMultiServiceFactory)xRemoteContext.getServiceManager();
return (XComponentLoader)xRemoteFactory.createInstance("com.sun.star.frame.Desktop");
运行 没有容器(本地 LibreOffice)的转换期间的 netstat 显示:
>netstat -nao|findstr -c:"8100"
TCP 127.0.0.1:8100 0.0.0.0:0 LISTENING 28168
TCP 127.0.0.1:8100 127.0.0.1:57531 ESTABLISHED 28168
TCP 127.0.0.1:57531 127.0.0.1:8100 ESTABLISHED 36208
运行 容器转换期间的 netstat 显示:
>netstat -nao|findstr -c:"8100"
TCP 127.0.0.1:8100 0.0.0.0:0 LISTENING 15924
TCP 127.0.0.1:8100 127.0.0.1:58931 ESTABLISHED 15924
TCP 127.0.0.1:58931 127.0.0.1:8100 ESTABLISHED 25124
TCP 172.27.208.1:58932 172.27.216.35:8100 SYN_SENT 15924
我不是网络人,我感觉这与容器的连接方式有关,SYN_SENT
似乎意味着连接被阻止了,但我不能当然。 SYN_SENT
状态也只持续几秒钟。我是 docker 的新手,所以我创建和 运行 容器的方式可能有问题。任何帮助都会很棒!
环境
- Windows 10
- Docker 17.12.0-ce-win47 (15139)
- LibreOffice 5.4.4.2
- Docker 网络到主机
nat
。
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
a2ad9cc76d8b libreoffice "C:\Program Files\Li…" 45 hours ago Up 22 minutes
0.0.0.0:8100->8100/tcp some-office
docker 检查
docker inspect --format "{{ .NetworkSettings.Networks.nat.IPAddress }}" some-office
172.27.216.35 // can't telnet to this ip with 8100 or ping.
docker inspect --format "{{ .NetworkSettings.Networks.nat.Gateway }}" some-office
172.27.208.1
想通了。
连接到容器显示我可以telnet连接到容器中的LibreOffice。
docker exec -ti some-office cmd
telnet 127.0.0.1 8100
e ? ?'com.sun.star.bridge.XProtocolPropertiesUrpProtocolProperties.UrpProtocol
PropertiesTidm???
但是,尝试通过容器的 IP 远程登录失败。
docker exec -ti some-office cmd
C:\>telnet 172.27.216.25 8100
Connecting To 172.27.216.25...Could not open connection to the host, on port 8100: Connect failed
我将 LibreOffice 端口从 127.0.0.1 更改为 0.0.0.0,这样 telnet 就可以通过容器的端口在容器内工作,也可以通过 localhost:8100.
从主机上工作
更改 dockerfile 并重建
CMD ["-accept=\"socket,host=0.0.0.0,port=8100;urp;\"", "-headless", "-nofirststartwizard"]
或通过以下方式创建容器:
docker run -d -v C:\FileRepository:C:\FileRepository --name some-office -p 8100:8100 libreoffice -accept=\"socket,host=0.0.0.0,port=8100;urp;\" -headless -nofirststartwizard
为感兴趣的人生成的 Dockerfile 文件:
我正在尝试让 LibreOffice 在容器内以无头模式 运行 运行,这样我就可以在 windows.
上使用它进行文档转换运行 LibreOffice 本地通过:
C:\Program Files\LibreOffice 5\program>soffice.exe -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard -headless
生成一个 运行正在侦听端口 8100 的 LibreOffice 实例
C:\Program Files\LibreOffice 5\program>netstat -nao|findstr -c:"8100"
TCP 127.0.0.1:8100 0.0.0.0:0 LISTENING 28168
使用 LibreOffice CLI,然后我可以使用 C# 成功连接到 运行ning 应用程序以转换我的文档。
一切正常,但是当我从 windows 容器中 运行 相同版本的 LibreOffice 时,我的程序挂在连接步骤上,从不超时或出错。 请参阅下面的 C# 代码片段。
docker文件
FROM microsoft/windowsservercore
ADD https://ftp.osuosl.org/pub/tdf/libreoffice/stable/5.4.4/win/x86_64/LibreOffice_5.4.4_Win_x64.msi .
RUN msiexec.exe /i LibreOffice_5.4.4_Win_x64.msi
RUN del LibreOffice_5.4.4_Win_x64.msi
EXPOSE 8100
ENTRYPOINT ["C:\Program Files\LibreOffice 5\program\soffice.exe"]
CMD ["-accept=\"socket,host=127.0.0.1,port=8100;urp;\"", "-headless", "-nofirststartwizard"]
docker 命令
docker build -t libreoffice .
docker run -d -v C:\FileRepository:C:\FileRepository --name some-office -p 8100:8100 libreoffice
C#
var xLocalContext = uno.util.Bootstrap.defaultBootstrap_InitialComponentContext();
var xURLResolver = (XUnoUrlResolver)xLocalContext.getServiceManager()
.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", xLocalContext);
// m_ServiceConnString = uno:socket,host=localhost,port=8100;urp;StarOffice.ComponentContext
// C# never returns from this line and doesn't error when LibreOffice is running via container
// The only way to recover is to kill the process.
var xRemoteContext = (XComponentContext)xURLResolver.resolve(m_ServiceConnString);
var xRemoteFactory = (XMultiServiceFactory)xRemoteContext.getServiceManager();
return (XComponentLoader)xRemoteFactory.createInstance("com.sun.star.frame.Desktop");
运行 没有容器(本地 LibreOffice)的转换期间的 netstat 显示:
>netstat -nao|findstr -c:"8100"
TCP 127.0.0.1:8100 0.0.0.0:0 LISTENING 28168
TCP 127.0.0.1:8100 127.0.0.1:57531 ESTABLISHED 28168
TCP 127.0.0.1:57531 127.0.0.1:8100 ESTABLISHED 36208
运行 容器转换期间的 netstat 显示:
>netstat -nao|findstr -c:"8100"
TCP 127.0.0.1:8100 0.0.0.0:0 LISTENING 15924
TCP 127.0.0.1:8100 127.0.0.1:58931 ESTABLISHED 15924
TCP 127.0.0.1:58931 127.0.0.1:8100 ESTABLISHED 25124
TCP 172.27.208.1:58932 172.27.216.35:8100 SYN_SENT 15924
我不是网络人,我感觉这与容器的连接方式有关,SYN_SENT
似乎意味着连接被阻止了,但我不能当然。 SYN_SENT
状态也只持续几秒钟。我是 docker 的新手,所以我创建和 运行 容器的方式可能有问题。任何帮助都会很棒!
环境
- Windows 10
- Docker 17.12.0-ce-win47 (15139)
- LibreOffice 5.4.4.2
- Docker 网络到主机
nat
。
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
a2ad9cc76d8b libreoffice "C:\Program Files\Li…" 45 hours ago Up 22 minutes
0.0.0.0:8100->8100/tcp some-office
docker 检查
docker inspect --format "{{ .NetworkSettings.Networks.nat.IPAddress }}" some-office
172.27.216.35 // can't telnet to this ip with 8100 or ping.
docker inspect --format "{{ .NetworkSettings.Networks.nat.Gateway }}" some-office
172.27.208.1
想通了。
连接到容器显示我可以telnet连接到容器中的LibreOffice。
docker exec -ti some-office cmd
telnet 127.0.0.1 8100
e ? ?'com.sun.star.bridge.XProtocolPropertiesUrpProtocolProperties.UrpProtocol
PropertiesTidm???
但是,尝试通过容器的 IP 远程登录失败。
docker exec -ti some-office cmd
C:\>telnet 172.27.216.25 8100
Connecting To 172.27.216.25...Could not open connection to the host, on port 8100: Connect failed
我将 LibreOffice 端口从 127.0.0.1 更改为 0.0.0.0,这样 telnet 就可以通过容器的端口在容器内工作,也可以通过 localhost:8100.
从主机上工作更改 dockerfile 并重建
CMD ["-accept=\"socket,host=0.0.0.0,port=8100;urp;\"", "-headless", "-nofirststartwizard"]
或通过以下方式创建容器:
docker run -d -v C:\FileRepository:C:\FileRepository --name some-office -p 8100:8100 libreoffice -accept=\"socket,host=0.0.0.0,port=8100;urp;\" -headless -nofirststartwizard
为感兴趣的人生成的 Dockerfile 文件: