From 5df53c0681c2035133795e7b736bf919d517eb62 Mon Sep 17 00:00:00 2001 From: Olivier Gambier Date: Wed, 26 Aug 2015 11:08:13 -0700 Subject: [PATCH 1/3] Documentation enhancements Making metadata: - more consistent - more specific (fixed copy pasting) - refine coverage Insecure information cleanup Removing no longer used files: - mkdocs is gone - the registry diagram is not used, and is a bit silly :) Minor fixes Fixing links Recipes: - harmonized code sections style to the rest of the docs - harmonized recipe "style" - listing new recipes Enhance deploying Signed-off-by: Olivier Gambier --- contrib/apache/README.MD | 2 +- docs/apache.md | 25 +------ docs/building.md | 130 ++++++++++++++++++------------------ docs/configuration.md | 10 ++- docs/deploying.md | 56 +++++++++------- docs/help.md | 2 +- docs/images/registry.gliffy | 1 - docs/images/registry.png | Bin 24298 -> 0 bytes docs/images/registry.svg | 1 - docs/index.md | 8 +-- docs/insecure.md | 34 +++++++--- docs/introduction.md | 6 +- docs/mkdocs.yml | 18 ----- docs/nginx.md | 25 +------ docs/notifications.md | 15 ++--- docs/osx-setup-guide.md | 79 +++++++++++++--------- docs/recipes.md | 6 +- docs/spec/api.md | 8 +-- docs/spec/api.md.tmpl | 8 +-- docs/spec/auth/token.md | 6 +- docs/storagedrivers.md | 10 +-- 21 files changed, 214 insertions(+), 236 deletions(-) delete mode 100644 docs/images/registry.gliffy delete mode 100644 docs/images/registry.png delete mode 100644 docs/images/registry.svg delete mode 100644 docs/mkdocs.yml diff --git a/contrib/apache/README.MD b/contrib/apache/README.MD index f7e14b5b4..29f6bae18 100644 --- a/contrib/apache/README.MD +++ b/contrib/apache/README.MD @@ -28,7 +28,7 @@ HTTP for mirror and HTTPS for v1 & v2 ### Registry v2 - docker run -d -e SETTINGS_FLAVOR=dev -v /var/lib/axway/docker-registry/storage/hosting2-v2:/tmp -p 5002:5000 registry:2.0" + docker run -d -e SETTINGS_FLAVOR=dev -v /var/lib/axway/docker-registry/storage/hosting2-v2:/tmp -p 5002:5000 registry:2" # For Hosting mode access diff --git a/docs/apache.md b/docs/apache.md index d81409014..ae33910c0 100644 --- a/docs/apache.md +++ b/docs/apache.md @@ -1,8 +1,8 @@ @@ -211,24 +211,3 @@ Now, login with a "pull-only" user (using `testuser` and `testpassword`), then p Verify that the "pull-only" can NOT push: docker push myregistrydomain.com:5043/test - -### Docker still complains about the certificate? - -That's certainly because you are using a self-signed certificate, despite the warnings. - -If you really insist on using these, you have to trust it at the OS level. - -Usually, on Ubuntu this is done with: - - cp auth/domain.crt /usr/local/share/ca-certificates/myregistrydomain.com.crt - update-ca-certificates - -... and on RedHat with: - - cp auth/domain.crt /etc/pki/ca-trust/source/anchors/myregistrydomain.com.crt - update-ca-trust - -Now: - - * `service docker stop && service docker start` (or any other way you use to restart docker) - * `docker-compose up -d` to bring your registry up diff --git a/docs/building.md b/docs/building.md index 18c42b923..a8c45eff3 100644 --- a/docs/building.md +++ b/docs/building.md @@ -1,10 +1,32 @@ -# Build the development environment +# Building the registry source + +## Use-case + +This is useful if you intend to actively work on the registry. + +### Alternatives + +Most people should use the [official Registry docker image](https://hub.docker.com/r/library/registry/). + +People looking for advanced operational use cases might consider rolling their own image with a custom Dockerfile inheriting `FROM registry:2`. + +OSX users who want to run natively can do so following [the instructions here](osx-setup-guide.md). + +### Gotchas + +You are expected to know your way with go & git. + +If you are a casual user with no development experience, and no preliminary knowledge of go, building from source is probably not a good solution for you. + +## Build the development environment The first prerequisite of properly building distribution targets is to have a Go development environment setup. Please follow [How to Write Go Code](https://golang.org/doc/code.html) @@ -12,29 +34,23 @@ for proper setup. If done correctly, you should have a GOROOT and GOPATH set in environment. If a Go development environment is setup, one can use `go get` to install the -`registry` command from the current latest: +`registry` source code from the current latest: -```sh -go get github.com/docker/distribution/cmd/registry -``` + go get github.com/docker/distribution/cmd/registry The above will install the source repository into the `GOPATH`. Now create the directory for the registry data (this might require you to set permissions properly) -```sh -mkdir -p /var/lib/registry -``` + mkdir -p /var/lib/registry ... or alternatively `export REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/somewhere` if you want to store data into another location. The `registry` binary can then be run with the following: -``` -$ $GOPATH/bin/registry -version -$GOPATH/bin/registry github.com/docker/distribution v2.0.0-alpha.1+unknown -``` + $ $GOPATH/bin/registry -version + $GOPATH/bin/registry github.com/docker/distribution v2.0.0-alpha.1+unknown > __NOTE:__ While you do not need to use `go get` to checkout the distribution > project, for these build instructions to work, the project must be checked @@ -44,13 +60,11 @@ $GOPATH/bin/registry github.com/docker/distribution v2.0.0-alpha.1+unknown The registry can be run with the default config using the following incantation: -``` -$ $GOPATH/bin/registry $GOPATH/src/github.com/docker/distribution/cmd/registry/config-dev.yml -INFO[0000] endpoint local-5003 disabled, skipping app.id=34bbec38-a91a-494a-9a3f-b72f9010081f version=v2.0.0-alpha.1+unknown -INFO[0000] endpoint local-8083 disabled, skipping app.id=34bbec38-a91a-494a-9a3f-b72f9010081f version=v2.0.0-alpha.1+unknown -INFO[0000] listening on :5000 app.id=34bbec38-a91a-494a-9a3f-b72f9010081f version=v2.0.0-alpha.1+unknown -INFO[0000] debug server listening localhost:5001 -``` + $ $GOPATH/bin/registry $GOPATH/src/github.com/docker/distribution/cmd/registry/config-example.yml + INFO[0000] endpoint local-5003 disabled, skipping app.id=34bbec38-a91a-494a-9a3f-b72f9010081f version=v2.0.0-alpha.1+unknown + INFO[0000] endpoint local-8083 disabled, skipping app.id=34bbec38-a91a-494a-9a3f-b72f9010081f version=v2.0.0-alpha.1+unknown + INFO[0000] listening on :5000 app.id=34bbec38-a91a-494a-9a3f-b72f9010081f version=v2.0.0-alpha.1+unknown + INFO[0000] debug server listening localhost:5001 If it is working, one should see the above log messages. @@ -64,53 +78,47 @@ commands, such as `go test`, should work per package (please see A `Makefile` has been provided as a convenience to support repeatable builds. Please install the following into `GOPATH` for it to work: -``` -go get github.com/tools/godep github.com/golang/lint/golint -``` + go get github.com/tools/godep github.com/golang/lint/golint **TODO(stevvooe):** Add a `make setup` command to Makefile to run this. Have to think about how to interact with Godeps properly. Once these commands are available in the `GOPATH`, run `make` to get a full build: -``` -$ GOPATH=`godep path`:$GOPATH make -+ clean -+ fmt -+ vet -+ lint -+ build -github.com/docker/docker/vendor/src/code.google.com/p/go/src/pkg/archive/tar -github.com/Sirupsen/logrus -github.com/docker/libtrust -... -github.com/yvasiyarov/gorelic -github.com/docker/distribution/registry/handlers -github.com/docker/distribution/cmd/registry -+ test -... -ok github.com/docker/distribution/digest 7.875s -ok github.com/docker/distribution/manifest 0.028s -ok github.com/docker/distribution/notifications 17.322s -? github.com/docker/distribution/registry [no test files] -ok github.com/docker/distribution/registry/api/v2 0.101s -? github.com/docker/distribution/registry/auth [no test files] -ok github.com/docker/distribution/registry/auth/silly 0.011s -... -+ /Users/sday/go/src/github.com/docker/distribution/bin/registry -+ /Users/sday/go/src/github.com/docker/distribution/bin/registry-api-descriptor-template -+ binaries -``` + $ GOPATH=`godep path`:$GOPATH make + + clean + + fmt + + vet + + lint + + build + github.com/docker/docker/vendor/src/code.google.com/p/go/src/pkg/archive/tar + github.com/Sirupsen/logrus + github.com/docker/libtrust + ... + github.com/yvasiyarov/gorelic + github.com/docker/distribution/registry/handlers + github.com/docker/distribution/cmd/registry + + test + ... + ok github.com/docker/distribution/digest 7.875s + ok github.com/docker/distribution/manifest 0.028s + ok github.com/docker/distribution/notifications 17.322s + ? github.com/docker/distribution/registry [no test files] + ok github.com/docker/distribution/registry/api/v2 0.101s + ? github.com/docker/distribution/registry/auth [no test files] + ok github.com/docker/distribution/registry/auth/silly 0.011s + ... + + /Users/sday/go/src/github.com/docker/distribution/bin/registry + + /Users/sday/go/src/github.com/docker/distribution/bin/registry-api-descriptor-template + + binaries The above provides a repeatable build using the contents of the vendored Godeps directory. This includes formatting, vetting, linting, building, testing and generating tagged binaries. We can verify this worked by running the registry binary generated in the "./bin" directory: -```sh -$ ./bin/registry -version -./bin/registry github.com/docker/distribution v2.0.0-alpha.2-80-g16d8b2c.m -``` + $ ./bin/registry -version + ./bin/registry github.com/docker/distribution v2.0.0-alpha.2-80-g16d8b2c.m ### Developing @@ -124,9 +132,7 @@ can be demonstrated using `godep` to migrate the `GOPATH` to use the specified dependencies. The `GOPATH` can be migrated to the current package versions declared in `Godeps` with the following command: -```sh -godep restore -``` + godep restore > **WARNING:** This command will checkout versions of the code specified in > Godeps/Godeps.json, modifying the contents of `GOPATH`. If this is @@ -136,9 +142,7 @@ godep restore With a successful run of the above command, one can now use `make` without specifying the `GOPATH`: -```sh -$ make -``` + make If that is successful, standard `go` commands, such as `go test` should work, per package, without issue. @@ -151,6 +155,4 @@ the environment variable `DOCKER_BUILDTAGS`. To enable the [Ceph RADOS storage driver](storage-drivers/rados.md) (librados-dev and librbd-dev will be required to build the bindings): -```sh -export DOCKER_BUILDTAGS='include_rados' -``` + export DOCKER_BUILDTAGS='include_rados' diff --git a/docs/configuration.md b/docs/configuration.md index 6f5fb7f2c..0ea7091ad 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -1,8 +1,8 @@ + - [Token authentication](spec/auth/token.md) diff --git a/docs/help.md b/docs/help.md index 8deb6a142..84cda8da9 100644 --- a/docs/help.md +++ b/docs/help.md @@ -2,7 +2,7 @@ +++ title = "Getting help" description = "Getting help with the Registry" -keywords = ["registry, service, images, repository, help"] +keywords = ["registry, on-prem, images, tags, repository, distribution, help, 101, TL;DR"] [menu.main] parent="smn_registry" weight=9 diff --git a/docs/images/registry.gliffy b/docs/images/registry.gliffy deleted file mode 100644 index f42504106..000000000 --- a/docs/images/registry.gliffy +++ /dev/null @@ -1 +0,0 @@ -{"contentType":"application/gliffy+json","version":"1.3","stage":{"background":"#FFFFFF","width":358,"height":310,"nodeIndex":182,"autoFit":true,"exportBorder":false,"gridOn":true,"snapToGrid":true,"drawingGuidesOn":true,"pageBreaksOn":false,"printGridOn":false,"printPaper":"LETTER","printShrinkToFit":false,"printPortrait":true,"maxWidth":5000,"maxHeight":5000,"themeData":null,"viewportType":"default","fitBB":{"min":{"x":20.000000000000004,"y":10},"max":{"x":357.50000000000006,"y":310}},"objects":[{"x":254.50000000000006,"y":246.0,"rotation":0.0,"id":179,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":179,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":70,"py":1.0,"px":0.7071067811865476}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":72,"py":0.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":10.0,"controlPath":[[-2.2575759508250144,3.0],[-2.2575759508250144,13.5],[-50.125,13.5],[-50.125,24.0]],"lockSegments":{},"ortho":true}},"linkMap":[]},{"x":225.50000000000006,"y":117.0,"rotation":270.0,"id":177,"width":220.0,"height":44.0,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","order":22,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":4.4,"y":0.0,"rotation":0.0,"id":178,"width":211.19999999999987,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Notifications

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}}}]},{"x":-23.999999999999886,"y":117.1999999999999,"rotation":270.0,"id":175,"width":220.0,"height":44.0,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","order":19,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":4.4,"y":0.0,"rotation":0.0,"id":176,"width":211.19999999999987,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Authentication & Authorization

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}}}]},{"x":-67.99999999999999,"y":117.20000000000005,"rotation":270.0,"id":173,"width":220.0,"height":43.99999999999999,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","order":17,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":4.4,"y":0.0,"rotation":0.0,"id":174,"width":211.19999999999993,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Docker Registry Service API V2

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}}}]},{"x":117.31462811656212,"y":201.0,"rotation":0.0,"id":140,"width":77.5,"height":30.0,"uid":"com.gliffy.shape.sitemap.sitemap_v1.default.document","order":15,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.document.sitemap_v1","strokeWidth":2.0,"strokeColor":"#666666","fillColor":"#ffffff","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":1.192307692307692,"y":0.0,"rotation":0.0,"id":142,"width":75.1153846153846,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Logging

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":192.31462811656212,"y":201.0,"rotation":0.0,"id":136,"width":88.93537188343794,"height":29.999999999999996,"uid":"com.gliffy.shape.sitemap.sitemap_v1.default.form","order":13,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.form.sitemap_v1","strokeWidth":2.0,"strokeColor":"#666666","fillColor":"#ffffff","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":1.3682364905144297,"y":0.0,"rotation":0.0,"id":138,"width":86.19889890240907,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Reporting

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":52.50000000000007,"y":10.0,"rotation":0.0,"id":109,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":12,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Registry

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":79.81462811656212,"y":55.0,"rotation":0.0,"id":108,"width":201.43537188343794,"height":124.0,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":11,"lockAspectRatio":false,"lockShape":false,"children":[{"x":92.5,"y":54.0,"rotation":0.0,"id":102,"width":86.43537188343794,"height":30.0,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":9,"lockAspectRatio":false,"lockShape":false,"children":[{"x":22.5,"y":8.0,"rotation":0.0,"id":97,"width":45.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":8,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

. . .

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]},{"x":57.5,"y":0.0,"rotation":0.0,"id":95,"width":28.935371883437952,"height":30.0,"uid":"com.gliffy.shape.aws.aws_v1.non_service_specific.disk","order":6,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.aws.non_service_specific.disk","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":96,"width":52.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"both","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

image_n

","tid":null,"valign":"middle","vposition":"below","hposition":"none"}},"children":[]}]},{"x":0.0,"y":0.0,"rotation":0.0,"id":90,"width":28.935371883437952,"height":30.0,"uid":"com.gliffy.shape.aws.aws_v1.non_service_specific.disk","order":4,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.aws.non_service_specific.disk","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":92,"width":51.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"both","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

image_1

","tid":null,"valign":"middle","vposition":"below","hposition":"none"}},"children":[]}]}]},{"x":43.93537188343794,"y":24.0,"rotation":0.0,"id":85,"width":157.5,"height":100.0,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.multiple_documents","order":3,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.multiple_documents.flowchart_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[]},{"x":0.0,"y":0.0,"rotation":0.0,"id":103,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":10,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Repositories

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[]}]},{"x":127.50000000000006,"y":270.0,"rotation":0.0,"id":72,"width":153.75,"height":40.0,"uid":"com.gliffy.shape.basic.basic_v1.default.cylinder","order":1,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.cylinder.basic_v1","strokeWidth":2.0,"strokeColor":"#666666","fillColor":"#FFFFFF","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":4.1000000000000005,"y":0.0,"rotation":0.0,"id":74,"width":145.54999999999998,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Storage

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[]}]},{"x":103.75000000000006,"y":29.0,"rotation":0.0,"id":70,"width":210.0,"height":220.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":0,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[]}],"shapeStyles":{"com.gliffy.shape.basic.basic_v1.default":{"fill":"#FFFFFF","stroke":"#666666","strokeWidth":2},"com.gliffy.shape.aws.aws_v1.non_service_specific":{"fill":"#FFFFFF","stroke":"#333333","strokeWidth":2},"com.gliffy.shape.flowchart.flowchart_v1.default":{"fill":"#FFFFFF","stroke":"#333333","strokeWidth":2},"com.gliffy.shape.sitemap.sitemap_v1.default":{"fill":"#ffffff","stroke":"#666666","strokeWidth":2},"com.gliffy.shape.network.network_v3.home":{"fill":"#003366"}},"lineStyles":{"global":{}},"textStyles":{"global":{"color":"#000000","bold":true}}},"metadata":{"title":"untitled","revision":0,"exportBorder":false,"loadPosition":"default","libraries":["com.gliffy.libraries.sitemap.sitemap_v2","com.gliffy.libraries.sitemap.sitemap_v1.default","com.gliffy.libraries.ui.ui_v3.containers_content","com.gliffy.libraries.table.table_v2.default","com.gliffy.libraries.ui.ui_v3.navigation","com.gliffy.libraries.ui.ui_v3.forms_controls","com.gliffy.libraries.ui.ui_v3.icon_symbols","com.gliffy.libraries.ui.ui_v2.forms_components","com.gliffy.libraries.ui.ui_v2.content","com.gliffy.libraries.ui.ui_v2.miscellaneous","com.gliffy.libraries.aws.aws_v1.app_services","com.gliffy.libraries.aws.aws_v1.compute_and_networking","com.gliffy.libraries.aws.aws_v1.database","com.gliffy.libraries.aws.aws_v1.deployment_and_management","com.gliffy.libraries.aws.aws_v1.non_service_specific","com.gliffy.libraries.aws.aws_v1.on_demand_workforce","com.gliffy.libraries.aws.aws_v1.sdks","com.gliffy.libraries.aws.aws_v1.storage_and_content_delivery","com.gliffy.libraries.network.network_v3.home","com.gliffy.libraries.network.network_v3.business","com.gliffy.libraries.network.network_v3.rack","com.gliffy.libraries.flowchart.flowchart_v1.default","com.gliffy.libraries.swimlanes.swimlanes_v1.default","com.gliffy.libraries.uml.uml_v2.component","com.gliffy.libraries.basic.basic_v1.default","com.gliffy.libraries.images"]},"embeddedResources":{"index":0,"resources":[]}} \ No newline at end of file diff --git a/docs/images/registry.png b/docs/images/registry.png deleted file mode 100644 index e645df1e3a06645af3cf072844657e42609fa125..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24298 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 diff --git a/docs/images/registry.svg b/docs/images/registry.svg deleted file mode 100644 index 723855a20..000000000 --- a/docs/images/registry.svg +++ /dev/null @@ -1 +0,0 @@ -Storageimage_1image_n. . .RepositoriesRegistryReportingLoggingDocker Registry Service API V2Authentication & AuthorizationNotifications \ No newline at end of file diff --git a/docs/index.md b/docs/index.md index 22ccd68d9..6cd6769e6 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,8 +1,8 @@ @@ -23,16 +23,16 @@ This basically tells Docker to entirely disregard security for your registry. **Pros:** - - easy to configure + - relatively easy to configure **Cons:** - - very insecure + - this is **very** insecure: you are basically exposing yourself to trivial MITM, and this solution should only be used for isolated testing or in a tightly controlled, air-gapped environment - you have to configure every docker daemon that wants to access your registry ## Using self-signed certificates -> :warning: using this along with basic authentication requires to **also** trust the certificate into the OS cert store for some versions of docker +> :warning: using this along with basic authentication requires to **also** trust the certificate into the OS cert store for some versions of docker (see below) Generate your own certificate: @@ -42,11 +42,11 @@ Generate your own certificate: Be sure to use the name `myregistrydomain.com` as a CN. -Stop and restart your registry. +Use the result to [start your registry with TLS enabled](https://github.com/docker/distribution/blob/master/docs/deploying.md#get-a-certificate) -Then you have to instruct every docker daemon to trust that certificate. This is done by copying the `domain.crt` file to `/etc/docker/certs.d/myregistrydomain.com:5000/ca.crt` (don't forget to restart docker after doing so). +Then you have to instruct every docker daemon to trust that certificate. This is done by copying the `domain.crt` file to `/etc/docker/certs.d/myregistrydomain.com:5000/ca.crt`. -Stop and restart all your docker daemons. +Don't forget to restart docker after doing so. **Pros:** @@ -68,3 +68,19 @@ If this private registry supports only HTTP or HTTPS with an unknown CA certific In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag; simply place the CA certificate at /etc/docker/certs.d/myregistrydomain.com:5000/ca.crt ``` + +## Docker still complains about the certificate when using authentication? + +When using authentication, some versions of docker also require you to trust the certificate at the OS level. + +Usually, on Ubuntu this is done with: + + cp auth/domain.crt /usr/local/share/ca-certificates/myregistrydomain.com.crt + update-ca-certificates + +... and on RedHat with: + + cp auth/domain.crt /etc/pki/ca-trust/source/anchors/myregistrydomain.com.crt + update-ca-trust + +Now restart docker (`service docker stop && service docker start`, or any other way you use to restart docker). diff --git a/docs/introduction.md b/docs/introduction.md index 1ea7115e5..aefefc347 100644 --- a/docs/introduction.md +++ b/docs/introduction.md @@ -1,8 +1,8 @@ @@ -133,24 +133,3 @@ Login with a "push" authorized user (using `testuserpush` and `testpasswordpush` docker tag ubuntu myregistrydomain.com:5043/test docker push myregistrydomain.com:5043/test docker pull myregistrydomain.com:5043/test - -## Docker still complains about the certificate? - -That's certainly because you are using a self-signed certificate, despite the warnings. - -If you really insist on using these, you have to trust it at the OS level. - -Usually, on Ubuntu this is done with: - - cp auth/domain.crt /usr/local/share/ca-certificates/myregistrydomain.com.crt - update-ca-certificates - -... and on RedHat with: - - cp auth/domain.crt /etc/pki/ca-trust/source/anchors/myregistrydomain.com.crt - update-ca-trust - -Now: - - * `service docker stop && service docker start` (or any other way you use to restart docker) - * `docker-compose up -d` to bring your registry up diff --git a/docs/notifications.md b/docs/notifications.md index 9167cacb6..e6d70c845 100644 --- a/docs/notifications.md +++ b/docs/notifications.md @@ -1,8 +1,8 @@ # OS X Setup Guide -This guide will walk you through running the new Go based [Docker registry](https://github.com/docker/distribution) on your local OS X machine. +## Use-case + +This is useful if you intend to run a registry server natively on OSX. + +### Alternatives + +You can start a VM on OSX, and deploy your registry normally as a container using Docker inside that VM. + +The simplest road to get there is traditionally to use the [docker Toolbox](https://www.docker.com/toolbox), or [docker-machine](https://docs.docker.com/machine/), which usually relies on the [boot2docker](http://boot2docker.io/) iso inside a VirtualBox VM. + +### Solution + +Using the method described here, you install and compile your own from the git repository and run it as an OSX agent. + +### Gotchas + +Production services operation on OSX is out of scope of this document. Be sure you understand well these aspects before considering going to production with this. + +## Setup golang on your machine + +If you know, safely skip to the next section. + +If you don't, the TLDR is: + + bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer) + source ~/.gvm/scripts/gvm + gvm install go1.4.2 + gvm use go1.4.2 + +If you want to understand, you should read [How to Write Go Code](https://golang.org/doc/code.html). ## Checkout the Docker Distribution source tree -``` -mkdir -p $GOPATH/src/github.com/docker -git clone https://github.com/docker/distribution.git $GOPATH/src/github.com/docker/distribution -cd $GOPATH/src/github.com/docker/distribution -``` + mkdir -p $GOPATH/src/github.com/docker + git clone https://github.com/docker/distribution.git $GOPATH/src/github.com/docker/distribution + cd $GOPATH/src/github.com/docker/distribution -## Build the registry binary +## Build the binary -``` -GOPATH=$(PWD)/Godeps/_workspace:$GOPATH make binaries -sudo cp bin/registry /usr/local/libexec/registry -``` + GOPATH=$(PWD)/Godeps/_workspace:$GOPATH make binaries + sudo cp bin/registry /usr/local/libexec/registry ## Setup Copy the registry configuration file in place: -``` -mkdir /Users/Shared/Registry -cp docs/osx/config.yml /Users/Shared/Registry/config.yml -``` + mkdir /Users/Shared/Registry + cp docs/osx/config.yml /Users/Shared/Registry/config.yml ## Running the Docker Registry under launchd Copy the Docker registry plist into place: -``` -plutil -lint docs/osx/com.docker.registry.plist -cp docs/osx/com.docker.registry.plist ~/Library/LaunchAgents/ -chmod 644 ~/Library/LaunchAgents/com.docker.registry.plist -``` + plutil -lint docs/osx/com.docker.registry.plist + cp docs/osx/com.docker.registry.plist ~/Library/LaunchAgents/ + chmod 644 ~/Library/LaunchAgents/com.docker.registry.plist Start the Docker registry: -``` -launchctl load ~/Library/LaunchAgents/com.docker.registry.plist -``` + launchctl load ~/Library/LaunchAgents/com.docker.registry.plist ### Restarting the docker registry service -``` -launchctl stop com.docker.registry -launchctl start com.docker.registry -``` + launchctl stop com.docker.registry + launchctl start com.docker.registry ### Unloading the docker registry service -``` -launchctl unload ~/Library/LaunchAgents/com.docker.registry.plist -``` + launchctl unload ~/Library/LaunchAgents/com.docker.registry.plist diff --git a/docs/recipes.md b/docs/recipes.md index 97ace668b..275c71f7e 100644 --- a/docs/recipes.md +++ b/docs/recipes.md @@ -1,8 +1,8 @@ @@ -30,3 +30,5 @@ At this point, it's assumed that: * [using Apache as an authenticating proxy](apache.md) * [using Nginx as an authenticating proxy](nginx.md) + * [running a Registry on OSX](osx-setup-guide.md) + * [hacking the registry: build instructions](building.md) \ No newline at end of file diff --git a/docs/spec/api.md b/docs/spec/api.md index 81450657f..1d2bd782a 100644 --- a/docs/spec/api.md +++ b/docs/spec/api.md @@ -1,8 +1,8 @@ - - # Docker Registry v2 authentication via central service Today a Docker Registry can run in standalone mode in which there are no diff --git a/docs/storagedrivers.md b/docs/storagedrivers.md index b014049c4..317f10eec 100644 --- a/docs/storagedrivers.md +++ b/docs/storagedrivers.md @@ -1,11 +1,10 @@ @@ -47,14 +46,17 @@ with a driver name and parameters map. If no such storage driver can be found, ## Driver Contribution ### Writing new storage drivers + To create a valid storage driver, one must implement the `storagedriver.StorageDriver` interface and make sure to expose this driver via the factory system. #### Registering + Storage drivers should call `factory.Register` with their driver name in an `init` method, allowing callers of `factory.New` to construct instances of this driver without requiring modification of imports throughout the codebase. ## Testing + Storage driver test suites are provided in `storagedriver/testsuites/testsuites.go` and may be used for any storage driver written in Go. Tests can be registered using the `RegisterSuite` From 6197ca7b10d7b6c04d48d3094c8a956dfe6b99af Mon Sep 17 00:00:00 2001 From: Olivier Gambier Date: Thu, 27 Aug 2015 11:58:27 -0700 Subject: [PATCH 2/3] Adding mirror as a recipe Normalized mirror.md to match other recipes. Slightly tweaked content, emphasizing the privacy concerns about using login/password on the backend. Signed-off-by: Olivier Gambier --- docs/mirror.md | 60 +++++++++++++++++++++++++------------------------ docs/recipes.md | 3 ++- 2 files changed, 33 insertions(+), 30 deletions(-) diff --git a/docs/mirror.md b/docs/mirror.md index 1abd33f2a..34a3d813a 100644 --- a/docs/mirror.md +++ b/docs/mirror.md @@ -1,36 +1,48 @@ # Registry as a pull through cache -A v2 Registry can be configured as a pull through cache. In this mode a Registry responds to all normal docker pull requests but stores all content locally. +## Use-case -NOTE: Currently this feature can only be used to proxy against the official Docker Hub. +If you have multiple instances of Docker running in your environment (e.g., multiple physical or virtual machines, all running the Docker daemon), each time one of them requires an image that it doesn’t have it will go out to the internet and fetch it from the public Docker registry. By running a local registry mirror, you can keep most of the redundant image fetch traffic on your local network. -## Why? +### Alternatives -If you have multiple instances of Docker running in your environment (e.g., multiple physical or virtual machines, all running the Docker daemon), each time one of them requires an image that it doesn’t have it will go out to the internet and fetch it from the public Docker registry. By running a local registry mirror, you can keep most of the image fetch traffic on your local network. +Alternatively, if the set of images you are using is well delimited, you can simply pull them manually and push them to a simple, local, private registry. + +Furthermore, if your images are all built in-house, not using the Hub at all and relying entirely on your local registry is the simplest scenario. + +### Gotcha + +It's currently not possible to mirror another private registry. Only the central Hub can be mirrored. + +### Solution + +The Registry can be configured as a pull through cache. In this mode a Registry responds to all normal docker pull requests but stores all content locally. ## How does it work? The first time you request an image from your local registry mirror, it pulls the image from the public Docker registry and stores it locally before handing it back to you. On subsequent requests, the local registry mirror is able to serve the image from its own storage. -## What if the content changes on the Hub? +### What if the content changes on the Hub? When a pull is attempted with a tag, the Registry will check the remote to ensure if it has the latest version of the requested content. If it doesn't it will fetch the latest content and cache it. -## What about my disk? +### What about my disk? -In environments with high churn rates, stale data can build up in the cache. When running as a pull through cache the Registry will periodically remove old content to save disk space. Subsequent requests for removed content will cause a remote fetch and local re-caching. +In environments with high churn rates, stale data can build up in the cache. When running as a pull through cache the Registry will periodically remove old content to save disk space. Subsequent requests for removed content will cause a remote fetch and local re-caching. To ensure best performance and guarantee correctness the Registry cache should be configured to use the `filesystem` driver for storage. ## Running a Registry as a pull through cache -The easiest way to run a registry as a pull through cache is to run the official Registry pull through cache official image. +The easiest way to run a registry as a pull through cache is to run the official Registry image. Multiple registry caches can be deployed over the same back-end. A single registry cache will ensure that concurrent requests do not pull duplicate data, but this property will not hold true for a registry cache cluster. @@ -38,33 +50,23 @@ Multiple registry caches can be deployed over the same back-end. A single regis To configure a Registry to run as a pull through cache, the addition of a `proxy` section is required to the config file. -In order to access private images on the Docker Hub the username and password can be supplied. +In order to access private images on the Docker Hub, a username and password can be supplied. -``` -proxy: - remoteurl: https://registry-1.docker.io - username: [username] - password: [password] -``` + proxy: + remoteurl: https://registry-1.docker.io + username: [username] + password: [password] +> :warn: if you specify a username and password, it's very important to understand that private resources that this user has access to on the Hub will be made available on your mirror. It's thus paramount that you secure your mirror by implementing authentication if you expect these resources to stay private! - -## Configuring the Docker daemon +### Configuring the Docker daemon You will need to pass the `--registry-mirror` option to your Docker daemon on startup: -``` -docker --registry-mirror=https:// -d -``` + docker --registry-mirror=https:// daemon For example, if your mirror is serving on http://10.0.0.2:5000, you would run: -``` -docker --registry-mirror=https://10.0.0.2:5000 -d -``` - -NOTE: Depending on your local host setup, you may be able to add the --registry-mirror options to the `DOCKER_OPTS` variable in `/etc/default/` docker. - - - + docker --registry-mirror=https://10.0.0.2:5000 daemon +NOTE: Depending on your local host setup, you may be able to add the `--registry-mirror` option to the `DOCKER_OPTS` variable in `/etc/default/docker`. diff --git a/docs/recipes.md b/docs/recipes.md index 275c71f7e..b2a69db10 100644 --- a/docs/recipes.md +++ b/docs/recipes.md @@ -31,4 +31,5 @@ At this point, it's assumed that: * [using Apache as an authenticating proxy](apache.md) * [using Nginx as an authenticating proxy](nginx.md) * [running a Registry on OSX](osx-setup-guide.md) - * [hacking the registry: build instructions](building.md) \ No newline at end of file + * [hacking the registry: build instructions](building.md) + * [mirror the Docker Hub](mirror.md) \ No newline at end of file From 0c42f0cd63d88f90cbda58542ac29d74113b038c Mon Sep 17 00:00:00 2001 From: Olivier Gambier Date: Fri, 28 Aug 2015 12:46:09 -0700 Subject: [PATCH 3/3] Granmar and speeling fixes Signed-off-by: Olivier Gambier --- docs/building.md | 6 +++--- docs/notifications.md | 2 +- docs/osx-setup-guide.md | 14 +++++++------- docs/recipes.md | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/building.md b/docs/building.md index a8c45eff3..bf62c3e29 100644 --- a/docs/building.md +++ b/docs/building.md @@ -18,11 +18,11 @@ Most people should use the [official Registry docker image](https://hub.docker.c People looking for advanced operational use cases might consider rolling their own image with a custom Dockerfile inheriting `FROM registry:2`. -OSX users who want to run natively can do so following [the instructions here](osx-setup-guide.md). +OS X users who want to run natively can do so following [the instructions here](osx-setup-guide.md). ### Gotchas -You are expected to know your way with go & git. +You are expected to know your way around with go & git. If you are a casual user with no development experience, and no preliminary knowledge of go, building from source is probably not a good solution for you. @@ -34,7 +34,7 @@ for proper setup. If done correctly, you should have a GOROOT and GOPATH set in environment. If a Go development environment is setup, one can use `go get` to install the -`registry` source code from the current latest: +`registry` command from the current latest: go get github.com/docker/distribution/cmd/registry diff --git a/docs/notifications.md b/docs/notifications.md index e6d70c845..3642a9686 100644 --- a/docs/notifications.md +++ b/docs/notifications.md @@ -63,7 +63,7 @@ INFO[0000] configuring endpoint alistener (https://mylistener.example.com/event) Events have a well-defined JSON structure and are sent as the body of notification requests. One or more events are sent in a structure called an -envelope. Each event has a unique id that can be used to uniquify incoming +envelope. Each event has a unique id that can be used to uniquely identify incoming requests, if required. Along with that, an _action_ is provided with a _target, identifying the object mutated during the event. diff --git a/docs/osx-setup-guide.md b/docs/osx-setup-guide.md index cd516c345..833db4117 100644 --- a/docs/osx-setup-guide.md +++ b/docs/osx-setup-guide.md @@ -1,8 +1,8 @@ @@ -10,21 +10,21 @@ keywords = ["registry, on-prem, images, tags, repository, distribution, osx, rec ## Use-case -This is useful if you intend to run a registry server natively on OSX. +This is useful if you intend to run a registry server natively on OS X. ### Alternatives -You can start a VM on OSX, and deploy your registry normally as a container using Docker inside that VM. +You can start a VM on OS X, and deploy your registry normally as a container using Docker inside that VM. The simplest road to get there is traditionally to use the [docker Toolbox](https://www.docker.com/toolbox), or [docker-machine](https://docs.docker.com/machine/), which usually relies on the [boot2docker](http://boot2docker.io/) iso inside a VirtualBox VM. ### Solution -Using the method described here, you install and compile your own from the git repository and run it as an OSX agent. +Using the method described here, you install and compile your own from the git repository and run it as an OS X agent. ### Gotchas -Production services operation on OSX is out of scope of this document. Be sure you understand well these aspects before considering going to production with this. +Production services operation on OS X is out of scope of this document. Be sure you understand well these aspects before considering going to production with this. ## Setup golang on your machine diff --git a/docs/recipes.md b/docs/recipes.md index b2a69db10..1dab46a03 100644 --- a/docs/recipes.md +++ b/docs/recipes.md @@ -30,6 +30,6 @@ At this point, it's assumed that: * [using Apache as an authenticating proxy](apache.md) * [using Nginx as an authenticating proxy](nginx.md) - * [running a Registry on OSX](osx-setup-guide.md) + * [running a Registry on OS X](osx-setup-guide.md) * [hacking the registry: build instructions](building.md) * [mirror the Docker Hub](mirror.md) \ No newline at end of file