Docker: Compose и общие сети

Автор: | 08/20/2019
 

Имеется Docker Compose стек с Jenkins, SonarQube и PostgresSQL, см. пост SonarQube: запуск в Docker и вызов из Jenkins Pipeline.

Проблема в том, что они описаны в одном Compose-файле, и весь стек перезапускается единым systemd-файлом (см. Linux: systemd сервис для Docker Compose).

Соответственно, если надо перезапустить SonarQube — то придётся перезапускать и Jenkins, на котором постоянно запущены билды.

Задача — разделить их на два Compose-файла, но при этом оставить возможность коммуникации между сервисами по именам контейнеров, что бы не перепиливать настройки.

Решеине — использовать общую сеть через external.

Версия Compose — 3.5.

Jenkins network

В Compose-файле Jenkins добавляем name — создаём custom network с именем jenkins:

version: '3.5'

networks:
 jenkins:
   name: jenkins

services:

  jenkins:
    user: root
    image: jenkins/jenkins:2.176.2
    networks:
      - jenkins
    ports:
      - '8080:8080'
      - '50000:50000'
    environment:
      - JENKINS_HOME=/var/lib/jenkins
      - JAVA_OPTS=-Duser.timezone=Europe/Kiev
      - JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dhudson.model.DirectoryBrowserSupport.CSP=\"default-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' 'unsafe-inline' data:;\""
    logging:
      driver: "journald"

Иначе Docker создаст сеть с именем имясервиса_имясети, хочется большей определённости.

SonarQube network

А в Compose-файле SonarQube и PostgresSQL — создаём сеть sonar как external сети jenkins:

version: '3.5'

networks:
  sonar:
    external:
      name: jenkins

services:
  sonarqube:
    user: 1004:1004
    image: sonarqube:7.9.1-community
    ports:
      - "9000:9000"
    networks:
      - sonar
    environment:
      - sonar.jdbc.url=jdbc:postgresql://db:5432/sonar
    volumes:
      - /data/sonarqube/conf:/opt/sonarqube/conf
      - /data/sonarqube/logs:/opt/sonarqube/logs
      - /data/sonarqube/temp:/opt/sonarqube/temp
      - /data/sonarqube/data:/opt/sonarqube/data
      - /data/sonarqube/extensions:/opt/sonarqube/extensions
      - /data/sonarqube/bundled_plugins:/opt/sonarqube/lib/bundled-plugins
    logging:
      driver: "journald"
    
  db: 
    image: postgres
    networks:
      - sonar 
    environment:
      - POSTGRES_USER=sonar
      - POSTGRES_PASSWORD=sonar
    volumes:
      - /data/sonarqube/postgresql:/var/lib/postgresql
      - /data/sonarqube/postgresql_data:/var/lib/postgresql/data
    logging:
      driver: "journald"

Проверяем сети:

root@jenkins-production:/opt/jenkins# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
...
fb22545d1fae        jenkins             bridge              local
...

Проверяем контейнеры, использующие эту сеть:

root@jenkins-production:/opt/jenkins# docker network inspect jenkins | jq '.[] | .Containers[].Name'
"jenkins_db_1"
"jenkins_sonarqube_1"
"jenkins_jenkins_1"

И проверяем подключение, используя имя сервиса из SonarQube Compose — sonarqube:

root@jenkins-production:/opt/jenkins# docker exec -ti jenkins_jenkins_1 curl -I sonarqube:9000
HTTP/1.1 200

Или db:

root@jenkins-production:/opt/jenkins# docker exec -ti jenkins_jenkins_1 telnet db 5432
Trying 172.20.0.3...
Connected to db.
Escape character is '^]'.

Готово.