docker compose consul
官方地址:https://developer.hashicorp.com/consul/tutorials/docker/docker-compose-datacenter
以下是一个简单的docker-compose例子,展示了如何使用Consul在三个节点之间建立集群(也可以使用配置文件的写法,可以设置更多的参数):
version: '3'
services:
consul1:
image: consul:latest
container_name: consul1
volumes:
- /opt/consul/data1:/consul/data
command: consul agent -server -bootstrap-expect=3 -retry-join=consul2 -retry-join=consul3 -datacenter=dc1 -ui -client=0.0.0.0 -bind=0.0.0.0 -node=consul1 -data-dir=/consul/data
ports:
- "8500:8500"
- "8600:8600/tcp"
- "8600:8600/udp"
networks:
- consul-network
consul2:
image: consul:latest
container_name: consul2
volumes:
- /opt/consul/data2:/consul/data
command: consul agent -server -retry-join=consul1 -retry-join=consul3 -datacenter=dc1 -ui -client=0.0.0.0 -bind=0.0.0.0 -node=consul2 -data-dir=/consul/data
networks:
- consul-network
consul3:
image: consul:latest
container_name: consul3
volumes:
- /opt/consul/data3:/consul/data
command: consul agent -server -retry-join=consul1 -retry-join=consul2 -datacenter=dc1 -ui -client=0.0.0.0 -bind=0.0.0.0 -node=consul3 -data-dir=/consul/data
networks:
- consul-network
networks:
consul-network:
driver: bridge
参数解析
注意:参数的 =
号没有空格,如果有这个等于号会被识别成内容
-
-retry-join=consul2
加入某个节点,注意名称 -
-datacenter
- 此标志控制运行代理程序的数据中心。如果未提供,则默认为“dc1”。Consul对多个数据中心拥有一流的支持,但它依赖于正确的配置。同一个数据中心内的节点应该位于单个局域网中。 -
-node
- 集群中此节点的名称。这在集群内必须是唯一的。默认情况下,这是机器的主机名。
一,建立集群,并加入集群
在此示例中,我们定义了三个Consul节点:consul1,consul2和consul3
。第一个节点作为主节点,使用了“-bootstrap-expect=3”
参数来引导集群。其他两个节点通过“-retry-join=其他节点”
参数加入了该集群。consul1
为你的第一个节点的名称
二。端口对应
我们使用了Consul的默认端口8500,并将其映射到主机的8500端口。
,他可以使节点来通讯 的Docker网络来连接这三个节点。
三,数据卷持久化
每个节点都使用了名为“consul-data”的卷来存储其数据。这确保了即使容器被删除或重新创建,Consul的数据也能得到保留。
consul-data
是通过 Docker 的数据卷(Volume)来实现的,它将宿主机的一个目录挂载到容器内部用于存储 Consul 的数据。在上面的例子中,我们定义了一个名为 consul-data
的卷,并将其与每个服务的容器挂载到本地宿主机的 /opt/consul/data
目录。
这些卷实际上是在宿主机上创建的,因此 Consul 的数据实际上存储在宿主机上的目录中。这样做的好处是,即使容器被删除或重新创建,Consul 的数据也能得到保留,因为数据存储在宿主机上的目录中。
挂载数据卷还可以使多个容器共享相同的数据,这在构建分布式应用程序时非常有用。
注意:
上面的代码中,我们定义了一个名为 consul-data
的卷和一个名为 consul-net
的 Docker 网络。虽然它们后面没有任何内容,但它们是必需的,因为这些声明定义了 Docker 服务中使用的卷和网络。
如果您删除这些声明,Docker Compose 将无法创建卷或网络。在这种情况下,Docker Compose 将会抛出一个错误并停止服务的创建。
因此,尽管这些声明后面没有任何内容,但是为了 Docker Compose 正确地创建服务,您需要保留这些声明。
使用networks
参数的优点:
-
更好的隔离:每个服务都可以分配到自己的网络,从而避免了不同网络之间的干扰。
-
更好的网络安全性:您可以使用网络层面的安全性来保护服务之间的通信,而不是依赖于应用程序层面的安全性。
-
更易于管理:您可以轻松地添加或删除服务,而不必担心它们如何与其他服务通信。
-
更好的性能:Docker Compose会自动为每个网络创建一个DNS服务器,从而提高了服务之间的通信速度。
虽然使用links
参数可以达到相似的效果,但是它已经被认为是过时的方法。因此,使用networks
参数是更好的选择。
network 和 端口 他们之间的区别及应用场景
端口映射:
- 端口映射允许将容器内部的端口映射到主机上的端口,以便可以从主机上访问容器。这对于将多个容器连接到同一主机的情况非常有用。
- 在Docker Compose文件中,可以使用“ports”关键字来指定端口映射。
- 端口映射是比较简单的方式,但是可能会出现端口冲突问题。当多个容器试图将同一端口映射到主机上时,可能会出现冲突。
networks参数:
- Networks参数允许在Docker Compose中定义网络。这些网络可以在多个容器之间共享,以便它们可以相互通。
- 使用networks参数可以避免端口冲突问题,因为容器可以相互通信而不必使用映射端口。
- 可以在Docker Compose文件中使用“networks”关键字来定义网络。
- Networks参数需要更多的配置和设置,但是可以提供更好的安全性和可伸缩性。
综上所述,选择端口映射还是网络参数取决于具体的应用场景和需求。如果您希望简化配置和管理,并且只需要将容器连接到主机上,那么端口映射可能是更好的选择。如果您需要更好的安全性和可伸缩性,并且需要让多个容器相互通信而不必使用映射端口,那么networks参数可能更适合您的需求。
在上述示例中,我们有三个服务:consul-server-1,consul-server-2和consul-server-3。第一个服务是启动consul集群的引导服务器,它使用-bootstrap-expect=3
参数来等待其他两个服务器加入集群。第二个和第三个服务使用-join
参数来加入引导服务器。
在每个服务的command
字段中,我们使用了一些Consul参数来设置服务节点的名称、数据中心、绑定IP地址和客户端地址等。我们还开放了8500和8600端口,以便在浏览器中访问Consul UI并允许DNS查询。
最后,我们使用network_mode: "host"
将服务加入主机网络,以便它们可以使用宿主机的IP地址进行通信。
请注意,在实际使用中,您需要将<ip address of server X>
替换为每个服务器的实际IP地址。此外,您可能需要添加其他参数来配置Consul集群,例如ACL,TLS等。