根据Marathon文档:
servicePort: 当你在Marathon中创建一个新应用程序(通过REST API或前端),你可以为其分配一个或多个服务端口。你可以指定所有有效的端口号作为服务端口,也可以使用0来表示Marathon应自动为应用程序分配免费的服务端口。如果你选择自己的服务端口,你必须确保它在你所有应用程序中是唯一的。
让我在Marathon的两种主要网络配置的情况下详细解释一下,并在此过程中提供一些有关它们的信息。
主机模式
用途:Docker应用程序的默认选项,非Docker应用程序的唯一选项
在这种配置下,你的应用程序将直接绑定到主机的端口上。
如果不使用服务端口
你可以要求Marathon为你提供主机的任意两个端口,与你想要为应用程序提供的端口相同。在应用程序配置文件中有两种方法可以实现这一点:
"ports": [
0, 0
],
或者
"portDefinitions": [
{"port": 0}, {"port": 0}
],
通过这样做,Marathon将从可用端口范围中保留两个端口,并将它们分配给环境变量
PORT1
和
PORT2
。然后,在您的
Dockerfile
中直接调用它们非常容易:
CMD ./launch.sh --listen-on $PORT1 --monitor-on $PORT2
或者在您的Marathon配置中的cmd
定义中:
"cmd": "./launch.sh --listen-on $PORT1 --monitor-on $PORT2"
使用服务端口
假设您在多台主机上运行应用程序(运行多个实例),并且希望能够连接到特定端口上任何主机上的应用程序。这就是服务端口发挥作用的时候。
通过在配置文件中编写:
"ports": [
3000, 3001
],
或者:
"portDefinitions": [
{"port": 3000}, {"port": 3001}
],
马拉松仍然会在主机上分配随机端口,仍然会将它们分配给环境变量PORT1
和PORT2
,并且还会为您保留3000和3001端口供您使用。
由您决定使用服务发现机制将流量从这些服务端口路由到$PORT1
和$PORT2
。
您可以使服务端口等于主机端口(例如,如果您想避免使用服务发现机制)并在不同主机上为您的应用程序使用一致的端口。您可以在端口规范后添加"requirePorts": true
来实现此目的。
这里的警告是,Marathon只能在具有这些端口的节点中调度您的应用程序。
桥接模式
用途:仅限Docker应用程序
在此配置下,指定的一些容器端口绑定到主机端口。
不使用服务端口
在此模式下,您不使用“ports”或“portDefinitions”指令,而是使用“portMappings”。通过这样做,您有效地告诉Docker将特定容器端口的流量映射到主机端口,反之亦然。
您可以通过指定以下内容将容器端口映射到主机端口:
"portMappings": [
{ "containerPort": 80, "hostPort": 0, "protocol": "tcp"},
{ "containerPort": 443, "hostPort": 0, "protocol": "tcp"}
]
在这种情况下:
- 将
hostPort
设置为0会使它再次从可用端口范围中选择一个随机端口。同样,这些端口分别分配给
PORT1
和
PORT2
环境变量。
- 将
containerPort
设置为0将使其等于
hostPort
。
使用服务端口
与之前一样,您可以通过在配置中指定它们来启用服务端口,这样它们将在主机之间保持一致:
"portMappings": [
{ "containerPort": 80, "hostPort": 0, "protocol": "tcp", "servicePort": 3000},
{ "containerPort": 443, "hostPort": 0, "protocol": "tcp", "servicePort": 3001}
]
再次提醒您,需使用服务发现机制将流量路由到这些服务端口的$PORT1
和$PORT2
。
更多信息请参见:
Marathon 端口:
https://mesosphere.github.io/marathon/docs/ports.html
Docker 主机模式:
http://www.dasblinkenlichten.com/docker-networking-101-host-mode/
Docker 桥接模式:
http://www.dasblinkenlichten.com/docker-networking-101/