首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我不能通过主机从另一个码头集装箱卷起

为什么我不能通过主机从另一个码头集装箱卷起
EN

Stack Overflow用户
提问于 2016-12-15 18:37:45
回答 4查看 18.5K关注 0票数 31

我真的不明白这里发生了什么。我只是想使用主机的公共ip,在发布的端口上,从一个停靠容器内部执行一个http请求,然后通过主机执行另一个码头容器请求。

这是我的装置。我有我的开发机器。我有一台有两个集装箱的码头主机。CONT_A在端口3000上监听和发布web服务。

代码语言:javascript
运行
复制
DEV-MACHINE

HOST (Public IP = 111.222.333.444)
  CONT_A (Publish 3000)
  CONT_B

在我的开发机器上(一台完全不同的机器)

我可以卷曲而不出任何问题

代码语言:javascript
运行
复制
curl http://111.222.333.444:3000 --> OK

当我SSH进入主机时

我可以卷曲而不出任何问题

代码语言:javascript
运行
复制
curl http://111.222.333.444:3000 --> OK

当我在CONT_B中执行时

不可能只是暂停。平很好不过..。

代码语言:javascript
运行
复制
docker exec -it CONT_B bash
$ curl http://111.222.333.444:3000 --> TIMEOUT
$ ping 111.222.333.444 --> OK

为什么?

Ubuntu 16.04,Docker 1.12.3 (默认网络设置)

EN

回答 4

Stack Overflow用户

发布于 2016-12-15 20:18:44

我知道这并不是对问题的严格回答,但是有一种解决问题的更简单的方法。我会完全忘记为集装箱间通信发布港口。相反,创建一个覆盖网络使用码头群。您可以找到完整的指南这里,但本质上您可以执行以下操作:

代码语言:javascript
运行
复制
//create network    
docker network create --driver overlay --subnet=10.0.9.0/24 my-net
//Start Container A
docker run -d --name=A --network=my-net producer:latest
//Start Container B
docker run -d --name=B --network=my-net consumer:latest

//Magic has occured
docker exec -it B /bin/bash
> curl A:3000 //MIND BLOWN!

然后,在容器内部,您可以只需卷起主机名A,它将为您解析(即使您开始缩放等等)。

如果您不热衷于使用Docker群,您还可以使用Docker遗留链接:

代码语言:javascript
运行
复制
docker run -d --name B --link A:A consumer:latest

它将链接A容器中的任何公开(未发布)端口。

最后,如果您开始使用关于链接和覆盖网络的production...forget,altogether...use Kubernetes :-)初始设置要困难一些,但是它们引入了一些概念和工具,使得连接和缩放容器集群变得更加容易!但这只是我个人的看法。

票数 10
EN

Stack Overflow用户

发布于 2019-07-12 16:30:05

通过使用--network host参数运行容器B,您可以简单地使用本地主机访问容器A,而不需要公共ip。

代码语言:javascript
运行
复制
> docker run -d --name containerB --network host yourimagename:version

使用上面的命令运行容器B之后,您可以从容器B中尝试curl容器A,如下所示

代码语言:javascript
运行
复制
> docker exec -it containerB /bin/bash
> curl http://localhost:3000
票数 4
EN

Stack Overflow用户

发布于 2022-02-26 21:37:29

当前的答案中没有一个解释为什么码头集装箱的行为与问题中所描述的一样。

Docker是为了向一个或多个容器提供主机资源的轻量级隔离。

默认情况下,码头网络与主机网络隔离,并使用桥梁网络 (默认情况下,也使用覆盖网络)进行容器间通信。

以及如何在没有码头网络的情况下解决问题。

来自"如何从Docker容器内连接到Docker主机?

从DockerVersion18.03开始,您可以使用host.docker.internal主机名从Docker容器中连接到Docker主机。 这在用于Mac和Docker for Windows的Docker和Docker for Windows上工作得很好,但不幸的是,直到2020年12月Docker20.10.0发布后,Linux才支持这一点。 从20.10版本开始,Docker引擎现在还支持通过Linux上的host.docker.internal与Docker主机进行通信。 不幸的是,这在Linux上是行不通的,因为您需要添加额外的--add-host运行标志: -add=host.docker.内部:主机-网关 这是出于开发目的,不会在/Mac之外的生产环境中工作。

这样,您就不必将网络驱动程序更改为--network=host,并且仍然可以通过host.docker.internal访问主机。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41171115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档