如何使用端口转发使用DNS名称连接到docker容器

时间:2016-02-02 17:52:34

标签: dns docker port portforwarding

我有2个redis容器在同一台机器m1上运行。

container1具有端口映射6379到6400

docker run -d -p 6379:6400 myredisimage1

container2具有端口映射6379到7500

docker run -d -p 6379:7500 myredisimage2

我正在寻找一种解决方案,其他机器m2可以使用不同的DNS名称但相同的端口号与机器m1通信。

redis.container1.com:6379
redis.container2.com:6379

我想将该请求重定向到机器m1内的适当容器。

这有可能实现吗?

2 个答案:

答案 0 :(得分:0)

这是可能的,但很丑陋。首先,问问自己是否真的需要这样做,或者如果你只是使用容器的不同端口就可以逃脱。无论如何,如果你绝对需要这样做,请按照以下方式进行:

每个docker容器都可以从主机访问自己的ip地址。 AFAIK,这些是在运行时伪随机生成的,但可以通过执行docker inspect $CONTAINER_ID来访问它们,例如:

docker inspect e804af2472ca
[
{
    "Id": "e804af2472ca605dec0035f45d3bd05c1fbccee31e6c09381b0c16657378932f",
    "Created": "2016-02-02T21:34:12.49059198Z",
    ...
        "Gateway": "172.17.0.1",
        "GlobalIPv6Address": "",
        "GlobalIPv6PrefixLen": 0,
        **"IPAddress": "172.17.0.6"**,
        "IPPrefixLen": 16,
        "IPv6Gateway": "",
        ...
    }
}
]

在这种情况下,我们知道该容器可从主机访问的IP地址为172.17.0.1。该IP地址可以从主机完全使用,因此您可以为其提供代理redis.container1.com,并为您的其他IP提供redis.container2.com。你需要在每次框上升时重新加载代理地址,所以这绝对不是理想的,但它应该可以工作。

同样,我的建议总体上不是这样做的。

答案 1 :(得分:0)

我不确定我是否正确对你。 但是如何在同一个端口上启动两个容器呢?

在我看来,这应该通过使用负载均衡器来处理。尝试HAProxy并为每个域名设置两个acl。

我会选择这样的东西:(使用docker-compose)

Docker Copose设置以部署docker镜像:

 private IndexWriter writer;
private Directory directory;

public indexer(String indexDir) throws IOException {
    directory = FSDirectory.open(new File(indexDir));
    writer = new IndexWriter(directory,
            new StandardAnalyzer(
                    Version.LUCENE_30),
            true,
            IndexWriter.MaxFieldLength.UNLIMITED);
}

public void close() throws IOException {
    writer.close();
}

public int index(String dataDir, FileFilter filter)
        throws Exception {
    File[] files = new File(dataDir).listFiles();
    for (File f : files) {
        if (!f.isDirectory()
                && !f.isHidden()
                && f.exists()
                && f.canRead()
                && (filter == null || filter.accept(f))) {
            indexFile(f);
        }
    }
    return writer.numDocs();
}

private static class TextFilesFilter implements FileFilter {

    public boolean accept(File path) {
        return path.getName().toLowerCase()
                .endsWith(".txt");
    }
}

protected Document getDocument(File f) throws Exception {
    Document doc = new Document();
    doc.add(new Field("mycontents", new FileReader(f)));
    doc.add(new Field("filename", f.getName(),
            Field.Store.YES, Field.Index.NOT_ANALYZED));
    doc.add(new Field("fullpath", f.getCanonicalPath(),
            Field.Store.YES, Field.Index.NOT_ANALYZED));
    return doc;
}

private void indexFile(File f) throws Exception {
    System.out.println("Indexing " + f.getCanonicalPath());
    Document doc = getDocument(f);
    writer.addDocument(doc);
}

然后自定义haproxy配置:

redis-1:
    container_name: redis-1
    image: myredis
    restart: always
    expose: 
        - "6400"

redis-2:
    container_name: redis-2
    image: myredis
    restart: always
    expose: 
        - "6400"

haproxy:
    container_name: haproxy
    image: million12/haproxy
    restart: always
    command: -n 500
    ports:
        - "6379:6379"
    links:
        - redis-1:redis.server.one
        - redis-2:redis.server.two
    volumes:
        - /path/to/my/haproxy.cfg:/etc/haproxy/haproxy.cfg