在这篇博文里我们会讨论 在Docker中使用Elasticsearch 时的网络配置。
注:这篇博文会用到Docker Hub中的Elasticsearch 镜像。该镜像的开发和生产与Elastic无关。
你也可以使用你自己的镜像,具体步骤可以参考How to make a Dockerfile for Elasticsearch.(如何为Elasticsearch创建Dockerfile)
https://www.elastic.co/blog/how-to-make-a-dockerfile-for-elasticsearch
可以用不同的方式在Docker中设置网络的方式,默认情况下提供三种网络类型。可以通过docker network ls 查看详情。
None Network 无网络
不可用的网络,该类型网络不能用于集群运行。
Host Network 主机网络
设置 --net=host ,container将会使用该主机网络,该操作存在风险。能够在container容器内更改主机网络,如果有应用正好以管理员权限在运行,就会导致系统的脆弱性,别人就可以通过Docker容器非法的远程控制主机网络。为了安全考虑一般不建议使用这个方法,虽然这样设置可以让网络情况比一般设置更好。
Bridge Network 桥接网络
桥接网络是Docker中的默认网络类型。
可以用 docker network inspect bridge 命令查看默认的桥接网络详情。
$ docker network inspect bridge
[
{
"Name": "bridge",
"Id": "b38c312777a0f3890034c9b396669842947b80c9051d10a283c9d43937910578",
"Scope": "local",
"Driver": "bridge",
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16"
}
]
},
"Containers": {},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
}
}
]
实例中桥接网络的名字的docker0.添加容器时,每个容器会自动生成联通到docker bridge docker0的虚拟网络接口,并且分配一个IP地址给这个虚拟接口。
这个bridge会自动在连接到它的网络接口之间发送数据包,同时允许容器与主机、容器之间的通讯。
默认情况下,Docker容器可以通过docker0接口和外界通讯,但是外界不能连接到容器。
外部连接由IP 转发和iptables实现,你可以通过端口映射来实现。
运行Elasticsearch时,你要确保将其发布到可以访问容器外部的IP地址。这一项可以通过设置 network.publish_host 来实现。
对于节点之间的 discovery,你需要通过设置discovery.zen.ping.unicast.hosts 和 discovery.zen.minimum_master_nodes来配置Zen Discovery.
示例:
docker run -d -p 9200:9200 -p 9300:9300 elasticsearch:2 \
elasticsearch \
-Des.discovery.zen.ping.unicast.hosts=192.168.99.100,192.168.99.101 \
-Des.discovery.zen.minimum_master_nodes=2 \
-Des.network.publish_host=192.168.99.100
docker run -d -p 9200:9200 -p 9300:9300 elasticsearch:2 \
elasticsearch \
-Des.discovery.zen.ping.unicast.hosts=192.168.99.100,192.168.99.101 \
-Des.discovery.zen.minimum_master_nodes=2 \
-Des.network.publish_host=192.168.99.100
By default, a Docker container is configured to use IPv4 only. It is possible to configure IPv4/IPv6 by starting the Docker daemon with the --ipv6 flag.
默认情况下,一个Docker容器只能使用IPv4.但是可以在启动Docker daemon的时候加上 --ipv6标签,就可以配置IPv4/IPv6了。
创建容器时会获取一个连接到本地(link-local)的IP地址,你也可以分配一个全局可路由的IPv6地址给你的容器。
可路由的IPv6地址可以实现不同主机容器之间的交互。这篇文章介绍了更多相关信息:Advanced networking。https://docs.docker.com/v1.5/articles/networking/#ipv6
Overlay Network 叠加网络
Docker最近发布的几个版本里介绍了一种新的网络方法叫叠加网络,适用于多主机的网络环境。
使用叠加网络要求设置一个键值存储,这样节点可以发现并加入到集群中,Docker目前支持Consul,etcd,和ZooKeeper.