docker - 从另一个容器运行在一个容器中的 curl 应用程序
问题描述
我创建了一个 docker 网络:
docker network create --driver bridge sample-network
接下来我在该网络上启动两个容器:
docker run -it --network sample-network -p 8080:8080 --name frontend-container frontend-image
docker run -it --network sample-network -p 8082:8080 --name backend-container backend-image
结果:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5328faa21db frontend-image "docker-entrypoint.s…" 33 minutes ago Up 33 minutes 0.0.0.0:8080->8080/tcp frontend-container
e13d798edbec backend-image "java -jar backend-0…" About an hour ago Up About an hour 0.0.0.0:8082->8080/tcp backend-container
backend-container
运行 Spring Boot Web 应用程序的位置
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.7.RELEASE)
2019-10-21 18:29:40.487 INFO 1 --- [ main] hello.Application : Starting Application v0.1.0-SNAPSHOT on e13d798edbec with PID 1 (/backend-0.1.0-SNAPSHOT.jar started by root in /)
2019-10-21 18:29:40.489 INFO 1 --- [ main] hello.Application : No active profile set, falling back to default profiles: default
2019-10-21 18:29:41.289 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2019-10-21 18:29:41.321 INFO 1 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2019-10-21 18:29:41.321 INFO 1 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.22]
2019-10-21 18:29:41.399 INFO 1 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2019-10-21 18:29:41.399 INFO 1 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 873 ms
2019-10-21 18:29:41.609 INFO 1 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2019-10-21 18:29:41.758 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2019-10-21 18:29:41.761 INFO 1 --- [ main] hello.Application : Started Application in 1.604 seconds (JVM running for 1.889)
接下来我想backend-container
从以下卷曲frontend-container
:
$ docker exec -it frontend-container /bin/bash
bash-4.4# curl backend-container:8082
curl: (7) Failed to connect to backend-container port 8082: Connection refused
但为什么我的连接被拒绝?他们都在同一个网络上。
解决方案
您的两个容器都在 port 上运行应用程序8080
。因此,要通过网络连接到后端应用程序,您应该将backend-container:8080
其用作主机。
您似乎已将端口发布8082
到backend-container
您的主机 - 但这并不意味着您可以从另一个容器连接到此端口上的应用程序 - 如果您想backend-container
使用localhost:8082
.
关于-p
选项的工作原理,请参阅container networking
:
默认情况下,当您创建容器时,它不会向外界发布任何端口。要使端口对 Docker 外部的服务或未连接到容器网络的 Docker 容器可用,请使用
--publish
or-p
标志。这将创建一个防火墙规则,将容器端口映射到 Docker 主机上的端口。
推荐阅读
- javascript - 复制浏览器 URL 栏的特定部分
- regex - 如何使用正则表达式从 vscode 用户片段中的 TM_FILEPATH 返回目录?
- compiler-construction - 证明不是 LALR(1) 的 LR(1) 文法必须只有 reduce/reduce 冲突
- ghost-blog - 如何在子目录上制作幽灵主页?
- c# - 为什么我在此代码的循环中出现错误?
- java - 从现有变量创建映射(例如,Java 等价于 JavaScript 的 `{varA, varB, varC}`)
- html - 在模板中动态加载背景图片
- r - 使用R中的函数和map()通过不同的列连接多个数据框?
- java - 如何改进解决缺失坐标的算法?
- javascript - 如何将视频背景对齐为居中而没有截止?