Docker: запуск registry server

Автор: | 06/21/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:

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

Ищем registry:

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

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

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

Проверяем:

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

Пробуем API:

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

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

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

docker pull ubuntu

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

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

Проверяем:

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

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

docker stop registry && docker rm -v registry

Storage

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

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

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

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

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

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

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

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

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

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

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

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

./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"

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

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

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

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

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

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

curl -X GET https://registry.setevoy.org.ua:5000/v2/_catalog
{"repositories":["ubuntu"]}
Работает.

Авторизация

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

docker stop registry
registry

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

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

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

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

Запускаем:

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

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

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

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

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

Пушим:

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

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