Docker: registry && Jenkins migrate

Автор: | 07/02/2017
 

Задача — перенести сетап из постов Docker: private registry в AWS [China] с S3 storage и Docker: AWS [China] – Jenkins в Docker на новый интанс.

VPC, EC2, EIP, EBS разделы и S3 корзина уже созданы.

Пост — совсем не HowTo, скорее просто заметка для себя.

Установка Docker

На новом интансе устанавливаем Docker:

curl https://get.docker.com | bash

Пока устанавливается Docker engine — «устанавливаем» Docker Compose:

scp -i /home/setevoy/Work/AKQA/LON.TAG/.ssh/tag-cn.pem docker-compose ubuntu@54.***.***.251:/tmp

На инстансе перемещаем исполняемый файл:

mv /tmp/docker-compose /usr/local/bin/

Docker EBS

Отключаем раздел на старой машине.

Проверяем:

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

Стопаем docker, отмонтируем раздел:

sudo service docker stop
sudo umount /dev/xvdc1

Выполняем detach EBS от старого интанса, аттачим к новому:

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

Монтируем к файловой системе:

sudo mkdir /docker
sudo mount /dev/xvdc1 /docker

Создаём конфиг для docker/etc/docker/daemon.json:

{
  "graph": "/docker/"
}

Перезапускаем docker:

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

Проверяем — выполняем pull:

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

pull не выполнялся, т.к. образ registry:2 уже имеется на подключенном разделе со старого интанса — ОК, всё работает.

Запуск Docker registry

Все файлы, созданные в первых двух частях (см. начало поста) были сохранены в репозиторий.

Клонируем:

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

Проверяем параметры (разделы) в compose-файле:

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

Копируем данные:

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/

Запускаем:

docker-compose up
dockerregistry_registry_1 is up-to-date
Attaching to dockerregistry_registry_1
...

Логинимся:

docker login registry.domain.cn:5000
Username: username
Password:
Login Succeeded

Проверяем pull:

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

Стопаем compose, запускаем демоном:

docker-compose up -d

Готово.

Запуск Jenkins в Docker

Аналогично разделу /docker — переносим EBS с данными Jenkins:

sudo umount /dev/xvdb1

detach-attach, поключаем диск к новому интансу как /dev/xvdb:

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

Монтируем его:

sudo mkdir /jenkins
sudo mount /dev/xvdb1 /jenkins/

Меняем пользователя:

sudo chown -R ubuntu:ubuntu /jenkins/

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

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

Переходим в репозиторий с файлами для запуска Jenkins:

cd ../jenkins/

Запускаем — образы не пулятся, всё уже есть на разделе /docker:

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

Проверяем Jenkins:

curl localhost
curl: (56) Recv failure: Connection reset by peer

WTF?

Запускаем Jenkins вручную:

docker run -ti -p 80:8080 -v /jenkins/:/jenkins -e JENKINS_HOME='/jenkins' registry.domain.cn:5000/tagjenkins

Проверяем:

curl localhost
<html><head><meta http-equiv='refresh' content='1;url=/login?from=%2F'/>
...

Работает. Какого тогда?

Находим сеть, созданную Docker Compose для Jenkins:

docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
9aaaa15cd7ce        bridge              bridge              local
077cf63b25bf        host                host                local
47dbd88bd306        jenkins_default     bridge              local

Удаляем её:

docker network rm jenkins_default
jenkins_default

Запускаем Compose ещё раз:

docker-compose up

Проверяем:

curl localhost
<html><head><meta http-equiv='refresh' content='1;url=/login?from=%2F'/>
...

Готово.

Потребуется ещё несколько мелочей: