我想从Docker容器访问我的网站,但不能。我尝试实现的步骤如下。完成所有步骤后,我无法访问http://localhost:8080/index
页面,我在哪里出错了?
Spring-Boot项目的名称为demo
。我的部分代码:
package com.qwerty.demo.rest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class FunRestService {
@GetMapping("/index")
public String setIndex() {
return "HELLO WORLD!";
}
}
我的
dockerfile
代码:FROM openjdk:8
COPY . /usr/var/www/MYPROJECT
WORKDIR /usr/var/www/MYPROJECT
EXPOSE 8080
CMD ./mvnw spring-boot:run
我使用此命令将Spring-Boot项目构建为
myimage1
。docker build -t myimage1 .
然后,使用此命令从
myimage1
创建一个新容器。docker run --name mycontainer1 myimage1
然后Maven下载必要的文件并为我启动我的应用程序。最后输出:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.2.RELEASE)
2019-01-19 17:40:32.604 INFO 6 --- [ main] com.qwerty.demo.DemoApplication : Starting DemoApplication on 8086b6e010fb with PID 6 (/usr/var/www/MYPROJECT/target/classes started by root in /usr/var/www/MYPROJECT)
2019-01-19 17:40:32.613 INFO 6 --- [ main] com.qwerty.demo.DemoApplication : No active profile set, falling back to default profiles: default
2019-01-19 17:40:34.119 INFO 6 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2019-01-19 17:40:34.170 INFO 6 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2019-01-19 17:40:34.171 INFO 6 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.14]
2019-01-19 17:40:34.186 INFO 6 --- [ main] o.a.catalina.core.AprLifecycleListener : The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/usr/java/packages/lib/amd64:/usr/lib/x86_64-linux-gnu/jni:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib/jni:/lib:/usr/lib]
2019-01-19 17:40:34.288 INFO 6 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2019-01-19 17:40:34.289 INFO 6 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1559 ms
2019-01-19 17:40:34.602 INFO 6 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2019-01-19 17:40:34.882 INFO 6 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''2019-01-19 17:40:34.888 INFO 6 --- [ main] com.qwerty.demo.DemoApplication : Started DemoApplication in 3.176 seconds (JVM running for 69.839)
我们应该怎么做才能将一个这样的Spring-Boot项目(使用
Dockerfile
)转换为图像?如何访问我的网页?
最佳答案
运行Docker容器时,默认情况下不会发布任何应用程序碰巧监听的所有端口。
为了发布端口,您需要在使用镜像运行容器时指定端口。有关如何执行此操作的所有详细信息,可以检查docker run命令文档中的“EXPOSE”部分:https://docs.docker.com/engine/reference/run/
简而言之,您想在运行容器时添加另一个选项:
docker run --name mycontainer1 -p 8080:8080 myimage1
我不确定您是否想通过添加
EXPOSE 8080
在您的Dockerfile中。实际上,这并不意味着在使用镜像运行容器时端口将被暴露。您可能会在Dockerfile reference中找到:
The EXPOSE instruction does not actually publish the port. It functions as a type of documentation between the person who builds the image and the person who runs the container, about which ports are intended to be published. To actually publish the port when running the container, use the -p flag on docker run to publish and map one or more ports, or the -P flag to publish all exposed ports and map them to high-order ports.
关于spring-boot - 如何将Spring-Boot Web服务转换为Docker镜像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54269973/