Gitlab + Gitlab CI + Docker registry с помощью docker-compose

Apr 17, 2017 13:57 · 676 words · 4 minute read gitlab gitlab ci docker docker-compose

В одной из предыдущих статей мы подробно рассматривали процесс переноса данных omnibus-установки в docker-установку, целью которого было избавление от головной боли при обновлениях Gitlab.

В результате у нас получался «монолитный» docker-контейнер с redis + postgres + Gitlab в одном флаконе. Давайте разберемся, как разделить этот монолит по нескольким контейнерам и заодно серьезно расширить функциональность, добавив в установку приватный docker-registry и фундамент для Gitlab CI!

Считаем, что у нас уже установлен docker-engine. Установить docker-compose довольно несложно:

sudo curl -L https://github.com/docker/compose/releases/download/1.11.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Сделаем резервную копию данных актуальной версии Gitlab, которую мы запускали в docker-контейнере с именем gitlab:

sudo docker exec -it gitlab gitlab-rake gitlab:backup:create

После успешного выполнения команды в каталоге /srv/gitlab/data/backups на хост-машине появится бекап (например, с именем 1487683641_2017_03_03_gitlab_backup.tar).

Удаляем контейнер с установленным Gitlab, с которым работали ранее — теперь он нам больше не понадобится:

sudo docker rm -f gitlab

В дальнейшем работаем с утилитой docker-compose. Создадим каталог для проекта и перейдем в него:

sudo mkdir -p /opt/gitlab-with-registry && cd /opt/gitlab-with-registry

В каталоге проекта создаем конфигурационный файл docker-compose.yml следующего содержания:

version: '2'
services:
  redis:
    container_name: gitlab-redis
    restart: always
    image: sameersbn/redis:latest
    command:
    - --loglevel warning
    volumes:
    - /srv/redis:/var/lib/redis:Z
    networks:
    - mynet
 
  postgresql:
    container_name: gitlab-postgres
    restart: always
    image: sameersbn/postgresql:9.6-1
    volumes:
    - /srv/postgresql:/var/lib/postgresql:Z
    environment:
    - DB_USER=gitlab
    - DB_PASS=password
    - DB_NAME=gitlabhq_production
    - DB_EXTENSION=pg_trgm
    networks:
    - mynet
 
  gitlab:
    container_name: gitlab
    restart: always
    image: sameersbn/gitlab:8.17.2
    depends_on:
    - redis
    - postgresql
    ports:
    - "10080:80"
    - "10022:22"
    volumes:
    - /srv/gitlab/data:/home/git/data:Z
    - /srv/gitlab/logs:/var/log/gitlab
    - /srv/certs:/certs
    environment:
    - DEBUG=false
 
    - DB_ADAPTER=postgresql
    - DB_HOST=postgresql
    - DB_PORT=5432
    - DB_USER=gitlab
    - DB_PASS=password
    - DB_NAME=gitlabhq_production
 
    - REDIS_HOST=redis
    - REDIS_PORT=6379
    - GITLAB_SSH_PORT=10022
    - GITLAB_PORT=10080
    - GITLAB_HOST=git.labs.lc
 
    - GITLAB_SECRETS_SECRET_KEY_BASE=neraterandomstringstasdasdghjfkajfhsakjfhk234hkwdjhfdskjfhsdkjf
    - GITLAB_SECRETS_OTP_KEY_BASE=dfjdsafjsaglhjsdlkfjghsldfghjdslfjghsldfghjsldjfhgsldkjfhglsjdfghdslfghjldsjfhgdsljfghdsljfghsldjfghdsljghf
    - GITLAB_SECRETS_DB_KEY_BASE=superrandomsecret
 
    - GITLAB_REGISTRY_ENABLED=true
    - GITLAB_REGISTRY_HOST=registry.git.labs.lc
    - GITLAB_REGISTRY_PORT=5000
    - GITLAB_REGISTRY_API_URL="https://registry.git.labs.lc:5000/"
    - GITLAB_REGISTRY_KEY_PATH=/certs/registry-auth.key
    - SSL_REGISTRY_CERT_PATH=/certs/registry.crt
    - SSL_REGISTRY_KEY_PATH=/certs/registry.key
    networks:
     mynet:
      aliases:
      - git.labs.lc
 
  registry:
    container_name: docker-registry
    restart: always
    image: registry:2.4.1
    volumes:
    - /srv/gitlab/shared/registry:/registry
    - /srv/certs:/certs
    environment:
    - REGISTRY_LOG_LEVEL=info
    - REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/registry
    - REGISTRY_AUTH_TOKEN_REALM=http://git.labs.lc:10080/jwt/auth
    - REGISTRY_AUTH_TOKEN_SERVICE=container_registry
    - REGISTRY_AUTH_TOKEN_ISSUER=gitlab-issuer
    - REGISTRY_AUTH_TOKEN_ROOTCERTBUNDLE=/certs/registry-auth.crt
    - REGISTRY_STORAGE_DELETE_ENABLED=true
    - REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.crt
    - REGISTRY_HTTP_TLS_KEY=/certs/registry.key
    ports:
    - "0.0.0.0:5000:5000"
    networks:
     mynet:
      aliases:
      - registry.git.labs.lc
 
  gitlab-runner:
   container_name: gitlab-runner
   image: gitlab/gitlab-runner:latest
   volumes:
     - /srv/gitlab-runner/data:/home/gitlab_ci_multi_runner/data
     - /srv/gitlab-runner/config:/etc/gitlab-runner
     - /var/run/docker.sock:/var/run/docker.sock:rw
   environment:
     - CI_SERVER_URL=http://git.labs.lc:10080/ci
   restart: always
   dns: 192.168.0.1
 
networks:
  mynet:

Согласно данному файлу, будут запущены пять docker-контейнеров (gitlab-redis, gitlab-postgres, gitlab, docker-registry и gitlab-runner). Именно два последних контейнера из списка и позволят нам расширить функциональность обычной установки Gitlab — docker-registry это приватный репозиторий для docker-образов, а gitlab-runner — важнейшее звено Gitlab CI (Gitlab Continuous Integration), которую мы будем использовать в будущем.

Находясь в каталоге проекта запускаем все контейнеры с помощью docker-compose, чтобы создались необходимые каталоги, после чего останавливаем контейнеры:

sudo docker-compose -f docker-compose.yml up -d && sudo docker-compose stop

При запуске контейнеров будет создан каталог /srv/docker/gitlab/gitlab на хост машине, внутри которого будет находиться папка backups — перекладываем в нее созданный ранее бекап после чего восстанавливаем данные командой:

sudo docker-compose run --rm gitlab app:rake gitlab:backup:restore BACKUP=1487683641_2017_03_03

Запускаем всю связку, описанную в конфигурационном файле docker-compose.yml:

sudo docker-compose -f docker-compose.yml up -d

Для всех старых проектов необходимо вручную включить Registry (на странице проекта “Settings -> Edit Project”, чекбокс “Container Registry”), для новых же проектов этот компонент будет включаться по умолчанию.

Для корректной работы Registry необходимо сгенерить самоподписанные сертификаты (или использовать бесплатные от Let’s Encrypt), для этого переходим в каталог /srv/certs:

cd /srv/certs

Создаем скрипт make_certs.sh (не забываем сделать его исполняемым) следующего содержания:

#/bin/bash
 
#####echo "Create Signing Key and CSR"
openssl req -nodes -newkey rsa:2048 -keyout registry-auth.key -out registry-auth.csr -subj "/CN=git.labs.lc"
#####echo "Self-Sign Certificate"
openssl x509 -in registry-auth.csr -out registry-auth.crt -req -signkey registry-auth.key -days 3650
 
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -days 1024 -out rootCA.pem
openssl genrsa -out registry.key 2048
openssl req -new -key registry.key -out registry.csr
###### Common Name
####Common Name (eg, YOUR name) []: registry.git.labs.lc
openssl x509 -req -in registry.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out registry.crt -days 500

Примечание. В процессе генерации сертификатов обязательно в Common Name указываем имя домена, на котором будет висеть реестр, например: Common Name (eg, YOUR name) []: registry.git.labs.lc.

Для доступа к странице Registry из браузера необходимо подключиться к контейнеру с Gitlab:

sudo docker exec -it gitlab bash

и выполнить следующие команды:

cp /certs/* /usr/local/share/ca-certificates/
update-ca-certificates --fresh
tweet Share