Docker: запуск registry server

Автор: | 21/06/2017
 

Имеется инфрастуктура в Китае (AWS [China]: начало)

В настоящий момент – билд выполняется в Европе, образы пушатся в JFrog Artifactory в той же Европе, а потом пулятся на инстансы в Китайском AWS (cn-north-1).

Задача – поднять Jenkins и Docker registry сервер в Китае.

Сначала поднимем его на локалхосте, протестируем, потом добавим SSL, внешний домен и авторизацию.

Пост больше обзорный, по примерам из документации>>>. Следующей задачей будет развернуть полноценный registry с хранилищем в AWS S3 (Docker: private registry в AWS [China] с S3 storage).

Запуск Docker Registry v2 на localhost

Запускаем инстанс в AWS, устанавливаем docker:

[simterm]

# curl https://get.docker.com/ | bash
# usermod -aG docker  ubuntu

[/simterm]

Ищем registry:

[simterm]

# docker search registry
NAME                                      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
registry                                  The Docker Registry 2.0 implementation for...   1521      [OK]       
...

[/simterm]

Запускаем его:

[simterm]

# docker run -d -p 5000:5000 --restart=always --name registry registry

[/simterm]

Проверяем:

[simterm]

# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
6e5359aff56d        registry            "/entrypoint.sh /e..."   6 seconds ago       Up 5 seconds        0.0.0.0:5000->5000/tcp   registry

[/simterm]

Пробуем API:

[simterm]

# curl -X GET localhost:5000/v2/_catalog
{"repositories":[]}

[/simterm]

Работает, ОК.

Пробуем добавить в него образ. Качаем обычную Ubuntu:

[simterm]

# docker pull ubuntu

[/simterm]

Устанавливаем тег, и пушим в наше хранилище:

[simterm]

# docker tag ubuntu localhost:5000/ubuntu
# docker push localhost:5000/ubunt

[/simterm]

Проверяем:

[simterm]

# curl -X GET localhost:5000/v2/_catalog
{"repositories":["ubuntu"]}

[/simterm]

Всё работает. Стопаем, удаляем:

[simterm]

# docker stop registry && docker rm -v registry

[/simterm]

Storage

По умолчанию – registry хранит образы на локальной файловой системе:

[simterm]

# ls -l /var/lib/docker/volumes/93d3ad0392773026680889be34c7701a77c622606ff5e171d881db8a602aac0d/_data/docker/registry/v2/repositories/
total 4
drwxr-xr-x 5 root root 4096 Jun 20 13:46 ubuntu

[/simterm]

При запуске registry – можно указать раздел вручную:

[simterm]

# docker run -d -p 5000:5000 --restart=always --name registry \
>   -v `pwd`/data:/var/lib/registry \
>   registry
47549562e4d1d43ea9138b04247f8975f97ec73d1afa202f4a7a6f4724c4aa38
# ls -l data/ 
total 0

[/simterm]

Ещё раз делаем пуш и проверим каталог data в текущей директории:

[simterm]

# docker push localhost:5000/ubuntu
# ls -l data/docker/registry/v2/repositories/
total 4
drwxr-xr-x 5 root root 4096 Jun 20 13:52 ubuntu

[/simterm]

В Китае мы будем использовать S3 корзину, подробнее тут>>>.

SSL/TLS и внешний домен

Что бы использовать registry не через localhost – добавим сертифкат от Let’s Encrypt.

Устанавливаем его:

[simterm]

# git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

[/simterm]

Генерируем сертификат (через временный вебсервер, не забываем открыть доступ в security group интанса):

[simterm]

# ./letsencrypt-auto certonly -d registry.setevoy.org.ua
...
How would you like to authenticate with the ACME CA?
-------------------------------------------------------------------------------
1: Spin up a temporary webserver (standalone)
2: Place files in webroot directory (webroot)
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1
Obtaining a new certificate
Performing the following challenges:
tls-sni-01 challenge for registry.setevoy.org.ua
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/registry.setevoy.org.ua/fullchain.pem. Your
   cert will expire on 2017-09-18. To obtain a new or tweaked version
   of this certificate in the future, simply run letsencrypt-auto
   again. To non-interactively renew *all* of your certificates, run
   "letsencrypt-auto renew"

[/simterm]

Запускаем registry с этим сертификатом:

[simterm]

# docker run -d -p 5000:5000 --restart=always --name registry -v /etc/letsencrypt/archive/registry.setevoy.org.ua:/certs -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/fullchain1.pem -e REGISTRY_HTTP_TLS_KEY=/certs/privkey1.pem registry

[/simterm]

Тут внимание на путь к сертификату от Let’s Encrypt – с хоста монтируем не /etc/letsencrypt/live/registry.setevoy.org.ua (в котором симлинки), а /etc/letsencrypt/archive/registry.setevoy.org.ua с файлами.

Открываем порт 5000, тегаем и пушим:

[simterm]

# docker tag ubuntu registry.setevoy.org.ua:5000/ubuntu
# docker push registry.setevoy.org.ua:5000/ubuntu 
The push refers to a repository [registry.setevoy.org.ua:5000/ubuntu] 
d8b353eb3025: Pushed  
f2e85bc0b7b1: Pushed  
fc9e1e5e38f7: Pushed  
fe9a3f9c4559: Pushed  
6a8bf8c8edbd: Pushed  
latest: digest: sha256:ea1d854d38be82f54d39efe2c67000bed1b03348bcc2f3dc094f260855dff368 size: 1357

[/simterm]

Проверяем, уже по https://:

[simterm]

# curl -X GET https://registry.setevoy.org.ua:5000/v2/_catalog
{"repositories":["ubuntu"]}
[/simterm]

Работает.

Авторизация

Используем стандартную HTTP авторизацию. Останавливаем registry: [simterm]

# docker stop registry
registry

[/simterm]

Создаём файл с пользователем и паролем:

[simterm]

# mkdir auth
# docker run --entrypoint htpasswd registry -Bbn user password > auth/htpasswd

[/simterm]

Проверяем его содержимое:

[simterm]

# cat auth/htpasswd 
user:$2y$05$AL/bsJ0T1a6BqOiZNvIihOLY6UUWuhYftsGeSlHM9.vFL/oZzJ1Wa

[/simterm]

Запускаем:

[simterm]

# docker run -p 5000:5000 --restart=always --name registry -v /etc/letsencrypt/archive/registry.setevoy.org.ua:/certs -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/fullchain1.pem -e REGISTRY_HTTP_TLS_KEY=/certs/privkey1.pem -v /home/ubuntu/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry

[/simterm]

Пробуем push без авторизации:

[simterm]

# docker push registry.setevoy.org.ua:5000/ubuntu
The push refers to a repository [registry.setevoy.org.ua:5000/ubuntu]
d8b353eb3025: Preparing 
f2e85bc0b7b1: Preparing 
fc9e1e5e38f7: Preparing 
fe9a3f9c4559: Preparing 
6a8bf8c8edbd: Preparing 
no basic auth credentials

[/simterm]

Авторизуемся:

[simterm]

# docker login registry.setevoy.org.ua:5000
Username: user
Password: 
Login Succeeded

[/simterm]

Пушим:

[simterm]

# docker push registry.setevoy.org.ua:5000/ubuntu
The push refers to a repository [registry.setevoy.org.ua:5000/ubuntu]
d8b353eb3025: Pushed 
f2e85bc0b7b1: Pushed 
fc9e1e5e38f7: Pushed 
fe9a3f9c4559: Pushed 
6a8bf8c8edbd: Pushed 
latest: digest: sha256:ea1d854d38be82f54d39efe2c67000bed1b03348bcc2f3dc094f260855dff368 size: 1357

[/simterm]

В целом на этом всё. Осталось развернуть полноценный Docker registry.