Registro privado inseguro e autoassinado do Docker com Boot2Docker

Vamos dar uma olhada em como configurar um registro docker inseguro e um registro docker autoassinado no Digital Ocean. Em seguida, tentaremos acessar o registro por meio da autenticação básica com boot2docker.

O que eu uso:

  1. Docker 1.9.0
  2. Docker Machine 0.5.0 (versão 1.9.0, build master: 16e4a2a)
  3. Docker Registry 2
  4. Conta Digital Ocean

Criar um host de registro

Para criar o host de registro no Digital Ocean:

$docker-machine create --driver digitalocean 
--digitalocean-access-token <our_digitalocean_token>
--digitalocean-region <our_region>
registry

Isso cria um droplet chamado registryin <our_region>, padronizado para 512 MB de memória e 20 GB de armazenamento em disco rígido, com um endereço IP flutuante público de atribuição automática.

Configurar Docker Registry 2.0

Vamos usar SSH em nosso droplet e configurar um registro docker.

$eval `docker-machine env registry`
$docker
-machine ssh registry
root@registry
-02:~# docker run -d -p 5000:5000
--restart=always --name registry
-v `pwd`/data:/var/lib/registry
registry
:2

Isso deve fazer com que o Docker Registry 2.0 seja executado em nosso host. Podemos verificar isso usando docker ps.

Se tentarmos enviar uma imagem do docker para o nosso registro agora, ele deverá falhar. (No meu caso, estou usando boot2docker.)

$docker pull isim/consul # pull from docker hub
$docker tag isim
/consul <floating_ip>:5000/consul # tag for remote repository
$docker push
<floating_ip>:5000/consul # push to my registry
The push refers to a repository [198.199.110.18:5000/consul] (len: 1)
unable to ping registry endpoint https
://198.199.110.18:5000/v0/
v2 ping attempt failed
with error: Get https://198.199.110.18:5000/v2/: tls: oversized record received with length 20527
v1 ping attempt failed
with error: Get https://198.199.110.18:5000/v1/_ping: tls: oversized record received with length 20527

Confie em um registro inseguro

Para dizer ao nosso Docker local para desconsiderar a segurança e confiar em nosso registro docker como um registro inseguro , faça as seguintes alterações em nosso Docker local (não em nosso host de registro) . No meu caso, essas mudanças precisam ser feitas no meu boot2docker.

$docker-machine ssh default #ssh into boot2docker
docker@default
:~$ sudo vi /var/lib/boot2docker/profile #update boot2docker profile to trust the insecure registry

Adicione o IP flutuante do seu nó de registro EXTRA_ARGScomo um registro inseguro no arquivo de perfil boot2docker:

EXTRA_ARGS='
--label provider=virtualbox

--insecure-registry=198.199.110.18:5000

'

Saia do boot2docker e reinicie-o usando docker-machine. Agora tente empurrar nossa imagem recém-marcada novamente e deve funcionar.

Como executamos nosso registro com um volume montado anteriormente, devemos ver a imagem armazenada na origem do volume. No meu caso, meu host de registro se parece com:

root@registry:~# ls -al data/docker/registry/v2/repositories/
total
12
drwxr
-xr-x 3 root root 4096 Nov 29 19:37 .
drwxr
-xr-x 4 root root 4096 Nov 29 19:37 ..
drwxr
-xr-x 5 root root 4096 Nov 29 19:38 consul

Leia sobre os prós e os contras do registro inseguro .

Registro autoassinado com restrição de acesso

Remova a bandeira de nosso arquivo de perfil boot2docker e reinicie nosso boot2docker. Agora criaremos nosso próprio certificado autoassinado, protegeremos nosso registro com TLS e, em seguida, restringiremos o acesso a ele usando a autenticação básica.--insecure-registry

Para gerar um certificado autoassinado em nosso host de registro:

root@registry:~# mkdir certs
root@registry
:~# openssl req
-newkey rsa:4096 -nodes -sha256
-keyout certs/domain.key
-x509 -days 356
-out certs/domain.crt

Quando solicitado , eu uso . Você pode ler mais sobre xip.io aqui . Devemos ver nossas chaves privadas e certificados na pasta.Common Name (e.g. server FQDN or YOUR name)<floating_ip>.xip.iocerts/

Para configurar a autenticação básica em nosso host de registro:

root@registry:~# mkdir auth
root@registry
:~# docker run --entrypoint htpasswd registry:2 -Bnb <username> <password> > auth/htpasswd

Isso criará um arquivo.auth/htpasswd

Pare e remova nosso registro do docker em execução. (a pasta ainda deve estar intacta.) Reinicie-a para pegar os certificados e a senha:/data

docker run -d -p 5000:5000 --restart=always --name registry 
-v `pwd`/auth:/auth
-v `pwd`/certs:/certs
-v `pwd`/data:/var/lib/registry
-e "REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt"
-e "REGISTRY_HTTP_TLS_KEY=/certs/domain.key"
-e "REGISTRY_AUTH=htpasswd"
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm"
-e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd"
registry
:2

Agora temos que atualizar o daemon Docker em nosso boot2docker para confiar nos certificados.

docker@default:~$ sudo mkdir -p /etc/docker/certs.d/<floating_ip>.xip.io:5000
docker@default
:~$ sudo vi /etc/docker/certs.d/<floating_ip>.xip.io:5000/ca.crt # copy certificate from registry host to this file

Crie a pasta e copie nosso certificado de nosso host de registro para ./etc/docker/certs.d/<floating_ip>.xip.io:5000certs/domain.crt/etc/docker/certs.d/<floating_ip>.xip.io:5000/ca.crt

Reinicie nosso daemon docker.

docker@default:~$ sudo /etc/init.d/docker restart

Agora devemos ser capazes de enviar imagem e fazer login em nosso host de registro.

$docker login <floating_ip>.xip.io:5000
WARNING
: login credentials saved in ~/.docker/config.json
Login Succeeded
$docker tag isim
/consul <floating_ip>.xip.io:5000/consul
$docker push
<floating_ip>.xip.io:5000/consul

Observe o uso do domínio.xip.io