将端口暴露给所有容器,而不仅仅是主机

时间:2017-05-11 06:08:42

标签: linux networking docker influxdb

我可以在主机中公开端口的docker容器内运行InfluxDB

» curl -k -L -I https://localhost:8086/ping
HTTP/1.1 204 No Content
Content-Type: application/json
Request-Id: 2bb1059b-360e-11e7-8001-000000000000
X-Influxdb-Version: 1.2.0
Date: Thu, 11 May 2017 05:53:34 GMT

我运行Ubuntu 16.04 docker容器(安装了curl),连接到与InfluxDB容器相同的网络,我无法ping localhost:8086。最后我发现我需要使用InfluxDB容器的IP地址ping:

root@4a5457a5e297:/# curl -k -sL -I https://172.18.0.1:8086/ping
HTTP/1.1 204 No Content
Content-Type: application/json
Request-Id: d8ab4282-360e-11e7-8002-000000000000
X-Influxdb-Version: 1.2.0
Date: Thu, 11 May 2017 05:58:25 GMT

这意味着首先我需要找出InfluxDB容器的IP地址。我猜对了,因为我无法在ifconfig容器中执行InfluxDB,我不知道如何列出所有正在运行的容器的IP:docker ps没有显示它。

因此,InfluxDB的端口在主机中显示为localhost:8086,但它不会暴露给其他容器。一些问题:

  1. 是否可以按名称处理容器? docker是否自动为容器分配DNS条目,是否可以通过容器解析这些条目?来自主持人?什么是命名方案?
  2. 是否可以将端口从一个容器不仅暴露给主机,而且暴露给所有其他容器(在同一网络中运行),以便我可以从任何容器中ping localhost:8086
  3. 如何获取所有正在运行的容器的IP列表?

2 个答案:

答案 0 :(得分:2)

  

我运行一个Ubuntu 16.04 docker容器(安装了curl),   连接到与InfluxDB容器相同的网络,我不是   能ping ping localhost:8086。最后我发现我需要ping   使用InfluxDB容器的IP地址:

当与同一网络上的其他容器“说话”时,请使用容器名称。您可以使用--name influxdb

强制执行此操作

然后,您将能够在同一网络中使用curl http://influxdb:8086

答案 1 :(得分:0)

1。集装箱通信

Rawkode所述,这是可能的。但出于某种原因,我不能用默认的网桥做到这一点。

public class Motor : MonoBehaviour {

public float moveSpeed = 5.0f;
public float drag = 0.5f;
public float terminalRoatationSpeed = 25.0f;
public Virtualjoystick moveJoystick;

private Rigidbody controller;
private Transform camTransform;


// Use this for initialization
void Start () {


    controller = GetComponent<Rigidbody> ();
    controller.maxAngularVelocity = terminalRoatationSpeed;
    controller.drag = drag;

    camTransform = Camera.main.transform;


}

// Update is called once per frame
void FixedUpdate () {

    Vector3 dir = Vector3.zero;

    dir.x = Input.GetAxis ("Horizontal");
    dir.z = Input.GetAxis ("Vertical");

    if(dir.magnitude > 1)dir.Normalize();

    if(moveJoystick.InputDirection != Vector3.zero)
    {
        dir = moveJoystick.InputDirection;
    }



    // Rotate our Direction vector with Camera 
    Vector3 rotatedDir = camTransform.TransformDirection(dir);
    rotatedDir = new Vector3 (rotatedDir.x, 0, rotatedDir.z);
    rotatedDir = rotatedDir.normalized * dir.magnitude;

    controller.AddForce (rotatedDir * moveSpeed);


  }
}

创建测试网络将起作用:

$ docker run -itd --rm --name test1 alpine /bin/sh
726cd933446df40e78e760d86256e11b1e786d83057a9d075c05c4d38240656c
$ docker run -itd --rm --name test2 alpine /bin/sh
c6837529c37f486edbc3a7743a6b127b9bdaae8a619564368697137fd8ae5622
$ docker container exec test1 ping test2
ping: bad address 'test2'
$ docker container exec test2 ping test1
ping: bad address 'test1'
$ docker container stop test1
test1
$ docker container stop test2
test2

2

容器可以直接通信,您不必使用localhost。看一下如何公开端口

  

基本上,您有三种选择:

     
      
  • 既不指定EXPOSE也不指定-p。
  •   
  • 仅指定EXPOSE。
  •   
  • 指定EXPOSE和-p。
  •   
     

如果您未指定其中任何一项,则除了从容器本身内部以外的任何地方都无法访问容器中的服务。

     

如果EXPOSE端口,则无法从Docker外部访问容器中的服务,而是从其他Docker容器中访问。所以这对于容器间通信很有用。

     

如果你EXPOSE和-p一个端口,容器中的服务可以从任何地方访问,甚至可以在Docker之外访问。

在此处找到:https://stackoverflow.com/a/22150099/1561148

3。检查网络

$ docker network create testnet 
ca1db96c3a533033c68d8885fac2f354919edc810e0f376f06f86e45d3050b35
$ docker run -itd --rm --name test1 --network testnet alpine /bin/sh
187f2c8534504e6a8db96c0a731c735976b19b0a710e162f3537b2f5f16d7b05
$ docker run -itd --rm --name test2 --network testnet alpine /bin/sh
7efd386c13962a56dc074903373848174fb5cdb649038a6e67fbb2f0f8bde74b
$ docker container exec test1 ping test2
PING test2 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.076 ms
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.165 ms
64 bytes from 172.18.0.3: seq=2 ttl=64 time=0.159 ms
64 bytes from 172.18.0.3: seq=3 ttl=64 time=0.077 ms
^C
$ docker container exec test2 ping test1
PING test1 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.063 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.235 ms
64 bytes from 172.18.0.2: seq=2 ttl=64 time=0.218 ms
64 bytes from 172.18.0.2: seq=3 ttl=64 time=0.099 ms
^C
$