为什么DCOS中的containerPort和hostPort必须相同?

时间:2018-08-22 08:14:03

标签: azure microservices mesos marathon dcos

我有一个Web应用程序,具有以下应用程序定义和DCOS,并在部署了marathon-lb的Azure云上运行。当我将以下内容添加为服务时。

{
  "id": "web",
  "container": {
    "type": "DOCKER",
    "docker": {
      "image": "myimage",
      "network": "BRIDGE",
      "portMappings": [
        { "hostPort": 5000, "containerPort": 5000, "servicePort": 0 }
      ],
      "forcePullImage":true
    }
  },
  "instances": 1,
  "cpus": 0.1,
  "mem": 614,
  "labels":{
    "HAPROXY_GROUP":"external",
    "HAPROXY_0_VHOST":"localhost",
    "HAPROXY_0_MODE":"http"
  }
}

只有保持containerPort和hostPort相同,我才能通过浏览器访问我的应用程序。

如果将hostPort更改为0,则无法访问该应用程序。 我需要将hostPort设置为0,这样我才能扩展应用程序,它将为应用程序分配免费的hostPort。 请问这里有什么问题?

1 个答案:

答案 0 :(得分:0)

hostPort等于0表示您的应用程序将盯着Mesos分配的随机端口。参见this answer

您不需要保持hostPortcontainerPort相等。 containerPort必须与正在侦听的端口应用程序匹配。 hostPort可以是任何端口(这就是为什么您应该使用0的原因)。然后,Containerizer将发送到您hostPost或从您的containertPort发送的数据包传递到容器内的public class DrDrawerListAdapter extends BaseAdapter { Activity activity; int[] imageId; private LayoutInflater inflater = null; ArrayList<String> titles; public DrDrawerListAdapter(Activity activity, ArrayList<String> titles, int[] icons){ this.titles= titles; this.activity = activity; this.imageId = icons; inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { return titles.size(); } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { Holder holder = new Holder(); View view = inflater.inflate(R.layout.dr_drawer_item, null); holder.iconView = view.findViewById(R.id.im_icon); holder.titleView = view.findViewById(R.id.tv_title); holder.titleView.setText(titles.get(position)); Glide.with(activity.getApplicationContext()).load(imageId[position]).into(holder.iconView); return view; } public class Holder{ ImageView iconView; TextView titleView; }