无法使用 docker-compose 从 Tomcat Docker 容器访问主机
Unable to reach the host from a Tomcat Docker Container using docker-compose
我有一个 docker-compose 版本 1.25.0 和 Docker 版本 20.10.12。我 运行 宁 Ubuntu 21.04。
我有一个 Spring 引导程序作为 .war 文件,我在 tomcat 中 运行。该程序在 docker 容器外工作正常,但是当我 运行 在 docker 容器内时,我无法在浏览器中访问它。
我的Docker文件是这样的:
FROM tomcat:9-jdk8
ADD ./build/libs/studentLetter-1.0.2.war /usr/local/tomcat/webapps/
EXPOSE 8080
RUN mkdir -p /home/gmarsh/workdir
CMD ["catalina.sh", "run"]
我的 docker-compose.yml 文件包含这个:
version: '3.8'
services:
app:
build: ./
image: wbsgrader-online-img
ports:
- 8080:8080
extra_hosts:
- dockerhost:$DOCKER_HOST
network_mode: "host"
其中 DOCKER_HOST 在我的 .profile 中导出为这个
export DOCKER_HOST=`/sbin/ifconfig docker0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print }'`
我在终端输入
docker-compose up --build -d
输出是:
Building app
Step 1/4 : FROM tomcat:latest
---> fb5657adc892
Step 2/4 : ADD ./build/libs/studentLetter-1.0.2.war /usr/local/tomcat/webapps/
---> Using cache
---> 891060c813d6
Step 3/4 : EXPOSE 8080
---> Using cache
---> fbd16298db6c
Step 4/4 : CMD ["catalina.sh", "run"]
---> Using cache
---> 432a1484e8ae
Successfully built 432a1484e8ae
Successfully tagged wbsgrader-img:latest
Creating onlinewbsgrader_app_1 ... done
并且 docker-compose 日志中的输出是:
Attaching to onlinewbsgrader_app_1
app_1 | NOTE: Picked up JDK_JAVA_OPTIONS: --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
app_1 | 31-Dec-2021 22:57:51.711 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name: Apache Tomcat/10.0.14
app_1 | 31-Dec-2021 22:57:51.716 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built: Dec 2 2021 22:01:36 UTC
app_1 | 31-Dec-2021 22:57:51.717 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 10.0.14.0
app_1 | 31-Dec-2021 22:57:51.717 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name: Linux
app_1 | 31-Dec-2021 22:57:51.717 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version: 5.11.0-41-generic
app_1 | 31-Dec-2021 22:57:51.717 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture: amd64
app_1 | 31-Dec-2021 22:57:51.718 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home: /usr/local/openjdk-11
app_1 | 31-Dec-2021 22:57:51.718 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version: 11.0.13+8
app_1 | 31-Dec-2021 22:57:51.718 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor: Oracle Corporation
app_1 | 31-Dec-2021 22:57:51.719 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: /usr/local/tomcat
app_1 | 31-Dec-2021 22:57:51.719 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: /usr/local/tomcat
app_1 | 31-Dec-2021 22:57:51.736 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.lang=ALL-UNNAMED
app_1 | 31-Dec-2021 22:57:51.736 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.io=ALL-UNNAMED
app_1 | 31-Dec-2021 22:57:51.736 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.util=ALL-UNNAMED
app_1 | 31-Dec-2021 22:57:51.736 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.util.concurrent=ALL-UNNAMED
app_1 | 31-Dec-2021 22:57:51.736 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
app_1 | 31-Dec-2021 22:57:51.737 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties
app_1 | 31-Dec-2021 22:57:51.737 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
app_1 | 31-Dec-2021 22:57:51.737 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048
app_1 | 31-Dec-2021 22:57:51.737 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
app_1 | 31-Dec-2021 22:57:51.738 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dorg.apache.catalina.security.SecurityListener.UMASK=0027
app_1 | 31-Dec-2021 22:57:51.738 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dignore.endorsed.dirs=
app_1 | 31-Dec-2021 22:57:51.738 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=/usr/local/tomcat
app_1 | 31-Dec-2021 22:57:51.739 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=/usr/local/tomcat
app_1 | 31-Dec-2021 22:57:51.739 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/usr/local/tomcat/temp
app_1 | 31-Dec-2021 22:57:51.744 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded Apache Tomcat Native library [1.2.31] using APR version [1.7.0].
app_1 | 31-Dec-2021 22:57:51.744 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true], UDS [true].
app_1 | 31-Dec-2021 22:57:51.748 INFO [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL successfully initialized [OpenSSL 1.1.1k 25 Mar 2021]
app_1 | 31-Dec-2021 22:57:52.344 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
app_1 | 31-Dec-2021 22:57:52.382 INFO [main] org.apache.catalina.startup.Catalina.load Server initialization in [967] milliseconds
app_1 | 31-Dec-2021 22:57:52.463 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]
app_1 | 31-Dec-2021 22:57:52.463 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet engine: [Apache Tomcat/10.0.14]
app_1 | 31-Dec-2021 22:57:52.484 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/usr/local/tomcat/webapps/studentLetter-1.0.2.war]
app_1 | 31-Dec-2021 22:57:58.056 INFO [main] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
app_1 | 31-Dec-2021 22:57:58.134 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/usr/local/tomcat/webapps/studentLetter-1.0.2.war] has finished in [5,650] ms
app_1 | 31-Dec-2021 22:57:58.141 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
app_1 | 31-Dec-2021 22:57:58.153 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [5770] milliseconds
如日志中所示,catalina 服务已启动,我的程序 .war 文件已部署到 docker 容器内的 /usr/local/tomcat/webapps。
当我在浏览器地址栏中键入 http://localhost:8080/ 时,出现 HTTP 状态 404 – 未找到错误。
当我打字时
docker ps
我明白了:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
097a4da40100 wbsgrader-img "catalina.sh run" 10 minutes ago Up 10 minutes onlinewbsgrader_app_1
请注意显示中缺少端口。由于某种原因,端口绑定似乎没有发生。
如何使用 docker-compose 使端口绑定工作并通过 localhost 获得浏览器访问权限?
虽然您表示您的 Dockerfile
是从 Tomcat 9 基本图像派生的:
FROM tomcat:9-jdk8
根据您的日志,您似乎正在使用 Tomcat 10:
Server version name: Apache Tomcat/10.0.14
在后一种情况下,请 ware 当前 Spring 不支持 Tomcat 10 和新的 jakarta.*
命名空间。正如此 related SO question, there is an open issue 中所解释的那样。
要解决此问题,您可以使用基于 Tomcat 9 版本的 docker 图像。
如果您已经在使用基于 Tomcat 9 版本的 docker 映像,请务必按照 Spring Boot documentation 中指示的不同步骤成功部署您的 war.
基本上,您需要:
- 在您的应用程序中提供一个
SpringBootServletInitializer
子类:
@SpringBootApplication
public class MyApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(MyApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
- 将您的应用程序打包为 war 文件。例如,使用 Maven 提供以下配置:
<packaging>war</packaging>
- 如有必要,将 Tomcat 依赖项标记为
provided
:
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!-- ... -->
</dependencies>
我有一个 docker-compose 版本 1.25.0 和 Docker 版本 20.10.12。我 运行 宁 Ubuntu 21.04。 我有一个 Spring 引导程序作为 .war 文件,我在 tomcat 中 运行。该程序在 docker 容器外工作正常,但是当我 运行 在 docker 容器内时,我无法在浏览器中访问它。
我的Docker文件是这样的:
FROM tomcat:9-jdk8
ADD ./build/libs/studentLetter-1.0.2.war /usr/local/tomcat/webapps/
EXPOSE 8080
RUN mkdir -p /home/gmarsh/workdir
CMD ["catalina.sh", "run"]
我的 docker-compose.yml 文件包含这个:
version: '3.8'
services:
app:
build: ./
image: wbsgrader-online-img
ports:
- 8080:8080
extra_hosts:
- dockerhost:$DOCKER_HOST
network_mode: "host"
其中 DOCKER_HOST 在我的 .profile 中导出为这个
export DOCKER_HOST=`/sbin/ifconfig docker0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print }'`
我在终端输入
docker-compose up --build -d
输出是:
Building app
Step 1/4 : FROM tomcat:latest
---> fb5657adc892
Step 2/4 : ADD ./build/libs/studentLetter-1.0.2.war /usr/local/tomcat/webapps/
---> Using cache
---> 891060c813d6
Step 3/4 : EXPOSE 8080
---> Using cache
---> fbd16298db6c
Step 4/4 : CMD ["catalina.sh", "run"]
---> Using cache
---> 432a1484e8ae
Successfully built 432a1484e8ae
Successfully tagged wbsgrader-img:latest
Creating onlinewbsgrader_app_1 ... done
并且 docker-compose 日志中的输出是:
Attaching to onlinewbsgrader_app_1
app_1 | NOTE: Picked up JDK_JAVA_OPTIONS: --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
app_1 | 31-Dec-2021 22:57:51.711 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name: Apache Tomcat/10.0.14
app_1 | 31-Dec-2021 22:57:51.716 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built: Dec 2 2021 22:01:36 UTC
app_1 | 31-Dec-2021 22:57:51.717 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 10.0.14.0
app_1 | 31-Dec-2021 22:57:51.717 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name: Linux
app_1 | 31-Dec-2021 22:57:51.717 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version: 5.11.0-41-generic
app_1 | 31-Dec-2021 22:57:51.717 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture: amd64
app_1 | 31-Dec-2021 22:57:51.718 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home: /usr/local/openjdk-11
app_1 | 31-Dec-2021 22:57:51.718 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version: 11.0.13+8
app_1 | 31-Dec-2021 22:57:51.718 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor: Oracle Corporation
app_1 | 31-Dec-2021 22:57:51.719 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: /usr/local/tomcat
app_1 | 31-Dec-2021 22:57:51.719 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: /usr/local/tomcat
app_1 | 31-Dec-2021 22:57:51.736 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.lang=ALL-UNNAMED
app_1 | 31-Dec-2021 22:57:51.736 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.io=ALL-UNNAMED
app_1 | 31-Dec-2021 22:57:51.736 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.util=ALL-UNNAMED
app_1 | 31-Dec-2021 22:57:51.736 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.util.concurrent=ALL-UNNAMED
app_1 | 31-Dec-2021 22:57:51.736 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
app_1 | 31-Dec-2021 22:57:51.737 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties
app_1 | 31-Dec-2021 22:57:51.737 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
app_1 | 31-Dec-2021 22:57:51.737 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048
app_1 | 31-Dec-2021 22:57:51.737 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
app_1 | 31-Dec-2021 22:57:51.738 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dorg.apache.catalina.security.SecurityListener.UMASK=0027
app_1 | 31-Dec-2021 22:57:51.738 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dignore.endorsed.dirs=
app_1 | 31-Dec-2021 22:57:51.738 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=/usr/local/tomcat
app_1 | 31-Dec-2021 22:57:51.739 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=/usr/local/tomcat
app_1 | 31-Dec-2021 22:57:51.739 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/usr/local/tomcat/temp
app_1 | 31-Dec-2021 22:57:51.744 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded Apache Tomcat Native library [1.2.31] using APR version [1.7.0].
app_1 | 31-Dec-2021 22:57:51.744 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true], UDS [true].
app_1 | 31-Dec-2021 22:57:51.748 INFO [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL successfully initialized [OpenSSL 1.1.1k 25 Mar 2021]
app_1 | 31-Dec-2021 22:57:52.344 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
app_1 | 31-Dec-2021 22:57:52.382 INFO [main] org.apache.catalina.startup.Catalina.load Server initialization in [967] milliseconds
app_1 | 31-Dec-2021 22:57:52.463 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]
app_1 | 31-Dec-2021 22:57:52.463 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet engine: [Apache Tomcat/10.0.14]
app_1 | 31-Dec-2021 22:57:52.484 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/usr/local/tomcat/webapps/studentLetter-1.0.2.war]
app_1 | 31-Dec-2021 22:57:58.056 INFO [main] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
app_1 | 31-Dec-2021 22:57:58.134 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/usr/local/tomcat/webapps/studentLetter-1.0.2.war] has finished in [5,650] ms
app_1 | 31-Dec-2021 22:57:58.141 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
app_1 | 31-Dec-2021 22:57:58.153 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [5770] milliseconds
如日志中所示,catalina 服务已启动,我的程序 .war 文件已部署到 docker 容器内的 /usr/local/tomcat/webapps。
当我在浏览器地址栏中键入 http://localhost:8080/ 时,出现 HTTP 状态 404 – 未找到错误。
当我打字时
docker ps
我明白了:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
097a4da40100 wbsgrader-img "catalina.sh run" 10 minutes ago Up 10 minutes onlinewbsgrader_app_1
请注意显示中缺少端口。由于某种原因,端口绑定似乎没有发生。
如何使用 docker-compose 使端口绑定工作并通过 localhost 获得浏览器访问权限?
虽然您表示您的 Dockerfile
是从 Tomcat 9 基本图像派生的:
FROM tomcat:9-jdk8
根据您的日志,您似乎正在使用 Tomcat 10:
Server version name: Apache Tomcat/10.0.14
在后一种情况下,请 ware 当前 Spring 不支持 Tomcat 10 和新的 jakarta.*
命名空间。正如此 related SO question, there is an open issue 中所解释的那样。
要解决此问题,您可以使用基于 Tomcat 9 版本的 docker 图像。
如果您已经在使用基于 Tomcat 9 版本的 docker 映像,请务必按照 Spring Boot documentation 中指示的不同步骤成功部署您的 war.
基本上,您需要:
- 在您的应用程序中提供一个
SpringBootServletInitializer
子类:
@SpringBootApplication
public class MyApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(MyApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
- 将您的应用程序打包为 war 文件。例如,使用 Maven 提供以下配置:
<packaging>war</packaging>
- 如有必要,将 Tomcat 依赖项标记为
provided
:
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!-- ... -->
</dependencies>