Задача — перенести сетап из постов Docker: private registry в AWS [China] с S3 storage и Docker: AWS [China] – Jenkins в Docker на новый интанс.
VPC, EC2, EIP, EBS разделы и S3 корзина уже созданы.
Пост — совсем не HowTo, скорее просто заметка для себя.
Содержание
Установка Docker
На новом интансе устанавливаем Docker:
[simterm]
# curl https://get.docker.com | bash
[/simterm]
Пока устанавливается Docker engine — «устанавливаем» Docker Compose:
[simterm]
$ scp -i /home/setevoy/Work/AKQA/LON.TAG/.ssh/tag-cn.pem docker-compose ubuntu@54.***.***.251:/tmp
[/simterm]
На инстансе перемещаем исполняемый файл:
[simterm]
# mv /tmp/docker-compose /usr/local/bin/
[/simterm]
Docker EBS
Отключаем раздел на старой машине.
Проверяем:
[simterm]
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT xvda 202:0 0 8G 0 disk └─xvda1 202:1 0 8G 0 part / xvdb 202:16 0 80G 0 disk └─xvdb1 202:17 0 80G 0 part /jenkins xvdc 202:32 0 100G 0 disk └─xvdc1 202:33 0 100G 0 part /docker
[/simterm]
Стопаем docker
, отмонтируем раздел:
[simterm]
$ sudo service docker stop $ sudo umount /dev/xvdc1
[/simterm]
Выполняем detach EBS от старого интанса, аттачим к новому:
[simterm]
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT xvda 202:0 0 8G 0 disk └─xvda1 202:1 0 8G 0 part / xvdc 202:32 0 100G 0 disk └─xvdc1 202:33 0 100G 0 part
[/simterm]
Монтируем к файловой системе:
[simterm]
$ sudo mkdir /docker $ sudo mount /dev/xvdc1 /docker
[/simterm]
Создаём конфиг для docker
— /etc/docker/daemon.json
:
{ "graph": "/docker/" }
Перезапускаем docker
:
[simterm]
$ sudo service docker restart sudo: unable to resolve host ip-10-0-0-235 $ sudo service docker status sudo: unable to resolve host ip-10-0-0-235 ● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2017-06-27 15:36:45 UTC; 5s ago ...
[/simterm]
Проверяем — выполняем pull
:
[simterm]
$ docker pull registry:2 2: Pulling from library/registry Digest: sha256:d3d89add3167e6620a8e02b075e8042895ea9e13551909dfb8327165996ef571 Status: Image is up to date for registry:2
Image is up to date for registry:2
[/simterm]
pull
не выполнялся, т.к. образ registry:2
уже имеется на подключенном разделе со старого интанса — ОК, всё работает.
Запуск Docker registry
Все файлы, созданные в первых двух частях (см. начало поста) были сохранены в репозиторий.
Клонируем:
[simterm]
$ git clone https://bitbucket.company.net/scm/lontag/tag-ci-infrastructure-china.git $ cd tag-ci-infrastructure-china/docker_registry/ $ ls -l total 16 drwxrwxr-x 2 ubuntu ubuntu 4096 Jun 27 15:26 auth drwxrwxr-x 2 ubuntu ubuntu 4096 Jun 27 15:26 conf -rw-rw-r-- 1 ubuntu ubuntu 518 Jun 27 15:26 docker-compose.yml drwxrwxr-x 2 ubuntu ubuntu 4096 Jun 27 15:26 registry.domain.cn
[/simterm]
Проверяем параметры (разделы) в compose-файле:
[simterm]
$ cat docker-compose.yml version: '3' services: registry: restart: always image: registry:2 ports: - 5000:5000 environment: REGISTRY_HTTP_TLS_CERTIFICATE: /certs/fullchain1.pem REGISTRY_HTTP_TLS_KEY: /certs/privkey1.pem REGISTRY_AUTH: htpasswd REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm volumes: - /etc/letsencrypt/archive/registry.domain.cn:/certs - /etc/docker/registry/auth:/auth - /etc/docker/registry/conf/config.yml:/etc/docker/registry/config.yml
[/simterm]
Копируем данные:
[simterm]
$ sudo cp -r auth/ /etc/docker/registry $ sudo cp conf/config.yml /etc/docker/registry/conf $ sudo cp -r registry.domain.cn/ /etc/letsencrypt/archive/
[/simterm]
Запускаем:
[simterm]
$ docker-compose up dockerregistry_registry_1 is up-to-date Attaching to dockerregistry_registry_1 ...
[/simterm]
Логинимся:
[simterm]
$ docker login registry.domain.cn:5000 Username: username Password: Login Succeeded
[/simterm]
Проверяем pull
:
[simterm]
$ docker pull registry.domain.cn:5000/ubuntu Using default tag: latest latest: Pulling from ubuntu 75c416ea735c: Pull complete c6ff40b6d658: Pull complete a7050fc1f338: Pull complete f0ffb5cf6ba9: Pull complete be232718519c: Pull complete Digest: sha256:a0ee7647e24c8494f1cf6b94f1a3cd127f423268293c25d924fbe18fd82db5a4 Status: Downloaded newer image for registry.domain.cn:5000/ubuntu:latest
[/simterm]
Стопаем compose, запускаем демоном:
[simterm]
$ docker-compose up -d
[/simterm]
Готово.
Запуск Jenkins в Docker
Аналогично разделу /docker
— переносим EBS с данными Jenkins:
[simterm]
$ sudo umount /dev/xvdb1
[/simterm]
detach-attach, поключаем диск к новому интансу как /dev/xvdb
:
[simterm]
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT xvda 202:0 0 8G 0 disk └─xvda1 202:1 0 8G 0 part / xvdb 202:16 0 80G 0 disk └─xvdb1 202:17 0 80G 0 part xvdc 202:32 0 100G 0 disk └─xvdc1 202:33 0 100G 0 part /docker
[/simterm]
Монтируем его:
[simterm]
$ sudo mkdir /jenkins $ sudo mount /dev/xvdb1 /jenkins/
[/simterm]
Меняем пользователя:
[simterm]
$ sudo chown -R ubuntu:ubuntu /jenkins/
[/simterm]
Проверяем содержимое:
[simterm]
$ ls -l /jenkins/ total 128 -rw-r--r-- 1 ubuntu ubuntu 1592 Jun 27 16:05 config.xml -rw-r--r-- 1 ubuntu ubuntu 973 Jun 26 12:53 credentials.xml drwxr-xr-x 3 ubuntu ubuntu 4096 Jun 26 12:50 fingerprints -rw-r--r-- 1 ubuntu ubuntu 159 Jun 27 16:06 hudson.model.UpdateCenter.xml -rw-r--r-- 1 ubuntu ubuntu 1121 Jun 26 11:15 hudson.plugins.emailext.ExtendedEmai ...
[/simterm]
Переходим в репозиторий с файлами для запуска Jenkins:
[simterm]
$ cd ../jenkins/
[/simterm]
Запускаем — образы не пулятся, всё уже есть на разделе /docker
:
[simterm]
$ docker-compose up Starting jenkins_maven_1 Recreating 32a69a93324f_jenkins_jenkins_1 Starting jenkins_packer_1 Starting jenkins_aws-cli_1 Starting jenkins_terraform_1 Attaching to jenkins_maven_1, jenkins_packer_1, jenkins_terraform_1, jenkins_aws-cli_1, jenkins_jenkins_1 ...
[/simterm]
Проверяем Jenkins:
[simterm]
$ curl localhost curl: (56) Recv failure: Connection reset by peer
[/simterm]
WTF?
Запускаем Jenkins вручную:
[simterm]
$ docker run -ti -p 80:8080 -v /jenkins/:/jenkins -e JENKINS_HOME='/jenkins' registry.domain.cn:5000/tagjenkins
[/simterm]
Проверяем:
[simterm]
$ curl localhost <html><head><meta http-equiv='refresh' content='1;url=/login?from=%2F'/> ...
[/simterm]
Работает. Какого тогда?
Находим сеть, созданную Docker Compose для Jenkins:
[simterm]
$ docker network ls NETWORK ID NAME DRIVER SCOPE 9aaaa15cd7ce bridge bridge local 077cf63b25bf host host local 47dbd88bd306 jenkins_default bridge local
[/simterm]
Удаляем её:
[simterm]
$ docker network rm jenkins_default jenkins_default
[/simterm]
Запускаем Compose ещё раз:
[simterm]
$ docker-compose up
[/simterm]
Проверяем:
[simterm]
$ curl localhost <html><head><meta http-equiv='refresh' content='1;url=/login?from=%2F'/> ...
[/simterm]
Готово.
Потребуется ещё несколько мелочей:
- настроить апдейт сертификатов Let’s Encrypt
- поднять NGINX для HTTPS для Jenkins
- добавить скрипт удаления устаревших docker-образов (что-то вроде такого Bash – скрипт удаления образов с Docker Swarm нод)