148 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Markdown
		
	
	
			
		
		
	
	
			148 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Markdown
		
	
	
# Docker Compose V1 + V2 registry
 | 
						|
 | 
						|
This compose configuration configures a `v1` and `v2` registry behind an `nginx`
 | 
						|
proxy. By default, you can access the combined registry at `localhost:5000`.
 | 
						|
 | 
						|
The configuration does not support pushing images to `v2` and pulling from `v1`.
 | 
						|
If a `docker` client has a version less than 1.6, Nginx will route its requests
 | 
						|
to the 1.0 registry. Requests from newer clients will route to the 2.0 registry.
 | 
						|
 | 
						|
### Install Docker Compose
 | 
						|
 | 
						|
1. Open a new terminal on the host with your `distribution` source.
 | 
						|
 | 
						|
2. Get the `docker-compose` binary.
 | 
						|
 | 
						|
		$ sudo wget https://github.com/docker/compose/releases/download/1.1.0/docker-compose-`uname  -s`-`uname -m` -O /usr/local/bin/docker-compose
 | 
						|
 | 
						|
	This command installs the binary in the `/usr/local/bin` directory. 
 | 
						|
	
 | 
						|
3. Add executable permissions to the binary.
 | 
						|
 | 
						|
		$  sudo chmod +x /usr/local/bin/docker-compose
 | 
						|
		
 | 
						|
## Build and run with Compose
 | 
						|
	
 | 
						|
1. In your terminal, navigate to the `distribution/contrib/compose` directory
 | 
						|
 | 
						|
	This directory includes a single `docker-compose.yml` configuration.
 | 
						|
	
 | 
						|
		nginx:
 | 
						|
			build: "nginx"
 | 
						|
			ports:
 | 
						|
				- "5000:5000"
 | 
						|
			links:
 | 
						|
				- registryv1:registryv1
 | 
						|
				- registryv2:registryv2
 | 
						|
		registryv1:
 | 
						|
			image: registry
 | 
						|
			ports:
 | 
						|
				- "5000"
 | 
						|
		registryv2:
 | 
						|
			build: "../../"
 | 
						|
			ports:
 | 
						|
				- "5000"
 | 
						|
 | 
						|
	This configuration builds a new `nginx` image as specified by the
 | 
						|
	`nginx/Dockerfile` file. The 1.0 registry comes from Docker's official
 | 
						|
	public image. Finally, the registry 2.0 image is built from the
 | 
						|
	`distribution/Dockerfile` you've used previously.
 | 
						|
 		
 | 
						|
2. Get a registry 1.0 image.
 | 
						|
 | 
						|
		$ docker pull registry:0.9.1 
 | 
						|
 | 
						|
	The Compose configuration looks for this image locally. If you don't do this
 | 
						|
	step, later steps can fail.
 | 
						|
	
 | 
						|
3. Build `nginx`, the registry 2.0 image, and 
 | 
						|
 | 
						|
		$ docker-compose build
 | 
						|
		registryv1 uses an image, skipping
 | 
						|
		Building registryv2...
 | 
						|
		Step 0 : FROM golang:1.18
 | 
						|
		
 | 
						|
		...
 | 
						|
		
 | 
						|
		Removing intermediate container 9f5f5068c3f3
 | 
						|
		Step 4 : COPY docker-registry-v2.conf /etc/nginx/docker-registry-v2.conf
 | 
						|
		 ---> 74acc70fa106
 | 
						|
		Removing intermediate container edb84c2b40cb
 | 
						|
		Successfully built 74acc70fa106
 | 
						|
		
 | 
						|
	The command outputs its progress until it completes.
 | 
						|
 | 
						|
4. Start your configuration with compose.
 | 
						|
 | 
						|
		$ docker-compose up
 | 
						|
		Recreating compose_registryv1_1...
 | 
						|
		Recreating compose_registryv2_1...
 | 
						|
		Recreating compose_nginx_1...
 | 
						|
		Attaching to compose_registryv1_1, compose_registryv2_1, compose_nginx_1
 | 
						|
		...
 | 
						|
	
 | 
						|
 | 
						|
5. In another terminal, display the running configuration.
 | 
						|
 | 
						|
		$ docker ps
 | 
						|
		CONTAINER ID        IMAGE                       COMMAND                CREATED             STATUS              PORTS                                     NAMES
 | 
						|
		a81ad2557702        compose_nginx:latest        "nginx -g 'daemon of   8 minutes ago       Up 8 minutes        80/tcp, 443/tcp, 0.0.0.0:5000->5000/tcp   compose_nginx_1        
 | 
						|
		0618437450dd        compose_registryv2:latest   "registry cmd/regist   8 minutes ago       Up 8 minutes        0.0.0.0:32777->5000/tcp                   compose_registryv2_1   
 | 
						|
		aa82b1ed8e61        registry:latest             "docker-registry"      8 minutes ago       Up 8 minutes        0.0.0.0:32776->5000/tcp                   compose_registryv1_1   
 | 
						|
	
 | 
						|
### Explore a bit
 | 
						|
 | 
						|
1. Check for TLS on your `nginx` server.
 | 
						|
 | 
						|
		$ curl -v https://localhost:5000
 | 
						|
		* Rebuilt URL to: https://localhost:5000/
 | 
						|
		* Hostname was NOT found in DNS cache
 | 
						|
		*   Trying 127.0.0.1...
 | 
						|
		* Connected to localhost (127.0.0.1) port 5000 (#0)
 | 
						|
		* successfully set certificate verify locations:
 | 
						|
		*   CAfile: none
 | 
						|
			CApath: /etc/ssl/certs
 | 
						|
		* SSLv3, TLS handshake, Client hello (1):
 | 
						|
		* SSLv3, TLS handshake, Server hello (2):
 | 
						|
		* SSLv3, TLS handshake, CERT (11):
 | 
						|
		* SSLv3, TLS alert, Server hello (2):
 | 
						|
		* SSL certificate problem: self signed certificate
 | 
						|
		* Closing connection 0
 | 
						|
		curl: (60) SSL certificate problem: self signed certificate
 | 
						|
		More details here: http://curl.haxx.se/docs/sslcerts.html
 | 
						|
		
 | 
						|
2. Tag the `v1` registry image.
 | 
						|
 | 
						|
		 $ docker tag registry:latest localhost:5000/registry_one:latest
 | 
						|
 | 
						|
2. Push it to the localhost.
 | 
						|
 | 
						|
		 $ docker push localhost:5000/registry_one:latest
 | 
						|
		
 | 
						|
	If you are using the 1.6 Docker client, this pushes the image the `v2 `registry.
 | 
						|
 | 
						|
4. Use `curl` to list the image in the registry.
 | 
						|
 | 
						|
			$ curl -v -X GET http://localhost:5000/v2/registry_one/tags/list
 | 
						|
			* Hostname was NOT found in DNS cache
 | 
						|
			*   Trying 127.0.0.1...
 | 
						|
			* Connected to localhost (127.0.0.1) port 32777 (#0)
 | 
						|
			> GET /v2/registry1/tags/list HTTP/1.1
 | 
						|
			> User-Agent: curl/7.36.0
 | 
						|
			> Host: localhost:5000
 | 
						|
			> Accept: */*
 | 
						|
			> 
 | 
						|
			< HTTP/1.1 200 OK
 | 
						|
			< Content-Type: application/json
 | 
						|
			< Docker-Distribution-Api-Version: registry/2.0
 | 
						|
			< Date: Tue, 14 Apr 2015 22:34:13 GMT
 | 
						|
			< Content-Length: 39
 | 
						|
			< 
 | 
						|
			{"name":"registry_one","tags":["latest"]}
 | 
						|
			* Connection #0 to host localhost left intact
 | 
						|
		
 | 
						|
	This example refers to the specific port assigned to the 2.0 registry. You saw
 | 
						|
	this port earlier, when you used `docker ps` to show your running containers.
 | 
						|
 | 
						|
 |