{"action":"created","comment":{"url":"https://api.github.com/repos/docker/docker/pulls/comments/43699934","id":43699934,"diff_hunk":"@@ -0,0 +1,190 @@\n+<!--[metadata]>\n++++\n+title = \"OverlayFS storage in practice\"\n+description = \"Learn how to optimize your use of OverlayFS driver.\"\n+keywords = [\"container, storage, driver, OverlayFS \"]\n+[menu.main]\n+parent = \"mn_storage_docker\"\n++++\n+<![end-metadata]-->\n+\n+# Docker and OverlayFS in practice\n+\n+OverlayFS is a modern *union filesystem* that is similar to AUFS. In comparison to AUFS, OverlayFS:\n+\n+* has a simpler design\n+* has been in the mainline Linux kernel since version 3.18\n+* is potentially faster\n+\n+As a result, OverlayFS is rapidly gaining popularity in the Docker community and is seen by many as a natural successor to AUFS. As promising as OverlayFS is, it is still relatively young. Therefore caution should be taken before using it in production Docker environments.\n+\n+Docker's `overlay` storage driver leverages several OverlayFS features to build and manage the on-disk structures of images and containers.\n+\n+**Note**: Since it was merged into the mainline kernel, the OverlayFS *kernel module* was renamed from \"overlayfs\" to \"overlay\". As a result you may see the two terms used interchangeably in some documentation. However, this document uses  \"OverlayFS\" to refer to the overall filesystem, and `overlay` to refer to Docker's storage-driver.\n+\n+\n+## Image layering and sharing with OverlayFS\n+\n+OverlayFS takes two directories on a single Linux host, layers one on top of the other, and provides a single unified view. These directories are often referred to as *layers* and the technology used to layer them is is known as a *union mount*. The OverlayFS terminology is \"lowerdir\" for the bottom layer and \"upperdir\" for the top layer. The unified view is exposed through it's own directory called \"merged\".\n+\n+The diagram below shows how a Docker image and a Docker container are layered. The image layer is the \"lowerdir\" and the container layer is the \"upperdir\". The unified view is exposed through a directory called \"merged\" which is effectively the containers mount point. The diagram shows how Docker constructs map to OverlayFS constructs.\n+\n+![](images/overlay_constructs.jpg)\n+\n+Notice how the image layer and container layer can contain the same files. When this happens, the files in the container layer (\"upperdir\") are dominant and obscure the existence of the same files in the image layer (\"lowerdir\"). The container mount (\"merged\") presents the unified view.\n+\n+OverlayFS only works with two layers. This means that multi-layered images cannot be implemented as multiple OverlayFS layers. Instead, each image layer is implemented as its own directory under `/var/lib/docker/overlay`. Hard links are then used as a space-efficient way to reference data shared with lower layers. The diagram below shows a four-layer image and how it is represented in the Docker host's filesystem.\n+\n+![](images/overlay_constructs2.jpg)\n+\n+To create a container, the `overlay` driver combines the directory representing the image's top layer plus a new directory for the container. The image's top layer is the \"lowerdir\" in the overlay and read-only. The new directory for the container is the \"upperdir\" and is writable.\n+\n+## Example: Image and container on-disk constructs\n+\n+The following `docker images -a` command shows a Docker host with a single image. As can be seen, the image consists of four layers.\n+\n+    $ docker images -a\n+    REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE\n+    ubuntu              latest              1d073211c498        7 days ago          187.9 MB\n+    <none>              <none>              5a4526e952f0        7 days ago          187.9 MB\n+    <none>              <none>              99fcaefe76ef        7 days ago          187.9 MB\n+    <none>              <none>              c63fb41c2213        7 days ago          187.7 MB\n+\n+Below, the command's output illustrates that each of the four image layers has it's own directory under `/var/lib/docker/overlay/`.\n+\n+    $ ls -l /var/lib/docker/overlay/\n+    total 24\n+    drwx------ 3 root root 4096 Oct 28 11:02 1d073211c498fd5022699b46a936b4e4bdacb04f637ad64d3475f558783f5c3e\n+    drwx------ 3 root root 4096 Oct 28 11:02 5a4526e952f0aa24f3fcc1b6971f7744eb5465d572a48d47c492cb6bbf9cbcda\n+    drwx------ 5 root root 4096 Oct 28 11:06 99fcaefe76ef1aa4077b90a413af57fd17d19dce4e50d7964a273aae67055235\n+    drwx------ 3 root root 4096 Oct 28 11:01 c63fb41c2213f511f12f294dd729b9903a64d88f098c20d2350905ac1fdbcbba\n+\n+Each directory is named after the image layer IDs in the previous `docker images -a` command. The image layer directories contain the files unique to that layer as well as hard links to the data that is shared with lower layers. This allows for efficient use of disk space.\n+\n+The following `docker ps` command shows the same Docker host running a single container. The container ID is \"73de7176c223\".\n+\n+    $ docker ps\n+    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES\n+    73de7176c223        ubuntu              \"bash\"              2 days ago          Up 2 days                               stupefied_nobel\n+\n+This container exists on-disk in the Docker host's filesystem under `/var/lib/docker/overlay/73de7176c223...`.  If you inspect this directory using the `ls -l` command you find the following file and directories.\n+\n+    $ ls -l /var/lib/docker/overlay/73de7176c223a6c82fd46c48c5f152f2c8a7e49ecb795a7197c3bb795c4d879e\n+    total 16\n+    -rw-r--r-- 1 root root   64 Oct 28 11:06 lower-id\n+    drwxr-xr-x 1 root root 4096 Oct 28 11:06 merged\n+    drwxr-xr-x 4 root root 4096 Oct 28 11:06 upper\n+    drwx------ 3 root root 4096 Oct 28 11:06 work\n+\n+These four filesystem objects are all artifacts of OverlayFS. The \"lower-id\" file contains the ID of the top layer of the image the container is based on. This is used by OverlayFS as the \"lowerdir\".\n+\n+    $ cat /var/lib/docker/overlay/73de7176c223a6c82fd46c48c5f152f2c8a7e49ecb795a7197c3bb795c4d879e/lower-id\n+    1d073211c498fd5022699b46a936b4e4bdacb04f637ad64d3475f558783f5c3e\n+\n+The \"upper\" directory is the containers read-write layer. Any changes made to the container are written to this directory.\n+\n+The \"merged\" directory is effectively the containers mount point. This is where the unified view of the image (\"lowerdir\") and container (\"upperdir\") is exposed. Any changes written to the container are immediately reflected in this directory.\n+\n+The \"work\" directory is required for OverlayFS to function. It is used for things such as *copy_up* operations.\n+\n+You can verify all of these constructs from the output of the `mount` command. (Ellipses and line breaks are used in the output below to enhance readability.)\n+\n+    $ mount | grep overlay\n+    overlay on /var/lib/docker/overlay/73de7176c223.../merged\n+    type overlay (rw,relatime,lowerdir=/var/lib/docker/overlay/1d073211c498.../root,\n+    upperdir=/var/lib/docker/overlay/73de7176c223.../upper,\n+    workdir=/var/lib/docker/overlay/73de7176c223.../work)\n+\n+The output reflects the overlay is mounted as read-write (\"rw\").\n+\n+## Container reads and writes with overlay\n+\n+Consider three scenarios where a container opens a file for read access with overlay.\n+\n+- **The file does not exist in the container layer**. If a container opens a file for read access and the file does not already exist in the container (\"upperdir\") it is read from the image (\"lowerdir\"). This should incur very little performance overhead.\n+\n+- **The file only exists in the container layer**. If a container opens a file for read access and the file exists in the container (\"upperdir\") and not in the image (\"lowerdir\"), it is read directly from the container.\n+\n+- **The file exists in the container layer and the image layer**. If a container opens a file for read access and the file exists in the image layer and the container layer, the file's version in the container layer is read. This is because files in the container layer (\"upperdir\") obscure files with the same name in the image layer (\"lowerdir\").\n+\n+Consider some scenarios where files in a container are modified.\n+\n+- **Writing to a file for the first time**. The first time a container writes to an existing file, that file does not exist in the container (\"upperdir\"). The `overlay` driver performs a *copy_up* operation to copy the file from the image (\"lowerdir\") to the container (\"upperdir\"). The container then writes the changes to the new copy of the file in the container layer.\n+\n+    However, OverlayFS works at the file level not the block level. This means that all OverlayFS copy-up operations copy entire files, even if the file is very large and only a small part of it is being modified. This can have a noticeable impact on container write performance. However, two things are worth noting:\n+\n+    * The copy_up operation only occurs the first time any given file is written to. Subsequent writes to the same file will operate against the copy of the file already copied up to the container.\n+\n+    * OverlayFS only works with two layers. This means that performance should be better than AUFS which can suffer noticeable latencies when searching for files in images with many layers.\n+\n+- **Deleting files and directories**. When files are deleted within a container a *whiteout* file is created in the containers \"upperdir\". The version of the file in the image layer (\"lowerdir\") is not deleted. However, the whiteout file in the container obscures it.\n+\n+    Deleting a directory in a container results in *opaque directory* being created in the \"upperdir\". This has the same effect as a whiteout file and effectively masks the existence of the directory in the image's \"lowerdir\".\n+\n+## Configure Docker with the overlay storage driver\n+\n+To configure Docker to use the overlay storage driver your Docker host must be running version 3.18 of the Linux kernel (preferably newer) with the overlay kernel module loaded.  OverlayFS can operate on top of most supported Linux filesystems. However, ext4 is currently recommended for use in production environments.\n+\n+The following procedure shows you how to configure your Docker host to use OverlayFS. The procedure assumes that the Docker daemon is in a stopped state.\n+\n+> **Caution:** If you have already run the Docker daemon on your Docker host and have images you want to keep, `push` them Docker Hub or your private Docker Trusted Registry perform attempting this procedure.","path":"docs/userguide/storagedriver/overlayfs-driver.md","position":130,"original_position":130,"commit_id":"3a105114b696be36aac92f5e403293f4ade33238","original_commit_id":"3a105114b696be36aac92f5e403293f4ade33238","user":{"login":"thaJeztah","id":1804568,"avatar_url":"https://avatars.githubusercontent.com/u/1804568?v=3","gravatar_id":"","url":"https://api.github.com/users/thaJeztah","html_url":"https://github.com/thaJeztah","followers_url":"https://api.github.com/users/thaJeztah/followers","following_url":"https://api.github.com/users/thaJeztah/following{/other_user}","gists_url":"https://api.github.com/users/thaJeztah/gists{/gist_id}","starred_url":"https://api.github.com/users/thaJeztah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thaJeztah/subscriptions","organizations_url":"https://api.github.com/users/thaJeztah/orgs","repos_url":"https://api.github.com/users/thaJeztah/repos","events_url":"https://api.github.com/users/thaJeztah/events{/privacy}","received_events_url":"https://api.github.com/users/thaJeztah/received_events","type":"User","site_admin":false},"body":"*to* Docker Hub\r\n\r\nperform attempting this procedure. -> before attempting this procedure?","created_at":"2015-11-02T23:38:48Z","updated_at":"2015-11-02T23:38:48Z","html_url":"https://github.com/docker/docker/pull/17486#discussion_r43699934","pull_request_url":"https://api.github.com/repos/docker/docker/pulls/17486","_links":{"self":{"href":"https://api.github.com/repos/docker/docker/pulls/comments/43699934"},"html":{"href":"https://github.com/docker/docker/pull/17486#discussion_r43699934"},"pull_request":{"href":"https://api.github.com/repos/docker/docker/pulls/17486"}}},"pull_request":{"url":"https://api.github.com/repos/docker/docker/pulls/17486","id":49145097,"html_url":"https://github.com/docker/docker/pull/17486","diff_url":"https://github.com/docker/docker/pull/17486.diff","patch_url":"https://github.com/docker/docker/pull/17486.patch","issue_url":"https://api.github.com/repos/docker/docker/issues/17486","number":17486,"state":"open","locked":false,"title":"Improved Storage Driver Documentation","user":{"login":"moxiegirl","id":1347209,"avatar_url":"https://avatars.githubusercontent.com/u/1347209?v=3","gravatar_id":"","url":"https://api.github.com/users/moxiegirl","html_url":"https://github.com/moxiegirl","followers_url":"https://api.github.com/users/moxiegirl/followers","following_url":"https://api.github.com/users/moxiegirl/following{/other_user}","gists_url":"https://api.github.com/users/moxiegirl/gists{/gist_id}","starred_url":"https://api.github.com/users/moxiegirl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/moxiegirl/subscriptions","organizations_url":"https://api.github.com/users/moxiegirl/orgs","repos_url":"https://api.github.com/users/moxiegirl/repos","events_url":"https://api.github.com/users/moxiegirl/events{/privacy}","received_events_url":"https://api.github.com/users/moxiegirl/received_events","type":"User","site_admin":false},"body":"updating after assignment for Nigel\r\nAdding in some notes from Nigel work\r\nUpdating with the storage driver content Nigel added\r\nUpdating with Nigel's polishing tech\r\nAdding in Nigel graphics\r\nFirst pass of aufs material\r\nCapturing Nigel's latest\r\nComments back to Nigel on devicemapper\r\nIncorporating Nigel's comments v3\r\nConverting images for dm\r\n\r\nSigned-off-by: Mary Anthony <mary@docker.com>","created_at":"2015-10-29T14:19:29Z","updated_at":"2015-11-02T23:38:48Z","closed_at":null,"merged_at":null,"merge_commit_sha":"fcb851f7f442aab08767f5f0019ad25a11330b07","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/docker/docker/pulls/17486/commits","review_comments_url":"https://api.github.com/repos/docker/docker/pulls/17486/comments","review_comment_url":"https://api.github.com/repos/docker/docker/pulls/comments{/number}","comments_url":"https://api.github.com/repos/docker/docker/issues/17486/comments","statuses_url":"https://api.github.com/repos/docker/docker/statuses/3a105114b696be36aac92f5e403293f4ade33238","head":{"label":"moxiegirl:16286-storage-drivers","ref":"16286-storage-drivers","sha":"3a105114b696be36aac92f5e403293f4ade33238","user":{"login":"moxiegirl","id":1347209,"avatar_url":"https://avatars.githubusercontent.com/u/1347209?v=3","gravatar_id":"","url":"https://api.github.com/users/moxiegirl","html_url":"https://github.com/moxiegirl","followers_url":"https://api.github.com/users/moxiegirl/followers","following_url":"https://api.github.com/users/moxiegirl/following{/other_user}","gists_url":"https://api.github.com/users/moxiegirl/gists{/gist_id}","starred_url":"https://api.github.com/users/moxiegirl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/moxiegirl/subscriptions","organizations_url":"https://api.github.com/users/moxiegirl/orgs","repos_url":"https://api.github.com/users/moxiegirl/repos","events_url":"https://api.github.com/users/moxiegirl/events{/privacy}","received_events_url":"https://api.github.com/users/moxiegirl/received_events","type":"User","site_admin":false},"repo":{"id":38079763,"name":"docker","full_name":"moxiegirl/docker","owner":{"login":"moxiegirl","id":1347209,"avatar_url":"https://avatars.githubusercontent.com/u/1347209?v=3","gravatar_id":"","url":"https://api.github.com/users/moxiegirl","html_url":"https://github.com/moxiegirl","followers_url":"https://api.github.com/users/moxiegirl/followers","following_url":"https://api.github.com/users/moxiegirl/following{/other_user}","gists_url":"https://api.github.com/users/moxiegirl/gists{/gist_id}","starred_url":"https://api.github.com/users/moxiegirl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/moxiegirl/subscriptions","organizations_url":"https://api.github.com/users/moxiegirl/orgs","repos_url":"https://api.github.com/users/moxiegirl/repos","events_url":"https://api.github.com/users/moxiegirl/events{/privacy}","received_events_url":"https://api.github.com/users/moxiegirl/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/moxiegirl/docker","description":"Docker - the open-source application container engine","fork":true,"url":"https://api.github.com/repos/moxiegirl/docker","forks_url":"https://api.github.com/repos/moxiegirl/docker/forks","keys_url":"https://api.github.com/repos/moxiegirl/docker/keys{/key_id}","collaborators_url":"https://api.github.com/repos/moxiegirl/docker/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/moxiegirl/docker/teams","hooks_url":"https://api.github.com/repos/moxiegirl/docker/hooks","issue_events_url":"https://api.github.com/repos/moxiegirl/docker/issues/events{/number}","events_url":"https://api.github.com/repos/moxiegirl/docker/events","assignees_url":"https://api.github.com/repos/moxiegirl/docker/assignees{/user}","branches_url":"https://api.github.com/repos/moxiegirl/docker/branches{/branch}","tags_url":"https://api.github.com/repos/moxiegirl/docker/tags","blobs_url":"https://api.github.com/repos/moxiegirl/docker/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/moxiegirl/docker/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/moxiegirl/docker/git/refs{/sha}","trees_url":"https://api.github.com/repos/moxiegirl/docker/git/trees{/sha}","statuses_url":"https://api.github.com/repos/moxiegirl/docker/statuses/{sha}","languages_url":"https://api.github.com/repos/moxiegirl/docker/languages","stargazers_url":"https://api.github.com/repos/moxiegirl/docker/stargazers","contributors_url":"https://api.github.com/repos/moxiegirl/docker/contributors","subscribers_url":"https://api.github.com/repos/moxiegirl/docker/subscribers","subscription_url":"https://api.github.com/repos/moxiegirl/docker/subscription","commits_url":"https://api.github.com/repos/moxiegirl/docker/commits{/sha}","git_commits_url":"https://api.github.com/repos/moxiegirl/docker/git/commits{/sha}","comments_url":"https://api.github.com/repos/moxiegirl/docker/comments{/number}","issue_comment_url":"https://api.github.com/repos/moxiegirl/docker/issues/comments{/number}","contents_url":"https://api.github.com/repos/moxiegirl/docker/contents/{+path}","compare_url":"https://api.github.com/repos/moxiegirl/docker/compare/{base}...{head}","merges_url":"https://api.github.com/repos/moxiegirl/docker/merges","archive_url":"https://api.github.com/repos/moxiegirl/docker/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/moxiegirl/docker/downloads","issues_url":"https://api.github.com/repos/moxiegirl/docker/issues{/number}","pulls_url":"https://api.github.com/repos/moxiegirl/docker/pulls{/number}","milestones_url":"https://api.github.com/repos/moxiegirl/docker/milestones{/number}","notifications_url":"https://api.github.com/repos/moxiegirl/docker/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/moxiegirl/docker/labels{/name}","releases_url":"https://api.github.com/repos/moxiegirl/docker/releases{/id}","created_at":"2015-06-25T23:27:51Z","updated_at":"2015-06-25T23:27:58Z","pushed_at":"2015-11-02T22:37:11Z","git_url":"git://github.com/moxiegirl/docker.git","ssh_url":"git@github.com:moxiegirl/docker.git","clone_url":"https://github.com/moxiegirl/docker.git","svn_url":"https://github.com/moxiegirl/docker","homepage":"http://www.docker.com","size":74024,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"docker:master","ref":"master","sha":"6964f4235035c5e94f6a0c35149783e910fed313","user":{"login":"docker","id":5429470,"avatar_url":"https://avatars.githubusercontent.com/u/5429470?v=3","gravatar_id":"","url":"https://api.github.com/users/docker","html_url":"https://github.com/docker","followers_url":"https://api.github.com/users/docker/followers","following_url":"https://api.github.com/users/docker/following{/other_user}","gists_url":"https://api.github.com/users/docker/gists{/gist_id}","starred_url":"https://api.github.com/users/docker/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/docker/subscriptions","organizations_url":"https://api.github.com/users/docker/orgs","repos_url":"https://api.github.com/users/docker/repos","events_url":"https://api.github.com/users/docker/events{/privacy}","received_events_url":"https://api.github.com/users/docker/received_events","type":"Organization","site_admin":false},"repo":{"id":7691631,"name":"docker","full_name":"docker/docker","owner":{"login":"docker","id":5429470,"avatar_url":"https://avatars.githubusercontent.com/u/5429470?v=3","gravatar_id":"","url":"https://api.github.com/users/docker","html_url":"https://github.com/docker","followers_url":"https://api.github.com/users/docker/followers","following_url":"https://api.github.com/users/docker/following{/other_user}","gists_url":"https://api.github.com/users/docker/gists{/gist_id}","starred_url":"https://api.github.com/users/docker/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/docker/subscriptions","organizations_url":"https://api.github.com/users/docker/orgs","repos_url":"https://api.github.com/users/docker/repos","events_url":"https://api.github.com/users/docker/events{/privacy}","received_events_url":"https://api.github.com/users/docker/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/docker/docker","description":"Docker - the open-source application container engine","fork":false,"url":"https://api.github.com/repos/docker/docker","forks_url":"https://api.github.com/repos/docker/docker/forks","keys_url":"https://api.github.com/repos/docker/docker/keys{/key_id}","collaborators_url":"https://api.github.com/repos/docker/docker/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/docker/docker/teams","hooks_url":"https://api.github.com/repos/docker/docker/hooks","issue_events_url":"https://api.github.com/repos/docker/docker/issues/events{/number}","events_url":"https://api.github.com/repos/docker/docker/events","assignees_url":"https://api.github.com/repos/docker/docker/assignees{/user}","branches_url":"https://api.github.com/repos/docker/docker/branches{/branch}","tags_url":"https://api.github.com/repos/docker/docker/tags","blobs_url":"https://api.github.com/repos/docker/docker/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/docker/docker/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/docker/docker/git/refs{/sha}","trees_url":"https://api.github.com/repos/docker/docker/git/trees{/sha}","statuses_url":"https://api.github.com/repos/docker/docker/statuses/{sha}","languages_url":"https://api.github.com/repos/docker/docker/languages","stargazers_url":"https://api.github.com/repos/docker/docker/stargazers","contributors_url":"https://api.github.com/repos/docker/docker/contributors","subscribers_url":"https://api.github.com/repos/docker/docker/subscribers","subscription_url":"https://api.github.com/repos/docker/docker/subscription","commits_url":"https://api.github.com/repos/docker/docker/commits{/sha}","git_commits_url":"https://api.github.com/repos/docker/docker/git/commits{/sha}","comments_url":"https://api.github.com/repos/docker/docker/comments{/number}","issue_comment_url":"https://api.github.com/repos/docker/docker/issues/comments{/number}","contents_url":"https://api.github.com/repos/docker/docker/contents/{+path}","compare_url":"https://api.github.com/repos/docker/docker/compare/{base}...{head}","merges_url":"https://api.github.com/repos/docker/docker/merges","archive_url":"https://api.github.com/repos/docker/docker/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/docker/docker/downloads","issues_url":"https://api.github.com/repos/docker/docker/issues{/number}","pulls_url":"https://api.github.com/repos/docker/docker/pulls{/number}","milestones_url":"https://api.github.com/repos/docker/docker/milestones{/number}","notifications_url":"https://api.github.com/repos/docker/docker/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/docker/docker/labels{/name}","releases_url":"https://api.github.com/repos/docker/docker/releases{/id}","created_at":"2013-01-18T18:10:57Z","updated_at":"2015-11-02T21:02:57Z","pushed_at":"2015-11-02T23:38:32Z","git_url":"git://github.com/docker/docker.git","ssh_url":"git@github.com:docker/docker.git","clone_url":"https://github.com/docker/docker.git","svn_url":"https://github.com/docker/docker","homepage":"http://www.docker.com","size":280818,"stargazers_count":25855,"watchers_count":25855,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":6901,"mirror_url":null,"open_issues_count":1186,"forks":6901,"open_issues":1186,"watchers":25855,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/docker/docker/pulls/17486"},"html":{"href":"https://github.com/docker/docker/pull/17486"},"issue":{"href":"https://api.github.com/repos/docker/docker/issues/17486"},"comments":{"href":"https://api.github.com/repos/docker/docker/issues/17486/comments"},"review_comments":{"href":"https://api.github.com/repos/docker/docker/pulls/17486/comments"},"review_comment":{"href":"https://api.github.com/repos/docker/docker/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/docker/docker/pulls/17486/commits"},"statuses":{"href":"https://api.github.com/repos/docker/docker/statuses/3a105114b696be36aac92f5e403293f4ade33238"}}}}