如何使用 spotify docker 客户端连接到主机上的 docker 守护进程
How to connect to the docker daemon on the host using spotify docker client
我想在 docker 容器中 运行 Java Spring 应用程序,并且此应用程序应该能够部署同级容器。当我直接在我的机器上 运行 Java 应用程序时它工作正常并且可以部署容器,但是一旦我尝试 运行 容器内的应用程序它就不再工作了(我在一个容器中使用 supervisord 来 运行 mongodb 和 Java Spring 应用程序,我知道那不是最佳实践)。容器启动正常,但当我的应用程序尝试连接到 docker 守护程序时崩溃,没有来自 Java 的任何堆栈跟踪,只是错误 WARN received SIGTERM indicating exit request
。 supervisord 日志不包含其他信息。
我尝试使用[=从主机(Windows 10 Pro with Docker Desktop,也尝试过Ubuntu Server 18.04)将docker套接字安装到容器中16=]。
我也尝试使用 --net="host"
。
两者都没有工作,尽管第二个容器确实 没有 崩溃但会产生不同的错误 ({}->unix://localhost:80: Connection refused
),在我的 java 应用程序的日志中可见,这表明它甚至无法找到守护进程的正确地址。
我也激活了"Expose deamon on tcp://localhost:2375 without TLS"。
我还尝试将容器内的 DOCKER_HOST 环境变量设置为默认值,例如 "tcp://localhost:2375" 或“/var/run/docker.sock”。
这是我用来初始化 docker 客户端的代码。
DockerClient docker = DefaultDockerClient.fromEnv().build();
DefaultDockerClient.fromEnv().build();
应该创建一个 docker 客户端,它使用 DOCKER_HOST 环境变量连接到主机或默认地址(“/var/run/docker.sock” *NIX).
这是我的 DOCKERFILE:
FROM openjdk:8-jre-alpine
ENV PACKAGES mongodb supervisor
VOLUME /opt/server
VOLUME /data/db
WORKDIR /opt/accservermanager
ADD supervisord.conf /etc/supervisor.conf
ADD accservermanager.jar /opt/accservermanager/accservermanager.jar
ADD application.properties /opt/accservermanager/application.properties
RUN apk update && \
apk add --update $PACKAGES --no-cache && \
rm -rf /var/cache/apk/*
EXPOSE 8000
CMD ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisor.conf"]
最后,我的 supervisord.conf
[supervisord]
user=root
stderr_logfile=/var/log/supervisord.err.log
stdout_logfile=/var/log/supervisord.out.log
loglevel=debug
[program:mongodb]
command=mongod --smallfiles
autostart=true
autorestart=true
stderr_logfile=/var/log/mongo.err.log
stdout_logfile=/var/log/mongo.out.log
[program:accservermanager]
directory=/opt/accservermanager/
command=java -jar accservermanager.jar
autostart=true
autorestart=true
stderr_logfile=/var/log/accservermanager.err.log
stdout_logfile=/var/log/accservermanager.out.log
预期结果:应用程序从主机连接到 docker 客户端,并且能够 deploy/manage 主机上的容器
实际结果:容器崩溃或输出错误。
原来有一个新版本的 spotify-docker 解决了我的问题。
从 v8.15.1
更新到 v8.15.2
解决了我的问题。
我想在 docker 容器中 运行 Java Spring 应用程序,并且此应用程序应该能够部署同级容器。当我直接在我的机器上 运行 Java 应用程序时它工作正常并且可以部署容器,但是一旦我尝试 运行 容器内的应用程序它就不再工作了(我在一个容器中使用 supervisord 来 运行 mongodb 和 Java Spring 应用程序,我知道那不是最佳实践)。容器启动正常,但当我的应用程序尝试连接到 docker 守护程序时崩溃,没有来自 Java 的任何堆栈跟踪,只是错误 WARN received SIGTERM indicating exit request
。 supervisord 日志不包含其他信息。
我尝试使用[=从主机(Windows 10 Pro with Docker Desktop,也尝试过Ubuntu Server 18.04)将docker套接字安装到容器中16=]。
我也尝试使用 --net="host"
。
两者都没有工作,尽管第二个容器确实 没有 崩溃但会产生不同的错误 ({}->unix://localhost:80: Connection refused
),在我的 java 应用程序的日志中可见,这表明它甚至无法找到守护进程的正确地址。
我也激活了"Expose deamon on tcp://localhost:2375 without TLS"。
我还尝试将容器内的 DOCKER_HOST 环境变量设置为默认值,例如 "tcp://localhost:2375" 或“/var/run/docker.sock”。
这是我用来初始化 docker 客户端的代码。
DockerClient docker = DefaultDockerClient.fromEnv().build();
DefaultDockerClient.fromEnv().build();
应该创建一个 docker 客户端,它使用 DOCKER_HOST 环境变量连接到主机或默认地址(“/var/run/docker.sock” *NIX).
这是我的 DOCKERFILE:
FROM openjdk:8-jre-alpine
ENV PACKAGES mongodb supervisor
VOLUME /opt/server
VOLUME /data/db
WORKDIR /opt/accservermanager
ADD supervisord.conf /etc/supervisor.conf
ADD accservermanager.jar /opt/accservermanager/accservermanager.jar
ADD application.properties /opt/accservermanager/application.properties
RUN apk update && \
apk add --update $PACKAGES --no-cache && \
rm -rf /var/cache/apk/*
EXPOSE 8000
CMD ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisor.conf"]
最后,我的 supervisord.conf
[supervisord]
user=root
stderr_logfile=/var/log/supervisord.err.log
stdout_logfile=/var/log/supervisord.out.log
loglevel=debug
[program:mongodb]
command=mongod --smallfiles
autostart=true
autorestart=true
stderr_logfile=/var/log/mongo.err.log
stdout_logfile=/var/log/mongo.out.log
[program:accservermanager]
directory=/opt/accservermanager/
command=java -jar accservermanager.jar
autostart=true
autorestart=true
stderr_logfile=/var/log/accservermanager.err.log
stdout_logfile=/var/log/accservermanager.out.log
预期结果:应用程序从主机连接到 docker 客户端,并且能够 deploy/manage 主机上的容器
实际结果:容器崩溃或输出错误。
原来有一个新版本的 spotify-docker 解决了我的问题。
从 v8.15.1
更新到 v8.15.2
解决了我的问题。