ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Docker-composes 사용하기
    TIL 2023. 3. 6. 08:31

    1. Docker Compose 개요

    Docker compose란, 여러 개의 컨테이너로부터 이루어진 서비스를 구축, 실행하는 순서를 자동으로 하여, 관리를 간단히하는 기능이다.

    Docker compose에서는 compose 파일을 준비하여 커맨드를 1회 실행하는 것으로, 그 파일로부터 설정을 읽어들여 모든 컨테이너 서비스를 실행시키는 것이 가능하다.

    2. Docker Compose를 사용하기까지의 주요한 단계


    Docker compose를 사용하기 위해서는, 크게 나눠 아래의 세 가지 순서로 이루어진다.

    1 ) 각각의 컨테이너의 Dockerfile를 작성한다(기존에 있는 이미지를 사용하는 경우는 불필요).

    2 ) docker-compose.yml를 작성하고, 각각 독립된 컨테이너의 실행 정의를 실시한다(경우에 따라는 구축 정의도 포함).

    3 ) "docker-compose up" 커맨드를 실행하여 docker-compose.yml으로 정의한 컨테이너를 개시한다.

    Docker compose는 start, stop, status, 실행 중의 컨테이너의 로그 출력, 약간의 커맨드의 실행이과 같은 기능도 가지고 있다.

    3. docker-compose.yml 파일이란


    docker-compose.yml 파일은 아래와 같이 yaml으로 Docker 컨테이너에 관한 실행 옵션(build 옵션도 포함되어 있는 경우도 있다)를 기재한 파일이 된다.

    web:
      build: .
      ports:
       - "5000:5000"
      volumes:
       - .:/code
      links:
       - redis
    redis:
      image: redis
    
    # yaml의 기재 방법에 대해서는 아래의 링크를 참고하길 바란다.
    # https://docs.docker.com/compose/compose-file/

    이 파일에 기재되어 있는 내용은 기본적으로 docker build, docker run 커맨드 지정하는 것이 가능한 옵션이 되지만, Docker compose의 yaml 파일로써 기술하는 것으로 여러 개의 컨테이너로부터 만들어진 서비스를 조감하여 보는 것도 가능해져, 보존성의 수고를 가볍게 한다.

    4. 환경변수 파일로 추가하기


    배포용 Compose 파일에 환경변수를 하나하나 다 적어넣거나, 매번 쉘에서 변수로 직접 선언시키는 방법은 다소 비효율적이다. 필요한 환경변수 항목들만 골라내어 별도의 파일로 구성해 둔다면 환경변수 관리를 보다 효율적으로 할 수 있을 것이다.

    Docker Compose에서 환경변수 정보들을 떼어 별도의 파일로 구성할 때 가장 간편한 방법은 Compose 파일이 위치한 동일 경로에 .env 파일을 따로 구성하는 것이다. 이 .env 파일은 평문 텍스트 포맷으로, 아래의 문법을 따라 작성해야 한다.

    • 각 줄마다 변수명=값의 형태로 입력한다.
    • 주석 처리는 # 문자를 이용한다.
    • 비어있는 줄은 무시된다.
    • 따옴표 처리('', "")는 불필요하다. 입력된 따옴표는 위치에 따라 변수명이나 값의 일부분으로 간주된다.

    이렇게 작성된 .env 파일은 별다른 설정 없이도 Compose 파일에 바로 반영된다. 아래 Compose 파일을 예시로 살펴보자.

    version: '3.9'
    services:
      mysql:
        image: mysql:8
        restart: unless-stopped
        environment:
          MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}

    위에서 ${MYSQL_ROOT_PASSWORD}로 명명된 자리에 들어갈 값을 .env 파일에 아래와 같이 삽입한다.

    MYSQL_ROOT_PASSWORD=password

    이 상태에서 Compose 파일을 convert 시켜보면 아래와 같이 출력되는 것을 볼 수 있다.

    $ docker compose convert
    # ...
    # environment:
    #   MYSQL_ROOT_PASSWORD: password

    이처럼 .env 파일을 이용하는 방식은 간편하기는 하지만, 오직 Docker Compose에서 docker compose up 명령을 수행할 때에만 활용 가능하다는 점에 유의하자. Docker Swarm에서 docker stack deploy를 실행할 경우에는 .env 파일을 사용할 수 없다.

    5. 내 서비스에 적용 해보기


     

    version: '2'
    services:
      zookeeper:
        image: wurstmeister/zookeeper
        ports:
          - "2181:2181"
        networks:
          my-network:
            ipv4_address: 172.18.0.100
      kafka:
        image: wurstmeister/kafka
        ports:
          - "9092:9092"
        environment:
          KAFKA_ADVERTISED_HOST_NAME: 172.18.0.101
          KAFKA_CREATE_TOPICS: "test:1:1"
          KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
        depends_on:
          - zookeeper
        networks:
          my-network:
            ipv4_address: 172.18.0.101
      connect:
        image: cnfldemos/cp-server-connect-datagen:0.5.3-7.1.0
        ports:
          - "8083:8083"
        environment:
          CONNECT_BOOTSTRAP_SERVERS: kafka:9092
          CONNECT_REST_PORT: 8083
          CONNECT_REST_ADVERTISED_HOST_NAME: connect
          CONNECT_GROUP_ID: compose-connect-group
          CONNECT_CONFIG_STORAGE_TOPIC: docker-connect-configs
          CONNECT_OFFSET_STORAGE_TOPIC: docker-connect-offsets
          CONNECT_STATUS_STORAGE_TOPIC: docker-connect-status
          CONNECT_CONFIG_STORAGE_REPLICATION_FACTOR: 1
          CONNECT_OFFSET_STORAGE_REPLICATION_FACTOR: 1
          CONNECT_STATUS_STORAGE_REPLICATION_FACTOR: 1
          CONNECT_PLUGIN_PATH: "/usr/share/java,/usr/share/confluent-hub-components"
          CONNECT_KEY_CONVERTER: org.apache.kafka.connect.json.JsonConverter
          CONNECT_VALUE_CONVERTER: org.apache.kafka.connect.json.JsonConverter
          CONNECT_INTERNAL_KEY_CONVERTER: "org.apache.kafka.connect.json.JsonConverter"
          CONNECT_INTERNAL_VALUE_CONVERTER: "org.apache.kafka.connect.json.JsonConverter"
        volumes:
          - ./mysql-connector:/usr/share/java/kafka
          - ./jdbc:/etc/kafka-connect/jars      
        depends_on:
          - kafka
          - zookeeper
        networks:
          my-network:
            ipv4_address: 172.18.0.102
    
    networks:
      my-network:
        name: joinus-network

     

    'TIL' 카테고리의 다른 글

    [성능개선] 한방 쿼리로 최적화  (1) 2023.03.13
    Ubuntu 라우팅 꼬였을때 초기화 방법  (0) 2023.03.06
    Kafka Connector 구성하기  (2) 2023.02.27
    특정 포트 막혀있을 때 해결 방법  (1) 2023.02.27
    FeignClient vs RestTemplate  (1) 2023.02.13
Designed by Tistory.