1. Docker Compose 란?

보통 도커에서 이미지 하나당 하나의 컨테이너를 만들어서 관리한다

이런 컨테이너를 연결하여 동시에 관리하는 툴이라고 볼 수 있다

 

2. Docker Compose 사용 및 용어정리

Docker Compose 는 .yaml 확장자의 파일을 작성하여 실행한다

JSON과 같이 Key, Value로 이루어져 있다

하지만 JSON과는 다르게 들여쓰기로 리스트를 구분한다

 

아래 예시는 3개의 노드와  elasticsearch, kibana 컨테이너 구성이다

 

예시)

version: '2.2'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.7.1
    container_name: 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.7.1
    container_name: 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.7.1
    container_name: 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.7.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

 

1) version

- 파일 규격 버전

- 규격에 따라 지원 내용이 다르기 때문에 아래 링크를 참고하자

https://docs.docker.com/compose/compose-file/compose-versioning/

 

Compose file versions and upgrading

 

docs.docker.com

 

2) services

- 컨테이너 정의 (=container)

 

3) image

- 서비스의 컨테이너를 생성할 때 쓰일 이미지의 이름을 설정

- 도커에 존재하면 존재하는 이미지를 사용한다

- 만일 이미지가 도커에 존재하지 않으면 도커 허브에서 자동으로 내려받는다

 

4) environment

- docker run에 -env, -e 옵션과 동일한 역할, 엘라스틱 환경설정

- node.name : 노드이름

- cluster.name : 클러스터명 (클러스터명을 기준으로 노드가 join 한다)

- discovery.seed_hosts : 디스커버리 설정, 클러스터를 구성할 노드에 대한 정의
- cluster.initial_master_node : 마스터로 선출될 후보 노드 초기 세팅

- bootstrap.memory_lock : 엘라스틱이 사용할 메모리 Lock

- ES_JAVA_OPTS : jvm이 사용 가능한 힙 사이즈 결정

 

5) Ulimits

- 프로세스 지원 한도 설정

- memlock : 메모리 내 주소 공간의 최대 크기

(soft : 기본 적용 값, hard : soft에서 최대로 늘릴 한도)

 

6) volumes

- docker run에 -v 옵션과 동일한 역할

- 공유 볼륨 설정

- 호스트pc 폴더와 컨테이너 내부 폴더를 바인딩 하는것

 

7) port

- docker run에 -p 옵션과 동일한 역할

- 공유할 포트 설정 ( 로컬포트 : 컨테이너 포트)

 

8) networks

- 컨테이너간 네트워크의 분리를 위한 추가 설정 부분

- 대형 서비스가 아닌 이상 보통 하나의 네트워크 안에서 여러 도커를 씀

 

9) 이 외

restart : 컨테이너가 다운되었을 시 항상 재시작하라는 설정

depends_on : 해당 컨테이너가 생성되기 이전에 먼저 생성되야하는 도커 지정

links : 컨테이너 내부에서 다른 컨테이너에 접속하고 싶을때 사용하는 옵션

build : dockerHub에서 다운받은 이미지가 아닌 dockerfile 기반으로 컨테이너를 작성하고 싶을때 사용

 

3. Docker Compose 명령어

먼저 .yaml 파일이 있는 곳으로 이동한 뒤 명령어를 친다

 

1) 실행

1) docker-compose up

2) docker-compose up -d

// -d는 백그라운드에서 실행한다는 옵션이다
// 해당 옵션이 없으면 docker의 출력물만 나오고
// 다른 명령은 실행할 수 없게 된다

 

2) 이미지 재빌드

docker-compose up --build -d

 

3) 중지

docker-compose stop

 

4) 삭제

docker-compose down

 

5) 로그 확인

docker-compose logs

 

6) 실행 중인 docker compose의 docker-compose.yml 설정 확인

docker-compose config

 

7) 실행 중인 컨테이너에 명령어를 실행

docker-compose exec <컨테이너 이름>

'DevOps' 카테고리의 다른 글

[DevOps] Grafana Alert  (0) 2023.12.05
[DevOps] 도커 네트워크 종류  (0) 2023.07.19
[DevOps] MobaXterm 설치 및 사용방법 (SSH 접속)  (0) 2023.06.26
[DevOps] 리눅스란? CentOS vs Ubuntu  (0) 2023.06.21
[DevOps] JMeter 사용 방법  (0) 2022.12.09