Имеется инфрастуктура в Китае (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.