반응형

본 내용은 인프런의 데브위키님의 강의 "개발자를 위한 쉬운 도커" 내용을 바탕으로 정리한 내용입니다.

도커 컴포즈란?

  • 도커 환경에서 여러 개의 도커 컨테이너를 관리하기 위한 도구이다.
  • 도커 데스크탑 설치 시 기본으로 설치된다.
  • 한 번의 명령어로 여러개의 컨테이너를 한번에 실행하거나 종료할 수 있다.
  • 로컬 개발 환경에서 활용하기 편리하다.

그림 1) 도커 컴포즈

docker-compose.yml

  • 도커 컴포즈를 통해 관리할 컨테이너(서비스)를 정의하는 파일이다.
  • 서비스, 네트워크 볼륨들을 정의한다.

그림 2) 도커 컴포즈 명령어

hitchecker

  • hitchecker는 특정 콘텐츠 또는 웹페이지의 접속 시도 횟수를 외부 캐시 저장소인 Redis에 저장하고 분석하는 도구이다.
  • hitchecker가 종료 또는 재생성 되어도 Redis에 접속 시도 횟수가 저장되어 있기에 계속해서 누적이 된다.
  • docker compose를 사용해서 한 번에 hitchecker 와 Redis 서버를 구성할 수 있다.

예시 2) hitchecker 예시

소스코드 다운로드 및 초기화

# 소스코드 다운로드
git clone https://github.com/daintree-henry/build.git

# 소스코드 변경사항 초기화
git reset --hard HEAD ; git clean -fd

# 소스코드의 버전 변경
git switch 02-practice 

 

easydocker/build/hitchecker/app/app.py
: 특정 경로에서 어떤 행동을 할지 정의한다.

from flask import Flask
from redis import Redis

app = Flask(__name__)
# 레디스 접속 정보 설정
redis = Redis(host='redis',port=6379)

@app.route('/')
def hello():
# 경로 접근시 redis의 캐시값을 증가시키고 증가된 값을 출력
     redis.incr('hits')
     return 'Hit Checked! 이 페이지는 %s번 방문되었습니다.' % redis.get('hits').decode('utf-8')

if__name__ =="__main__":
    app.run(host="0.0.0.0",debug=True)

 

easydocker/build/hitchecker/app/Dockerfile

FROM python:3.7-alpine
WORKDIR /app
COPY . /app
# 애플리케이션실행에필요한라이브러리설치
RUN pip install flask redis
CMD ["python", "app.py"]

 

easydocker/compose/hitchecker/docker-compose.yml
: 도커 컴포즈 설정 파일

# API 버전을 정의
version: '3'
services:
  # hitchecker 컨테이너의 경우 사용자가 개발한 애플리케이션이기에 실행 시 빌드 필요
  hitchecker:
    # 이미지 빌드 시 사용할 Dockerfile 경로
    build:./
    # 이미지 빌드 및 컨테이너 실행 시 사용할 이미지 태그
    # redis의 경우 외부의 이미지를 다운받아서서
    image:hitchecker:1.0.0
    ports:
      - "5000:5000"
    # 컨테이너 종료 시 자동으로 재시작
    restart: always
   redis:
      # 컨테이너실행시사용할이미지태그
      image:"redis:alpine"

 

Docker Compose 명령어 테스트

# easydocker/compose/hitchecker에서 실행
cd build/07/hichecker

# 1. docker-compose.yml파일에서 build 옵션이 있는 서비스를 찾아서 이미지를 빌드
$ docker compose build

# 2. 빌드된 이미지 확인
$ docker image ls

# 3. 컨테이너 실행
# 기존 이미지가 존재하면 해당 이미지로 컨테이너 실행
$ docker compose up -d

# 4. 컨테이너 상태 확인
$ docker compose ps
# localhost:5000 접속 : 방문할 때마다 방문횟수가 1씩 증가한다.

# 5. 컨테이너 로그 확인
$ docker compose logs

# 6. 컨테이너 삭제 후 재실행 및 localhost:5000 접속, 값이 그대로 남아있는지 확인
$ docker rm –f {컨테이너명}

# 7. 서비스의 삭제
$ docker compose down
# 도커의 볼륨도 같이 삭제한다.
$ docker compose down -v

 

그림 3) 로컬에 동일한 이미지가 있으면 해당 이미지를 제거하고 새로운 이미지로 빌드한다.

 

예시 3) 이중화DB, 공통변수 활용

easydocker/build/multidb/docker-compose.yml

version: '3'
services:
  # 첫번째 컨테이너
  postgres-primary-0:
     image: bitnami/postgresql-repmgr:15
     volumes:
        - ostgres_primary_data:/bitnami/postgresql
     environment:
        POSTGRESQL_POSTGRES_PASSWORD:adminpassword
        POSTGRESQL_USERNAME:myuser
        POSTGRESQL_PASSWORD:mypassword
        POSTGRESQL_DATABASE:mydb
        REPMGR_PASSWORD:repmgrpassword
        REPMGR_PRIMARY_HOST:postgres-primary-0
        REPMGR_PRIMARY_PORT:5432
        REPMGR_PARTNER_NODES:postgres-primary-0,postgres-standby
1:5432
        REPMGR_NODE_NAME:postgres-primary-0
        REPMGR_NODE_NETWORK_NAME:postgres-primary-0
        REPMGR_PORT_NUMBER:5432

# 두번째 컨테이너
postgres-standby-1:
    image:bitnami/postgresql-repmgr:15
    volumes:-postgres_standby_data:/bitnami/postgresql
    environment:
       POSTGRESQL_POSTGRES_PASSWORD:adminpassword
       POSTGRESQL_USERNAME:myuser
       POSTGRESQL_PASSWORD:mypassword
       POSTGRESQL_DATABASE:mydb
       REPMGR_PASSWORD:repmgrpassword
       REPMGR_PRIMARY_HOST:postgres-primary-0
       REPMGR_PRIMARY_PORT:5432
       REPMGR_PARTNER_NODES:postgres-primary-0,postgres-standby-1:5432
       REPMGR_NODE_NAME:postgres-standby-1
       REPMGR_NODE_NETWORK_NAME:postgres-standby-1
       REPMGR_PORT_NUMBER:5432
volumes:
   postgres_primary_data:
   postgres_standby_data:

easydocker/build/multidb-env/docker-compose.yml(공통변수부분 지정)

version:'3'
x-environment:&common_environment
   POSTGRESQL_POSTGRES_PASSWORD:adminpassword
   POSTGRESQL_USERNAME:myuser
   POSTGRESQL_PASSWORD:mypassword
   POSTGRESQL_DATABASE:mydb
   REPMGR_PASSWORD:repmgrpassword
   REPMGR_PRIMARY_HOST:postgres-primary-0
   REPMGR_PRIMARY_PORT:5432
   REPMGR_PORT_NUMBER:5432
services:
   postgres-primary-0:
       image: bitnami/postgresql-repmgr:15
       volumes:
          - postgres_primary_data:/bitnami/postgresql
       environment:
          # 공통변수부분 지정
          <<:*common_environment
          REPMGR_PARTNER_NODES:postgres-primary-0,postgres-standby-1:5432
          REPMGR_NODE_NAME:postgres-standby-1
          REPMGR_NODE_NETWORK_NAME:postgres-standby-1
volumes:
   postgres_primary_data:
   postgres_standby_data:

Docker Compose 적용하기

  • 도커 컴포즈를 통해 Leafy 애플리케이션을 개발자 PC에 빠르게 구성할 수 있다.
  • Leafy front 개발자 또는 Leafy Backend 개발자는 나머지 모듈 들을 빠르게 구성할 수 있다.
  • 외부 모듈을 개발하는 개발자는 PC에 Leafy-front, Leafy-backend 소스코드가 없어도 빠르게 환경을 구동시킬 수 있다.
  • 프론트 개발자의 경우 DB와 서버는 도커 컴포즈를 이용하여 이미지를 실행시키고 프론트엔드 소스를 수정하면 된다.

예시 1) 디렉터리 이동 및 소스코드 상태 변경

# 1. easydocker/leafy, 소스코드 작성을 뛰어넘으려면 git switch 07-compose 실행
git reset --hard HEAD ; git clean -fd
git switch 07-compose-init

 

예시 4) easydocker/leafy/docker-compose.yml

leafy-postgres 설정

  • 외부 이미지를 사용하여 컨테이너를 실행한다.
  • 네트워크는 컴포즈가 default로 생성한다.

leafy-backend 설정 1

  • backend 이미지가 있으면 실행 없으면 이미지를 빌드한다.

leafy-backend 설정 2

  • 데이터베이스 접속을 위한 환경 변수값을 지정한다.

leafy-backend 설정 3

  • 특정 컨테이너( leafy-postgres) 실행전 까지 컨테이너( leafy-backend) 실행을 보류한다.

 

leafy-front 설정

 

예시 2) Docker Compose 실행테스트

# 1. 컨테이너 실행 및 서비스 접속 테스트 후 컨테이너 종료
$ docker compose up -d
$ docker compose down

 

예시 5) easydocker/leafy/docker-compose.yml에 설정 추가

  • 볼륨 추가
  • leafy-postgres에 빌드 속성 추가

  • 리소스 사용량을 제한

반응형

+ Recent posts