5.0 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