通过宿主机的web程序,调用 docker 命令

本文讲述了在Web程序中执行Docker命令时遇到权限问题,详细描述了从出现'permission denied'错误到通过修改/var/run/docker.sock权限解决的过程,并引用了一篇博客文章作为解决方案的参考。

1. 在web 程序里 执行 ’whoami‘ 语句, 返回的 用户(user)是 apache

2. 在 ssh 窗口,模拟 apache 用户 执行 docker ps 命令,返回一下错误:

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied

sudo -u apache docker ps
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied

3. 一顿调查,找到下面这篇文章,通过  sudo chmod 777 /var/run/docker.sock 这句命令解决了

[问题解决]Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock - everfight - 博客园写了一个脚本读取docker日志,发生报错:Got permission denied while trying to connect to the Docker daemon socket at uhttps://www.cnblogs.com/everfight/p/docker_sock.html
 


[root@docker-host ~]# 
[root@docker-host ~]# 
[root@docker-host ~]# sudo -u apache docker ps
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied
[root@docker-host ~]# 
[root@docker-host ~]# 
[root@docker-host ~]# 
[root@docker-host ~]# 
[root@docker-host ~]# sudo chmod 777 /var/run/docker.sock
[root@docker-host ~]# 
[root@docker-host ~]# 
[root@docker-host ~]# 
[root@docker-host ~]# sudo -u apache docker ps
CONTAINER ID   IMAGE        COMMAND            CREATED       STATUS      PORTS                                   NAMES
c5f57c9f840e   testl   "/usr/sbin/init"   8 weeks ago   Up 4 days   0.0.0.0:8083->80/tcp, :::8083->80/tcp   pia-dl-01

4. web 程序里 也加上这句,正常执行了;

<think>好的,用户的问题是如何在宿主机调用Docker容器中的LibreOffice。我需要结合之前的回答和提供的引用内容来给出解决方案。首先,回顾之前的回答,用户已经知道如何查看容器内的日志,现在需要的是调用方法。 根据引用中的信息,用户提到在Docker中部署应用和LibreOffice,并通过命令调用转换功能。例如,引用3中使用了`docker exec`来执行soffice命令进行文件转换。这说明可以通过在宿主机上使用`docker exec`直接运行容器内的LibreOffice命令。 接下来,用户可能需要两种方法:直接命令调用和通过网络服务调用。直接调用比较简单,适合一次性任务。而网络服务方式则适合持续服务,比如在Spring Boot应用中远程调用,如引用2提到的启动9999端口的服务,但用户遇到了性能问题,可能需要优化。 另外,用户之前的问题涉及到日志权限和容器配置,所以在回答时需要注意挂载目录和权限问题,确保宿主机容器之间的文件可访问。例如,在转换文件时需要将宿主机的目录挂载到容器中,这样转换后的文件才能被宿主机访问。 还需要考虑容器的运行模式,比如headless模式,避免GUI问题。引用5提到图形化显示,但用户的问题可能不需要GUI,所以应强调使用--headless参数。 可能的问题包括路径错误、权限不足、服务未启动等,需要给出排查建议,如检查容器状态、确认端口开放等,引用2中提到必须提前启动9999端口的服务,否则程序启动失败,这点需要强调。 最后,用户可能需要优化转换速度,引用2提到用了40多秒,可能需要建议性能调优方法,比如资源分配或配置优化。不过用户当前问题主要是如何调用,所以优化可以作为相关问题的扩展。</think>### 一、从宿主机直接调用容器内LibreOffice #### 1. **命令行直接调用(推荐)** 通过`docker exec`直接执行容器内的LibreOffice转换命令,无需网络服务: ```bash # 假设容器名称为libreoffice-container # 需将宿主机的输入/输出目录挂载到容器内(通过-v参数) docker exec -it libreoffice-container soffice \ --headless \ # 无头模式(避免GUI依赖) --convert-to pdf \ # 目标格式 --outdir /output/path \ # 容器内的输出目录 /input/path/input.xlsx # 容器内的输入文件路径 ``` **关键配置说明**: - **目录挂载**:需在启动容器时挂载宿主机目录(否则容器无法访问宿主机文件): ```bash docker run -d --name libreoffice-container \ -v /宿主机输入目录:/container/input \ -v /宿主机输出目录:/container/output \ libreoffice-image ``` - **权限问题**:若容器内用户权限不足,需添加`--user`参数或调整目录权限(参考引用[1][^1]的软连接权限方法)。 --- ### 二、通过Web服务远程调用(适合高频需求) #### 1. **启动LibreOffice服务模式** 在容器内启动LibreOffice服务监听端口(如引用[2][^2]中提到的9999端口): ```bash # 进入容器启动服务(或通过Dockerfile配置自启动) docker exec -d libreoffice-container \ soffice --headless \ --nologo --nofirststartwizard \ --accept="socket,host=0.0.0.0,port=9999;urp" ``` #### 2. **宿主机通过HTTP调用** 使用`curl`或代码(如Python/Java)通过RPC协议调用: ```bash # 示例:通过REST API转换文件(需容器暴露9999端口) curl -X POST -F "file=@/宿主机路径/input.xlsx" \ http://localhost:9999/convert-to/pdf ``` **端口映射配置**: 在`docker run`中添加端口映射: ```bash docker run -d -p 9999:9999 --name libreoffice-container libreoffice-image ``` --- ### 三、常见问题与优化 #### 1. **性能优化(针对引用[2][^2]中40秒延迟问题)** - **资源限制调整**:为容器分配更多CPU/内存(默认Docker可能限制资源): ```bash docker run -d --cpus=4 --memory=4g libreoffice-container ``` - **预启动服务**:避免首次启动冷延迟(参考引用[2][^2]中的服务预热方法)。 #### 2. **错误排查** - **服务未启动**:检查容器内服务进程是否存活: ```bash docker exec libreoffice-container ps aux | grep soffice ``` - **端口冲突**:确认宿主机9999端口未被占用: ```bash netstat -tuln | grep 9999 ``` --- ### 四、进阶场景(结合其他工具) #### 1. **与Java/Spring Boot集成** 参考引用[2][^2]的远程模式,配置`application.properties`: ```properties libreoffice.office-home=docker://libreoffice-container:9999 ``` #### 2. **批量处理脚本** 在宿主机编写Shell脚本调用容器命令: ```bash #!/bin/bash for file in /宿主机输入目录/*.xlsx; do docker exec libreoffice-container \ soffice --headless --convert-to pdf \ --outdir /container/output "$file" done ``` --- ### 相关问题 1. 如何避免LibreOffice容器因OOM(内存不足)崩溃? 2. 如何实现LibreOffice服务的负载均衡?[^2] 3. 容器内LibreOffice中文乱码如何解决?[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暮雨疏桐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值