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:
- Docker 1.9.0
- Docker Machine 0.5.0 (versão 1.9.0, build master: 16e4a2a)
- Docker Registry 2
- 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 registry
in <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_ARGS
como 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.io
certs/
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:5000
certs/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