Signed-off-by: Arnaud Porterie <arnaud.porterie@docker.com>
5 KiB
Distribution
Project intentions
Problem statement and requirements
- What is the exact scope of the problem?
Design a professional grade and extensible content distribution system, that allows docker users to:
... by default enjoy:
* an efficient, secured and reliable way to store, manage, package and exchange content
... optionally:
* can hack/roll their own on top of healthy open-source components
... with the liberty to:
* implement their own home made solution through good specs, and solid extensions mechanism
-
Who will the result be useful to?
- users
- ISV (who distribute images or develop image distribution solutions)
- docker
-
What are the use cases (distinguish dev & ops population where applicable)?
- Everyone (... uses docker push/pull).
-
Why does it matter that we build this now?
- Shortcomings of the existing codebase are the #1 pain point (by large) for users, partners and ISV, hence the most urgent thing to address (?)
- That situation is getting worse everyday and killer competitors are going/have emerged.
-
Who are the competitors?
- existing artifact storage solutions (eg: artifactory).
- emerging products that aim at handling pull/push in place of docker.
- ISV that are looking for alternatives to workaround this situation
Current state: what do we have today?
Problems of the existing system:
- not reliable
- registry goes down whenever the hub goes down
- failing push result in broken repositories
- concurrent push is not handled
- python boto and gevent have a terrible history
- organically grown, under-designed features are in a bad shape (search)
- inconsistent
- discrepancies between duplicated API (and duplicated APIs)
- unused features
- missing essential features (proper SSL support)
- not reusable
- tightly entangled with hub component makes it very difficult to use outside of docker
- proper access-control is almost impossible to do right
- not easily extensible
- not efficient
- no parallel operations (by design)
- sluggish client-side processing / bad pipeline design
- poor reusability of content (random ids)
- scalability issues (tags)
- too many useless requests (protocol)
- too much local space consumed (local garbage collection: broken + not efficient)
- no squashing
- not resilient to errors
- no resume
- error handling is obscure or inexistent
- security
- content is not verified
- current tarsum is broken
- random ids are a headache
- confusing
- registry vs. registry.hub?
- layer vs. image?
- broken features
- mirroring is not done correctly (too complex, bug-laden, caching is hard)
- poor integration with the rest of the project
- technology discrepancy (python vs. go)
- poor testability
- poor separation (API in the engine is not defined enough)
- missing features / prevents future
- trust / image signing
- naming / transport separation
- discovery / layer federation
- architecture + os support (eg: arm/windows)
- quotas
- alternative distribution methods (transport plugins)
Future state: where do we want to get?
-
Deliverable
- new JSON/HTTP protocol specification
- new image format specification
- (new image store in the engine)
- new transport API between the engine and the distribution client code / new library
- new registry in go
- new authentication service on top of the trust graph in go
-
What are the interactions with other components of the project?
- critical interactions with docker push/pull mechanism
- critical interactions with the way docker stores images locally
-
In what way will the result be customizable?
- transport plugins allowing for radically different transport methods (bittorent, direct S3 access, etc)
- extensibility design for the registry allowing for complex integrations with other systems
- backend storage drivers API
Kick-off output
What is the expected output of the kick-off session?
-
draft specifications
-
separate binary tool for demo purpose
-
a mergeable PR that fixes 90% of the listed issues
-
agree on a vision that allows solving all that are deemed worthy
-
propose a long term battle plan with clear milestones that encompass all these
-
define a first milestone that is compatible with the future and does already deliver some of the solutions
-
deliver the specifications for image manifest format and transport API
-
deliver a working implementation that can be used as a drop-in replacement for the existing v1 with an equivalent feature-set
How is the output going to be demoed?
docker pull docker push
Once demoed, what will be the path to shipping?
A minimal PR that include the first subset of features to make docker work well with the new server side components.
Pressing matters
-
need a codename (ship, distribute)
-
new repository
-
new domains
-
architecture / OS
-
persistent ids
-
registries discovery
-
naming (quay.io/foo/bar)
-
mirroring
Assorted issues
- some devops want a docker engine that cannot do push/pull