Docker: registry && Jenkins migrate

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

Задача – перенести сетап из постов 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]

Готово.

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