我有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内的适当容器。
这有可能实现吗?
答案 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