Docker/compose

docker compose 간 network 공유

PSAwesome 2021. 1. 23. 13:47
반응형

logstash 테스트를 위한 컴포즈 쪼개기와 docker-compose 간의 network 통신

 

안녕하세요.

 

시간이 지나 흐릿해지는 docker compose network 통신에 대한 글입니다.

 


여러 개의 컴포즈 파일이 있고, 상호간 통신을 원한다.

 

stack이라고 표현하는 swarm이나 k8s의 경우 cluster가 구축된 인프라에서 구축하고 각 container의 통신을 각 기술에 정의된 규칙으로 허용하게 됩니다.

 

이처럼 docker-compose 또한 자신의 파일이 하나의 node가 되어 컨테이너를 띄우는 형식으로 가장 간단한 옵션인

internal, external open의 방식을 사용해보았습니다.

반응형

먼저, elastic stack으로 run하게 될 docker-compose.yml 입니다.

  • node1
  • node2
  • node3
  • kibana

세 개의 elasticsearch 컨테이너와 하나의 키바나입니다.

 

다음으로 logstash-compose.yml입니다.

  • logstash
  • [optional] filebeat

 


두 컨테이너를 하나의 컴포즈로 합치면 별 다른 설정이 없어도 상호 통신이 가능합니다만,

logstash 와 filebeat 설정을 바꿀 때마다 elastic stack이 down / up 되는건 매우 효율적이지 못합니다.

분리하기

위에서 언급한 구성으로 컴포즈 파일을 분리하였습니다.

version: '3.7'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.10.1
    container_name: es01
    hostname: es01
    environment:
      - node.name=es01
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es02,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data01:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - elastic

  es02:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.10.1
    container_name: es02
    hostname: es02
    environment:
      - node.name=es02
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data02:/usr/share/elasticsearch/data
    ports:
      - 9201:9201
    networks:
      - elastic

  es03:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.10.1
    container_name: es03
    hostname: es03
    environment:
      - node.name=es03
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es02
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data03:/usr/share/elasticsearch/data
    ports:
      - 9202:9202
    networks:
      - elastic

  kib01:
    image: docker.elastic.co/kibana/kibana:7.10.1
    container_name: kib01
    ports:
      - 5601:5601
    environment:
      ELASTICSEARCH_URL: http://es01:9200
      ELASTICSEARCH_HOSTS: http://es01:9200
    networks:
      - elastic

volumes:
  data01:
    driver: local
  data02:
    driver: local
  data03:
    driver: local

networks:
  elastic:
    driver: bridge
    external: true
    internal: true

elk 공식 github의 내용과 비슷하며, external, internal 추가가 이번 글에서 핵심입니다.

컴포즈 실행 오류

docker-compose up

명령어를 실행하면 네트워크 생성 후 다시 시도하라는 메시지를 확인할 수 있습니다.

 

네트워크 생성 및 재실행

docker network create elastic

docker-compose up

 

network 생성 후 compose 실행

 

logstash 실행

logstash 실행

 

네트워크를 생성하고 활용하는 것이 맞냐는 스스로의 질문에선

운영 환경에서 컴포즈를 사용하는 일은 없을 것으로 생각이 됩니다.

로컬 환경에서의 테스트를 위한 컴포즈를 다양한 os에서 바로 테스트해볼 수 있게 되었습니다.

 

logstash와 filebeat 설정을 변경하고 재실행할 때 필요한 두 서버만 영향을 받는 것이 좋은 것 같네요.

 

감사합니다!

 

 

반응형