当前位置: 首页 > 知识库问答 >
问题:

如何在没有端口映射的情况下向外部docker主机公开docker容器的ip和端口?

蒲勇
2023-03-14

当我在一台docker主机上为同一个web映像启动两个docker容器时。

  • 两个docker容器在同一端口监听5000
  • 两个集装箱的端口5000映射到docker主机的不同端口:4915549156
  • 要从docker主机外部访问两个容器,需要通过访问docker主机ip和端口4915549156

是否有一种解决方案可以通过ip和端口从docker主机外部访问docker容器,x.x.x:5000,而无需端口映射?

不同dock主机上的所有docker容器都可以直接相互访问。

共有2个答案

终彬郁
2023-03-14

创建虚拟机时,请确保在“网络”下选择以下选项

Attached to:        Bridged NetworkManager
Adapter Type:       PCnet-Fast III (Am 79C973)
Promiscious Mode    Allow All
Install docker, libvrt

确保使用root完成以下操作

# chkconfig NetworkManager off
# chkconfig network on  
# service NetworkManager stop
# service network start

在/etc/sysconfig/networkscripts中创建文件ifcfg-xxxxx

DEVICE=xxxxx
TYPE=Bridge
BOOTPROTO=dhcp
ONBOOT=yes
DELAY=0

并在文件末尾附加到ifcfg-p2p1/ifcfg-eth0BRIDGE=xxxx

brctl show 

要确保桥接连接具有适配器,请参见p2p1eth0

# brctl show
bridge name     bridge id               STP enabled     interfaces
gsbr01          8000.080027595649       no              eth0
virbr0          8000.5254004c1564       yes             virbr0-nic

现在,在启动docker之前,我们必须使用桥接器,而不是docker0来执行此操作,请以docker-d-b=gsbr01

$ echo 'DOCKER_OPTS="-b=gsbr01"' >> /etc/sysconfig/docker
$ sudo service docker start

检查结果:

# brctl show
bridge name     bridge id               STP enabled     interfaces
gsbr01          8000.080027595649       no              eth0
                                                        veth5806f27
                                                        vethb3e33da
virbr0          8000.5254004c1564       yes             virbr0-nic

docker -d -b=gsbr01
宁修永
2023-03-14

您可以通过主机上的IP别名来实现这一点。

首先,在主机上添加一个与主接口具有不同IP地址的虚拟接口。我们将用IP10.0.0.10调用主接口eth0,用IP地址10.0.0.11调用虚拟接口eth0:1

 ifconfig eth0:1 10.0.0.11 netmask 255.255.255.0 up 

现在运行容器并将端口5000映射到相应的接口。例如:

docker run -p 10.0.0.10:5000:5000 -name container1 <someimage> <somecommand>
docker run -p 10.0.0.11:5000:5000 -name container2 <someimage> <somecommand>

现在,您可以在外部使用不同的IP地址访问端口5000上的每个容器。

 类似资料:
  • 主机:Mac OS X 10.10.5 Docker 1.10.1 我做过这样的事: 步骤1:为永久postgres数据创建卷 -->没有打开端口5432 更新2:更陌生。我也这样做过: 阻止Docker。然后,在我的主机中运行一个普通的PostgreSQL 9.4.4实例(这里不涉及docker,只在Mac OS X主机中运行postgres,监听端口5432)。一切正常: 为什么? 有道理吗?

  • 我有一个问题,或者最好说有两个问题。两者都依赖于Docker,并且与Docker如何处理容器主机名和端口的理解有关。 假设我有两个服务在不同的docker容器中运行,并将容器中的端口80公开到端口8081(service1)和端口8082(service2): 服务1: 8081: 80服务2: 8082: 80 现在我很清楚,从主机的角度来看,我可以通过使用公开的端口(http://localh

  • 我可能遗漏了一些可笑的东西,但我试图向我的主机(Mac)公开的每个docker容器似乎都不起作用。我可以看出这些容器正在运行,并且似乎已经正确地暴露在我选择的端口中。我错过了什么明显的东西吗?任何帮助都将不胜感激。 我下载了最新的ElasticSearch图像:https://www.elastic.co/guide/en/elasticsearch/reference/current/docke

  • 问题内容: 我想在不同主机上的某些Docker容器中运行任务。而且我编写了一个管理器应用程序来管理容器(启动任务,停止任务,获取状态等)。容器启动后,它将向管理器发送一个http请求及其地址和端口,因此管理器将知道如何管理该容器。 由于同一主机上可能运行着多个容器,因此它们将被映射到不同的端口。要在我的经理上注册一个容器,我必须知道每个容器映射到哪个端口。 如何 在 Docker容器中获取映射的端

  • 问题内容: 除了使用环境变量之外,还有什么方法可以从在该主机上运行的容器内部获取Docker主机的主机名? 我知道我可以在创建容器时将主机名作为环境变量传递给容器。 我想知道如何在运行时查找它。 有没有办法在Docker主机中运行的容器获取“ foo.example.com”? 编辑以添加用例: 容器将创建SRV记录以用于表单的服务发现 其中20003是docker主机上动态分配的端口,用于服务监

  • 除了使用环境变量之外,还有哪些方法可以从运行在该主机上的容器内部获取docker主机的主机名?我知道我可以在容器创建时将主机名作为环境变量传递给容器。我想知道如何在运行时查找它。 在docker主机中运行的容器是否有方法获得“foo.example.com”? 编辑以添加用例: 容器将为表单的服务发现创建一个SRV记录 其中20003是docker主机上动态分配的端口,用于侦听bar中某个固定端口