{"action":"created","comment":{"url":"https://api.github.com/repos/dcos/dcos-docs/pulls/comments/126574145","pull_request_review_id":49070225,"id":126574145,"diff_hunk":"@@ -0,0 +1,422 @@\n+---\n+post_title: Service and Pod Networking\n+menu_order: 0.5\n+---\n+\n+This document describes how to specify networking modes and assign ports in the service definition for a DC/OS Service you are creating.\n+\n+# VIPs\n+\n+We recommend using [virtual addresses (VIPs)](/docs/1.9/usage/service-discovery/virtual-ip-addresses/) to make ports management easier. VIPs map traffic from a single virtual address to multiple IP addresses and ports. They simplify inter-app communication and implement a reliable service-oriented architecture.\n+\n+# Networking Modes\n+\n+DC/OS services and pods declare `networks` the same way. Three modes of networking are supported:\n+\n+## `host` Networking\n+\n+In `host` networking, an application shares the network namespace of the Mesos agent process, typically the host network namespace.\n+\n+## `container` Networking\n+\n+In container networking, an application should be allocated its own network namespace and IP address;\n+Mesos network isolators are responsible for providing backend support for this.\n+When using the Docker containerizer, this translates to a Docker \"user\" network. You can name your container network in the `networks.container` parameter of your service definition. If you do not provide a name for your container network, it will have the default container network name, `DEFAULT NAME`.\n+\n+## `container/bridge` Networking\n+\n+Similar to `container` networking, an application should be allocated its own network namespace and IP address;\n+Mesos CNI provides a special `mesos-bridge` that application containers are attached to.\n+When using the Docker containerizer, this translates to the Docker \"default bridge\" network.\n+\n+Bridge mode networking allows you to map host ports to ports inside your containers. It is particularly useful if you are using a container image with fixed port assignments that you can't modify.\n+\n+**Note:**: The UCR and Docker Containerizer support all network modes.\n+\n+# Usage\n+\n+* A service can join one or more `container` mode networks. When joining multiple container networks, additional restrictions are imposed on *port-mapping* entries (see *Port Mappings* for details).\n+* An application can only join one `host` mode network. `host` networking is the default if your service definition does not declare a `networks` field.\n+* An application can only join one `container/bridge` network.\n+* An application cannot mix networking modes. You must specify a single `host` network, a single `container/bridge` network, or one or more `container` networks.\n+\n+# Ports for Services\n+\n+DC/OS services declare ports differently than pods. The following section is only relevant to services.\n+\n+## Terminology\n+\n+### Port Types\n+\n+#### *container-port*: Specifies a port within a container.\n+\n+`containerPort` is specified as a field of a *port-mapping* or *endpoint* when using `container` or `container/bridge` mode networking.\n+\n+#### *host-port*: Specifies a port to allocate from the resources offered by a Mesos agent.\n+\n+`hostPort` is specified as a field of a *port-mapping* or *endpoint* when using `container` or `container/bridge` mode networking. `port` is specified as a field of a *port-definition* when using `host` mode networking.\n+\n+**Note:** Only host ports are made available to a task through environment variables.\n+\n+#### *service-port*: You can assign one or more service ports to a DC/OS service when you create it.\n+\n+You can specify any valid port number as a service port or you can use `0` to indicate that Marathon should allocate free service ports to your service automatically.\n+\n+If you choose your own service port, you must ensure that it is unique across all of your applications.\n+See [the port definition section](#port-definition) for more information.\n+\n+**Note:** Pods (endpoints) do not support service ports.\n+\n+### Declaring ports in an application\n+\n+#### *endpoint*\n+\n+Endpoints are declared only by the containers of a Pod. See the [pods](/docs/1.9/deploying-services/pods/) documentation.\n+\n+#### *port-definition*\n+\n+Port definitions are used only with `host` mode networking.\n+A *port-definition* (specifically its `port` field) is interpreted through the lens of the `requirePorts` parameter:\n+\n+- When `requirePorts` is `false` (default), a port-definition's `port` is considered the *service-port* and a *host-port* is dynamically chosen by Marathon.\n+- When `requirePorts` is `true`, a port-definition's `port` is considered both a *host-port* and *service-port*.\n+- The special `port` value of `0` tells Marathon to select any *host-port* from a Mesos resource offer and any *service-port* from the configured service port range.\n+\n+#### *port-mapping*\n+\n+A *port-mapping* declares a *container-port* for a service, possibly linking that *container-port* to a *host-port* and *service-port*.\n+\n+Marathon communicates *container-port*/*host-port* links (\"mappings\") to Mesos when launching instances of the application. Port-mappings are used with both `container` and `container/bridge` networking. Marathon ignores the value of `requirePorts` when interpreting a *port-mapping*.\n+\n+* The special `containerPort` value of `0` tells Marathon to internally assign the (eventually) allocated *host-port* to `containerPort`.\n+* The special `hostPort` value of `0` tells Marathon to select any *host-port* from a Mesos resource offer.\n+* The special `servicePort` value of `0` tells Marathon to select any *service-port* from the configured *service-port* range.\n+\n+## Port Definitions\n+You can specify the ports that are available through the `portDefinitions` array.\n+\n+By default, `requirePorts` is set to false. This means that you need to use a service discovery solution such as HAProxy to proxy requests from service ports to host ports. If you don't use a service discovery solution to proxy requests from service ports to host ports, you can set `requirePorts` to `true`. This will tell Marathon to only schedule the service on agents that have these ports available.\n+\n+You can specify a `protocol`, a `name`, and `labels` for each definition in the `portDefinitions` array. When starting new tasks, Marathon will pass this metadata to Mesos. Mesos will expose this information in the `discovery` field of the task. Custom network discovery solutions can consume this field.\n+\n+### Summary\n+\n+* Review *port-definition*, *host-port*, and *service-port* in [Terminology][#Terminology].\n+* Location in service definition: `{ \"portDefinitions\": [ <port-definition>... ], \"requirePorts\": <bool>, ... }`\n+* Used in conjunction with `host` mode networking.\n+* `requirePorts` applies to `portDefinitions`.\n+* If no `portDefinitions` are defined (or defined as `null`) at create time, default to `{ \"portDefinitions\": [ { \"port\": 0, \"name\": \"default\" } ], ... }`\n+    * Specify an empty array (`[]`) to indicate NO ports are used by the service; no default is injected in this case.\n+* Ignored when used in conjunction with other networking modes.\n+    * NOTE: Future versions of Marathon may fail to validate apps that declare `portDefinitions` with network modes other than `host`.\n+\n+## Port Mappings\n+\n+### Summary:\n+\n+* Review *port-mapping*, *container-port*, and *host-port* in (Terminology)[#Terminology].\n+* Location in service definition: `{ \"container\": { \"portMappings\": [ <port-mapping>... ], ... }, ... }`\n+* Used in conjunction with `container` and `container/bridge` mode networking.\n+* When using `container/bridge` mode networking, an unspecified (`null`) value for `hostPort` is translated to `\"hostPort\": 0`.\n+* `requirePorts` does not apply to `portMappings`.\n+* If unspecified (`null`) at create-time, defaults to `{ \"portMappings\": [ { \"containerPort\": 0, \"name\": \"default\" } ], ... }`\n+    * Specify an empty array (`[]`) to indicate NO ports are used by the service; no default is injected in this case.\n+    * **NOTE:** When using `container/bridge` mode, the default *port-mapping* also sets `\"hostPort: 0\"`.\n+* Ignored when used in conjunction with other networking modes.\n+    * **NOTE:** Future versions of Marathon may fail to validate services that declare `container.portMappings` with network modes other than `container` or `container/bridge`.\n+* When used in conjunction with multiple container networks, each mapping entry that specifies a `hostPort` must also declare a `networkNames` value with a single item, identifying the network for which the mapping applies (a single `hostPort` may be mapped to only one container network, and `networkNames` defaults to all container networks for a pod or service).\n+\n+## Referencing Ports\n+\n+Once you have created your port mappings, you can reference the `host-port`s in a Dockerfile as follows:\n+\n+```bash\n+CMD ./my-app --http-port=$PORT_HTTP --https-port=$PORT_HTTPS --monitoring-port=$PORT_MON\n+```\n+\n+Alternatively, if you are not using Docker, or had specified a `cmd` in your service definition, it works in the same way:\n+\n+```json\n+\"cmd\": \"./my-app --http-port=$PORT_HTTP --https-port=$PORT_HTTPS --monitoring-port=$PORT_MON\"\n+```\n+\n+# Downward API\n+\n+## Per-Task Environment Variables\n+\n+If a port is named `NAME`, it will be accessible via the environment variable `$PORT_NAME`.\n+\n+Every *host-port* value is also exposed to the running service instance via environment variables `$PORT0`, `$PORT1`, etc.\n+\n+Each DC/OS service is given a single port by default, so `$PORT0` will normally be available, except for services that specifically declare \"no ports\".\n+\n+Variables are generated for all services, regardless of whether the service uses the [UCR or Docker containerizer](/docs/1.9/deploying-services/containerizers/).\n+\n+It is **highly recommended** to name the ports of a service to provide clarity with respect to the service configuration and intended use of each port.\n+\n+When using `container` or `container/bridge` mode networking, you must bind your application to the `containerPort`s you have specified in your `portMapping`s.\n+\n+If you have set `containerPort` to `0`, this will be the same as `hostPort` and you can use the `$PORTxxx` environment variables.\n+\n+## Discovery Via Mesos\n+\n+### `DiscoveryInfo` and port `labels`\n+\n+* `labels` may be defined for items of `portDefinitions` as well as for items of `portMappings`. These labels are sent to Mesos via `DiscoveryInfo` protobufs at instance-launch time.\n+* Given a mapping or endpoint, Marathon generates a port `DiscoveryInfo` for every combination of specified protocols and associated networks. For instance, if an `Endpoint` specifies 2 protocols and is associated with 3 container networks, then a total of 6 `DiscoveryInfo` protobufs would be generated for that single `Endpoint`.\n+* Marathon injects a `network-scope` label into the port `DiscoveryInfo` to disambiguate between a *host-port* and *container-port*.\n+    * A scope value of `host` is used for *host-port* discovery.\n+    * A scope value of `container` is used for *container-port* discovery.\n+* For *container-port* discovery, Marathon also injects a `network-name` label into the respective port `DiscoveryInfo`.\n+\n+### Virtual addresses\n+\n+See the documentation for [virtual addresses (VIPs)](/docs/1.9/networking/load-balancing-vips/virtual-ip-addresses/).\n+\n+# Examples\n+\n+## `host` Mode\n+\n+`host` mode networking is the default networking mode for all services. If your service uses Docker containers, it not necessary to `EXPOSE` ports in your `Dockerfile`.\n+\n+### Using `host` Mode\n+\n+Host mode is enabled by default for all services and all container types.\n+If you wish to be explicit, you can also specify it manually in the `networks` property:\n+\n+```json\n+  \"networks\": [ { \"mode\": \"host\" } ],\n+  \"container\": {\n+    \"type\": \"MESOS\",\n+    \"docker\": {\n+      \"image\": \"my-image:1.0\"\n+    }\n+  },\n+```\n+\n+### Specifying Ports\n+\n+You can specify the ports that are available through the `portDefinitions` array:\n+\n+```json\n+    \"portDefinitions\": [\n+      {\"port\": 0, \"name\": \"http\"}, {\"port\": 0, \"name\": \"https\"}, {\"port\": 0, \"name\": \"mon\"}\n+    ],\n+```\n+\n+In this example, we specify three dynamically assigned host ports, which would then be available to our command via the environment variables `$PORT_HTTP`, `$PORT_HTTPS` and `$PORT_MON`.\n+\n+Marathon will also associate three dynamically selected service ports with these three host ports.\n+\n+You can also specify specific service ports:\n+\n+```json\n+    \"portDefinitions\": [\n+        {\"port\": 2001, \"name\": \"http\"}, {\"port\": 2002, \"name\": \"https\"}, {\"port\": 3000, \"name\": \"mon\"}\n+    ],\n+```\n+\n+In this case, host ports `$PORT_HTTP`, `$PORT_HTTPS`, and `$PORT_MON` remain dynamically assigned.\n+However, the three service ports for this application are now `2001`, `2002` and `3000`.\n+\n+In this example, as with the previous one, it is necessary to use a service discovery solution such as HAProxy to proxy requests from service ports to host ports.\n+\n+If you want your service's service ports to be equal to its host ports, you can set `requirePorts` to `true` (`requirePorts` is `false` by default). This will tell Marathon to only schedule the service on agents that have these ports available. You may wish to do this if you don't use a service discovery solution to proxy requests from service ports to host ports.\n+\n+```json\n+    \"portDefinitions\": [\n+        {\"port\": 2001, \"name\": \"http\"}, {\"port\": 2002, \"name\": \"https\"}, {\"port\": 3000, \"name\": \"mon\"}\n+    ],\n+    \"requirePorts\" : true\n+```\n+\n+The service and host ports (including the environment variables `$PORT_HTTP`, `$PORT_HTTPS`, and `$PORT_MON`), are both now `2001`, `2002` and `3000`.\n+\n+Each *port-definition* in a `portDefinitions` array allows you to specify a `protocol`, a `name`, and `labels` for each definition. When starting new tasks, Marathon will pass this metadata to Mesos. Mesos will expose this information in the `discovery` field of the task. Custom network discovery solutions can consume this field.\n+\n+Example *port-definition* requesting a dynamic `tcp` port named `http` with the label `VIP_0` set to `10.0.0.1:80`:\n+\n+```json\n+    \"portDefinitions\": [\n+        {\n+            \"port\": 0,\n+            \"protocol\": \"tcp\",\n+            \"name\": \"http\",\n+            \"labels\": {\"VIP_0\": \"10.0.0.1:80\"}\n+        }\n+    ],\n+```\n+\n+The `port` field is mandatory.\n+The `protocol`, `name`, and `labels` fields are optional.\n+\n+### Referencing Ports\n+\n+You can reference the *host-port*s in the Dockerfile for our fictitious app as follows:\n+\n+```bash\n+CMD ./my-app --http-port=$PORT_HTTP --https-port=$PORT_HTTPS --monitoring-port=$PORT_MON\n+```\n+\n+Alternatively, if you are not using Docker, or had specified a `cmd` in your service definition, it works in the same way:\n+\n+```json\n+\"cmd\": \"./my-app --http-port=$PORT_HTTP --https-port=$PORT_HTTPS --monitoring-port=$PORT_MON\"\n+```\n+\n+## `container` and `container/bridge` Mode\n+\n+Bridge mode networking allows you to map host ports to ports inside your containers.\n+It is particularly useful if you are using a container image with fixed port assignments that you can't modify.\n+**Note:** It is not necessary to `EXPOSE` ports in your Dockerfile when using Docker container images.\n+\n+### Enabling `container/bridge` Mode\n+\n+Specify `container/bridge` mode through the `networks` property:\n+\n+```json\n+  \"networks\": [ { \"mode\": \"container/bridge\" } ],\n+  \"container\": {\n+    \"type\": \"MESOS\",\n+    \"docker\": {\n+      \"image\": \"my-image:1.0\"\n+    }\n+  },\n+```\n+\n+### Enabling `container` Mode\n+\n+Specify `container` mode through the `network` property:\n+\n+```json\n+  \"networks\": [ { \"mode\": \"container\", \"name\": \"someUserNetwork\" } ],\n+  \"container\": {\n+    \"type\": \"MESOS\",\n+    \"docker\": {\n+      \"image\": \"my-image:1.0\"\n+    }\n+  }\n+```\n+\n+If there is a `--default_network_name` configured for Marathon, then specifying a network name for the `container` network is optional:\n+`container` networks with an unspecified (`null`) `name` will inherit the value of the `--default_network_name` flag.\n+","path":"1.9/networking/service-and-pod-networking.md","position":303,"original_position":303,"commit_id":"8dee1ebe6f88f7b2cd7bd4ffe048a9044e61ba74","original_commit_id":"8dee1ebe6f88f7b2cd7bd4ffe048a9044e61ba74","user":{"login":"jdef","id":2348332,"avatar_url":"https://avatars0.githubusercontent.com/u/2348332?v=3","gravatar_id":"","url":"https://api.github.com/users/jdef","html_url":"https://github.com/jdef","followers_url":"https://api.github.com/users/jdef/followers","following_url":"https://api.github.com/users/jdef/following{/other_user}","gists_url":"https://api.github.com/users/jdef/gists{/gist_id}","starred_url":"https://api.github.com/users/jdef/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jdef/subscriptions","organizations_url":"https://api.github.com/users/jdef/orgs","repos_url":"https://api.github.com/users/jdef/repos","events_url":"https://api.github.com/users/jdef/events{/privacy}","received_events_url":"https://api.github.com/users/jdef/received_events","type":"User","site_admin":false},"body":"There's a DCOS configuration for controlling the value of this root Marathon command line flag.\r\n\r\nIt's called `dcos_overlay_network_default_name` as per:\r\nhttps://github.com/dcos/dcos/blob/ca564b4b90f069b6336cd445e36e9b83ddbabd6c/gen/calc.py#L943\r\n\r\n(pretty sure we added this back in 1.9)","created_at":"2017-07-11T01:13:08Z","updated_at":"2017-07-11T01:16:35Z","html_url":"https://github.com/dcos/dcos-docs/pull/1066#discussion_r126574145","pull_request_url":"https://api.github.com/repos/dcos/dcos-docs/pulls/1066","_links":{"self":{"href":"https://api.github.com/repos/dcos/dcos-docs/pulls/comments/126574145"},"html":{"href":"https://github.com/dcos/dcos-docs/pull/1066#discussion_r126574145"},"pull_request":{"href":"https://api.github.com/repos/dcos/dcos-docs/pulls/1066"}}},"pull_request":{"url":"https://api.github.com/repos/dcos/dcos-docs/pulls/1066","id":121484923,"html_url":"https://github.com/dcos/dcos-docs/pull/1066","diff_url":"https://github.com/dcos/dcos-docs/pull/1066.diff","patch_url":"https://github.com/dcos/dcos-docs/pull/1066.patch","issue_url":"https://api.github.com/repos/dcos/dcos-docs/issues/1066","number":1066,"state":"open","locked":false,"title":"Porting Marathon Networking Doc to DC/OS","user":{"login":"sascala","id":13338969,"avatar_url":"https://avatars1.githubusercontent.com/u/13338969?v=3","gravatar_id":"","url":"https://api.github.com/users/sascala","html_url":"https://github.com/sascala","followers_url":"https://api.github.com/users/sascala/followers","following_url":"https://api.github.com/users/sascala/following{/other_user}","gists_url":"https://api.github.com/users/sascala/gists{/gist_id}","starred_url":"https://api.github.com/users/sascala/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sascala/subscriptions","organizations_url":"https://api.github.com/users/sascala/orgs","repos_url":"https://api.github.com/users/sascala/repos","events_url":"https://api.github.com/users/sascala/events{/privacy}","received_events_url":"https://api.github.com/users/sascala/received_events","type":"User","site_admin":false},"body":"## Description\r\n@jdef I'm assigning this to you because it's related to the Marathon networking doc you authored. I'm porting it over to the DC/OS site and I have some related questions. I also moved some information from the examples section up into the reference section because it seemed pretty important.\r\n\r\n## Urgency\r\n- [ ] Blocker <!-- Ping @sascala or @joel-hamill for review -->\r\n- [ ] High\r\n- [ ] Medium\r\n\r\n## Requirements\r\n- Test all commands and procedures.\r\n- Build content [locally](https://github.com/dcos/dcos-docs#test-local) and test for formatting/links.\r\n- Add redirects to [dcos-website/redirect-files](https://github.com/dcos/dcos-website#managing-redirects).\r\n- Change all affected versions (e.g. 1.7, 1.8, and 1.9).\r\n- See the [contribution guidelines](https://github.com/dcos/dcos-docs#contributing).","created_at":"2017-05-19T11:57:29Z","updated_at":"2017-07-11T01:16:35Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3a67072ac512fcce9546a40fe2139cd1053198d9","assignee":{"login":"sascala","id":13338969,"avatar_url":"https://avatars1.githubusercontent.com/u/13338969?v=3","gravatar_id":"","url":"https://api.github.com/users/sascala","html_url":"https://github.com/sascala","followers_url":"https://api.github.com/users/sascala/followers","following_url":"https://api.github.com/users/sascala/following{/other_user}","gists_url":"https://api.github.com/users/sascala/gists{/gist_id}","starred_url":"https://api.github.com/users/sascala/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sascala/subscriptions","organizations_url":"https://api.github.com/users/sascala/orgs","repos_url":"https://api.github.com/users/sascala/repos","events_url":"https://api.github.com/users/sascala/events{/privacy}","received_events_url":"https://api.github.com/users/sascala/received_events","type":"User","site_admin":false},"assignees":[{"login":"sascala","id":13338969,"avatar_url":"https://avatars1.githubusercontent.com/u/13338969?v=3","gravatar_id":"","url":"https://api.github.com/users/sascala","html_url":"https://github.com/sascala","followers_url":"https://api.github.com/users/sascala/followers","following_url":"https://api.github.com/users/sascala/following{/other_user}","gists_url":"https://api.github.com/users/sascala/gists{/gist_id}","starred_url":"https://api.github.com/users/sascala/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sascala/subscriptions","organizations_url":"https://api.github.com/users/sascala/orgs","repos_url":"https://api.github.com/users/sascala/repos","events_url":"https://api.github.com/users/sascala/events{/privacy}","received_events_url":"https://api.github.com/users/sascala/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/dcos/dcos-docs/pulls/1066/commits","review_comments_url":"https://api.github.com/repos/dcos/dcos-docs/pulls/1066/comments","review_comment_url":"https://api.github.com/repos/dcos/dcos-docs/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dcos/dcos-docs/issues/1066/comments","statuses_url":"https://api.github.com/repos/dcos/dcos-docs/statuses/8dee1ebe6f88f7b2cd7bd4ffe048a9044e61ba74","head":{"label":"dcos:ss/add-marathon-networking","ref":"ss/add-marathon-networking","sha":"8dee1ebe6f88f7b2cd7bd4ffe048a9044e61ba74","user":{"login":"dcos","id":17648048,"avatar_url":"https://avatars2.githubusercontent.com/u/17648048?v=3","gravatar_id":"","url":"https://api.github.com/users/dcos","html_url":"https://github.com/dcos","followers_url":"https://api.github.com/users/dcos/followers","following_url":"https://api.github.com/users/dcos/following{/other_user}","gists_url":"https://api.github.com/users/dcos/gists{/gist_id}","starred_url":"https://api.github.com/users/dcos/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dcos/subscriptions","organizations_url":"https://api.github.com/users/dcos/orgs","repos_url":"https://api.github.com/users/dcos/repos","events_url":"https://api.github.com/users/dcos/events{/privacy}","received_events_url":"https://api.github.com/users/dcos/received_events","type":"Organization","site_admin":false},"repo":{"id":53887483,"name":"dcos-docs","full_name":"dcos/dcos-docs","owner":{"login":"dcos","id":17648048,"avatar_url":"https://avatars2.githubusercontent.com/u/17648048?v=3","gravatar_id":"","url":"https://api.github.com/users/dcos","html_url":"https://github.com/dcos","followers_url":"https://api.github.com/users/dcos/followers","following_url":"https://api.github.com/users/dcos/following{/other_user}","gists_url":"https://api.github.com/users/dcos/gists{/gist_id}","starred_url":"https://api.github.com/users/dcos/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dcos/subscriptions","organizations_url":"https://api.github.com/users/dcos/orgs","repos_url":"https://api.github.com/users/dcos/repos","events_url":"https://api.github.com/users/dcos/events{/privacy}","received_events_url":"https://api.github.com/users/dcos/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dcos/dcos-docs","description":"Documentation for DC/OS","fork":false,"url":"https://api.github.com/repos/dcos/dcos-docs","forks_url":"https://api.github.com/repos/dcos/dcos-docs/forks","keys_url":"https://api.github.com/repos/dcos/dcos-docs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dcos/dcos-docs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dcos/dcos-docs/teams","hooks_url":"https://api.github.com/repos/dcos/dcos-docs/hooks","issue_events_url":"https://api.github.com/repos/dcos/dcos-docs/issues/events{/number}","events_url":"https://api.github.com/repos/dcos/dcos-docs/events","assignees_url":"https://api.github.com/repos/dcos/dcos-docs/assignees{/user}","branches_url":"https://api.github.com/repos/dcos/dcos-docs/branches{/branch}","tags_url":"https://api.github.com/repos/dcos/dcos-docs/tags","blobs_url":"https://api.github.com/repos/dcos/dcos-docs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dcos/dcos-docs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dcos/dcos-docs/git/refs{/sha}","trees_url":"https://api.github.com/repos/dcos/dcos-docs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dcos/dcos-docs/statuses/{sha}","languages_url":"https://api.github.com/repos/dcos/dcos-docs/languages","stargazers_url":"https://api.github.com/repos/dcos/dcos-docs/stargazers","contributors_url":"https://api.github.com/repos/dcos/dcos-docs/contributors","subscribers_url":"https://api.github.com/repos/dcos/dcos-docs/subscribers","subscription_url":"https://api.github.com/repos/dcos/dcos-docs/subscription","commits_url":"https://api.github.com/repos/dcos/dcos-docs/commits{/sha}","git_commits_url":"https://api.github.com/repos/dcos/dcos-docs/git/commits{/sha}","comments_url":"https://api.github.com/repos/dcos/dcos-docs/comments{/number}","issue_comment_url":"https://api.github.com/repos/dcos/dcos-docs/issues/comments{/number}","contents_url":"https://api.github.com/repos/dcos/dcos-docs/contents/{+path}","compare_url":"https://api.github.com/repos/dcos/dcos-docs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dcos/dcos-docs/merges","archive_url":"https://api.github.com/repos/dcos/dcos-docs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dcos/dcos-docs/downloads","issues_url":"https://api.github.com/repos/dcos/dcos-docs/issues{/number}","pulls_url":"https://api.github.com/repos/dcos/dcos-docs/pulls{/number}","milestones_url":"https://api.github.com/repos/dcos/dcos-docs/milestones{/number}","notifications_url":"https://api.github.com/repos/dcos/dcos-docs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dcos/dcos-docs/labels{/name}","releases_url":"https://api.github.com/repos/dcos/dcos-docs/releases{/id}","deployments_url":"https://api.github.com/repos/dcos/dcos-docs/deployments","created_at":"2016-03-14T19:58:33Z","updated_at":"2017-06-20T03:54:36Z","pushed_at":"2017-07-10T22:54:40Z","git_url":"git://github.com/dcos/dcos-docs.git","ssh_url":"git@github.com:dcos/dcos-docs.git","clone_url":"https://github.com/dcos/dcos-docs.git","svn_url":"https://github.com/dcos/dcos-docs","homepage":"http://dcos.io","size":48578,"stargazers_count":73,"watchers_count":73,"language":"HTML","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":122,"mirror_url":null,"open_issues_count":16,"forks":122,"open_issues":16,"watchers":73,"default_branch":"master"}},"base":{"label":"dcos:master","ref":"master","sha":"95791950bae4ac67fb4826a31fa2ad48b79eb427","user":{"login":"dcos","id":17648048,"avatar_url":"https://avatars2.githubusercontent.com/u/17648048?v=3","gravatar_id":"","url":"https://api.github.com/users/dcos","html_url":"https://github.com/dcos","followers_url":"https://api.github.com/users/dcos/followers","following_url":"https://api.github.com/users/dcos/following{/other_user}","gists_url":"https://api.github.com/users/dcos/gists{/gist_id}","starred_url":"https://api.github.com/users/dcos/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dcos/subscriptions","organizations_url":"https://api.github.com/users/dcos/orgs","repos_url":"https://api.github.com/users/dcos/repos","events_url":"https://api.github.com/users/dcos/events{/privacy}","received_events_url":"https://api.github.com/users/dcos/received_events","type":"Organization","site_admin":false},"repo":{"id":53887483,"name":"dcos-docs","full_name":"dcos/dcos-docs","owner":{"login":"dcos","id":17648048,"avatar_url":"https://avatars2.githubusercontent.com/u/17648048?v=3","gravatar_id":"","url":"https://api.github.com/users/dcos","html_url":"https://github.com/dcos","followers_url":"https://api.github.com/users/dcos/followers","following_url":"https://api.github.com/users/dcos/following{/other_user}","gists_url":"https://api.github.com/users/dcos/gists{/gist_id}","starred_url":"https://api.github.com/users/dcos/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dcos/subscriptions","organizations_url":"https://api.github.com/users/dcos/orgs","repos_url":"https://api.github.com/users/dcos/repos","events_url":"https://api.github.com/users/dcos/events{/privacy}","received_events_url":"https://api.github.com/users/dcos/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dcos/dcos-docs","description":"Documentation for DC/OS","fork":false,"url":"https://api.github.com/repos/dcos/dcos-docs","forks_url":"https://api.github.com/repos/dcos/dcos-docs/forks","keys_url":"https://api.github.com/repos/dcos/dcos-docs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dcos/dcos-docs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dcos/dcos-docs/teams","hooks_url":"https://api.github.com/repos/dcos/dcos-docs/hooks","issue_events_url":"https://api.github.com/repos/dcos/dcos-docs/issues/events{/number}","events_url":"https://api.github.com/repos/dcos/dcos-docs/events","assignees_url":"https://api.github.com/repos/dcos/dcos-docs/assignees{/user}","branches_url":"https://api.github.com/repos/dcos/dcos-docs/branches{/branch}","tags_url":"https://api.github.com/repos/dcos/dcos-docs/tags","blobs_url":"https://api.github.com/repos/dcos/dcos-docs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dcos/dcos-docs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dcos/dcos-docs/git/refs{/sha}","trees_url":"https://api.github.com/repos/dcos/dcos-docs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dcos/dcos-docs/statuses/{sha}","languages_url":"https://api.github.com/repos/dcos/dcos-docs/languages","stargazers_url":"https://api.github.com/repos/dcos/dcos-docs/stargazers","contributors_url":"https://api.github.com/repos/dcos/dcos-docs/contributors","subscribers_url":"https://api.github.com/repos/dcos/dcos-docs/subscribers","subscription_url":"https://api.github.com/repos/dcos/dcos-docs/subscription","commits_url":"https://api.github.com/repos/dcos/dcos-docs/commits{/sha}","git_commits_url":"https://api.github.com/repos/dcos/dcos-docs/git/commits{/sha}","comments_url":"https://api.github.com/repos/dcos/dcos-docs/comments{/number}","issue_comment_url":"https://api.github.com/repos/dcos/dcos-docs/issues/comments{/number}","contents_url":"https://api.github.com/repos/dcos/dcos-docs/contents/{+path}","compare_url":"https://api.github.com/repos/dcos/dcos-docs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dcos/dcos-docs/merges","archive_url":"https://api.github.com/repos/dcos/dcos-docs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dcos/dcos-docs/downloads","issues_url":"https://api.github.com/repos/dcos/dcos-docs/issues{/number}","pulls_url":"https://api.github.com/repos/dcos/dcos-docs/pulls{/number}","milestones_url":"https://api.github.com/repos/dcos/dcos-docs/milestones{/number}","notifications_url":"https://api.github.com/repos/dcos/dcos-docs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dcos/dcos-docs/labels{/name}","releases_url":"https://api.github.com/repos/dcos/dcos-docs/releases{/id}","deployments_url":"https://api.github.com/repos/dcos/dcos-docs/deployments","created_at":"2016-03-14T19:58:33Z","updated_at":"2017-06-20T03:54:36Z","pushed_at":"2017-07-10T22:54:40Z","git_url":"git://github.com/dcos/dcos-docs.git","ssh_url":"git@github.com:dcos/dcos-docs.git","clone_url":"https://github.com/dcos/dcos-docs.git","svn_url":"https://github.com/dcos/dcos-docs","homepage":"http://dcos.io","size":48578,"stargazers_count":73,"watchers_count":73,"language":"HTML","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":122,"mirror_url":null,"open_issues_count":16,"forks":122,"open_issues":16,"watchers":73,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dcos/dcos-docs/pulls/1066"},"html":{"href":"https://github.com/dcos/dcos-docs/pull/1066"},"issue":{"href":"https://api.github.com/repos/dcos/dcos-docs/issues/1066"},"comments":{"href":"https://api.github.com/repos/dcos/dcos-docs/issues/1066/comments"},"review_comments":{"href":"https://api.github.com/repos/dcos/dcos-docs/pulls/1066/comments"},"review_comment":{"href":"https://api.github.com/repos/dcos/dcos-docs/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dcos/dcos-docs/pulls/1066/commits"},"statuses":{"href":"https://api.github.com/repos/dcos/dcos-docs/statuses/8dee1ebe6f88f7b2cd7bd4ffe048a9044e61ba74"}}}}
{"actor":{"display_login":"jdef"}}