Задача – развернуть Jenkins и Docker Private registry в Китае, на AWS.
Аналогичные посты – тут>>> и тут>>>, только в этом посте всё собрано в одно целое и упорядочено.
К EC2 будут подключены два EBS – один с данными Jenkins, второй – с данными Docker.
Для Docker registry в качестве хранилища используем AWS S3.
Далее в посте:
- создадим два EBS
- запустим EC2 в Китае
- установим Docker, Docker Compose
- подключим EBS, один в
/jenkins
, второй в/docker
- запустим Jenkins из Docker Compose, к которому будет монтироваться
/jenkins
- создадим S3 корзину для образов Registry
- запустим Docker registry из Docker Compose, к которому будет монтироваться
/docker
Содержание
Подготовка
AWS EC2
Запускаем EC2:
EBS
В том же регионе (cn-north-1b) создаём два EBS по 8 GB:
Подключаем их к EC2:
Логинимся на инстанс, проверяем:
Создаём файловые системы на разделах:
И для Docker:
Проверяем:
Создаём файловые системы:
Создаём точки монтирования:
Находим UUID разделов:
Редактируем /etc/fstab
(с nofail
опцией):
LABEL=cloudimg-rootfs / ext4 defaults,discard 0 0 UUID=4da7fd0f-13a9-434b-8d33-f23776abf5f0 /jenkins ext4 defaults,nofail 0 2 UUID=0b371143-d16a-40a2-9f35-2151952566b2 /docker ext4 defaults,nofail 0 2
Монтируем все разделы из /etc/fstab
:
Проверяем:
Docker
Обновляем пакеты:
Устанавливаем Docker:
Docker Compose:
Пока устанавливается Compose – обновляем настройки для Docker – меняем data-root
.
Создаём файл /etc/docker/daemon.json
:
{ "data-root": "/docker/" }
Перезапускаем docker
демон:
Проверяем содержимое /docker
:
Проверяем статус docker
:
Systemd
Что бы Docker демон запускался после того, как будут смонтирован каталог /docker
– обновляем systemd-сервис docker.service
.
Проверяем статус точки монтирования /docker
:
В файле /lib/systemd/system/docker.service
в блоке [Unit]
в конец строки After
добавляем docker.mount
:
[Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target docker.socket firewalld.service docker.mount Wants=network-online.target Requires=docker.socket ...
Перезагружаем машину, что бы убедиться, что всё работает:
После рестарта – проверяем ещё раз:
Всё гуд.
Jenkins
Создаём Compose файл:
version: '3' services: jenkins: user: root image: "daocloud.io/jenkins" restart: "always" ports: - "80:8080" volumes: - /jenkins/:/jenkins - /var/run/docker.sock:/var/run/docker.sock - /usr/bin/docker:/usr/bin/docker environment: - JENKINS_HOME=/jenkins
Используем daocloud.io., что бы не тянуть из hub.docker.com (China ведь).
Запускаем:
Проверяем содержимое /jenkins
:
Тут пока всё готово.
Docker Registry
S3 для registry storage
Для registry – нам потребуется S3 корзина для хранения образов и SSL сертификат. Запуск Docker registry описан тут>>>.
Создаём корзину:
Создаём файл политик доступа:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": [ "s3:ListBucket", "s3:GetBucketLocation", "s3:ListBucketMultipartUploads" ], "Resource": "arn:aws-cn:s3:::tag-ci-registry" }, { "Effect": "Allow", "Principal": "*", "Action": [ "s3:PutObject", "s3:GetObject", "s3:DeleteObject", "s3:ListMultipartUploadParts", "s3:AbortMultipartUpload" ], "Resource": "arn:aws-cn:s3:::tag-ci-registry/*" } ] }
Подключаем его к корзине:
SSL
Следующим шагом – требуется добавить SSL сертификат, что бы Docker registry работал через внешний домен.
Создаём каталог для сертификата:
С рабочей машины загружаем сертификат и ключ:
На CI хосте перемещаем их:
В файл /etc/docker/daemon.json
добавляем параметр insecure-registries
:
{ "data-root": "/docker/", "insecure-registries": ["registry-domain.cn:5000"] }
HTTP авторизация
Создаём каталог для файла htpasswd
:
И сам файл с пользователем и паролем, который будет использоваться для авторизации на Docker registry:
Docker registry config.yml
Следующим шагом – надо переопределить параметры storage
в /etc/docker/registry/config.yml
внутри контейнера с registry.
Создаём каталог:
В нём создаём файл config.yml
, в котором переопределяяем параметры в блоке storage
:
version: 0.1 log: fields: service: registry storage: s3: accesskey: AKI***L5A secretkey: OtN***7Cb region: cn-north-1 bucket: tag-ci-registry http: addr: :5000 headers: X-Content-Type-Options: [nosniff] health: storagedriver: enabled: true interval: 10s threshold: 3
Docker Compose для Docker Registry
Создаём файл, в котором указываем все каталоги для монтирования в контейнер и переменные для S3 и SSL:
registry: restart: always image: daocloud.io/registry:2 ports: - 5000:5000 environment: AWS_ACCESS_KEY_ID: AKI***L5A AWS_SECRET_ACCESS_KEY: OtN***7Cb REGISTRY_HTTP_TLS_CERTIFICATE: /certs/ssl_certificate.cer REGISTRY_HTTP_TLS_KEY: /certs/star_cn-private-key_2017.key REGISTRY_AUTH: htpasswd REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm volumes: - /etc/ssl/cn/2017:/certs - /etc/registry/auth:/auth - /etc/registry/conf/config.yml:/etc/docker/registry/config.yml
Запускаем:
Проверяем.
Создадим копию образа из уже скачанных:
Пушим его:
Гуд – требует авторизацию:
no basic auth credentials
Логинимся:
Пушим:
Проверяем содержимое корзины:
Всё отлично.
Docker Compose старт после reboot сервера
Сначала решил добавить systemd-юнит, как описано тут>>>, но – не потребовалось: хватает опции restart: "always"
в docker-compose.yml
обоих сервисов.
Проверяем:
Перезагружаем сервер:
После рестарта – логинимся, проверяем ещё раз:
Готово.
По хорошему – сюда бы ещё добавить NGINX на входе, что бы подключить SSL для Jenkins – но уже не сегодня.