관리 메뉴

ballqs 님의 블로그

[Docker] Docker Compose 본문

코딩 공부/Docker

[Docker] Docker Compose

ballqs 2024. 9. 27. 13:52

Docker Compose 란?

여러 개의 Docker Container를 하나의 서비스로 정의하고 구성하며 관리할 수 있게 하는 것

 

Docker Compose를 사용하는 이유는?

편하게 설정하기 : 여러 컨테이너를 한 파일에 적어서 설정

자동으로 배포 : Docker Compose가 컨테이너들을 알아서 만들어 줌

의존성 관리 : 컨테이너들간 서로 의존관계가 있다면 관리 해줌

모니터링과 로깅 : 컨테이너의 현 상황을 모니터링하여 보여주며 로그까지 남김

확장성 : 여러 컨테이너를 하나의 그룹으로 관리

유연성 : 개발 환경,테스트 환경,실제 운영 환경에서도 같은 설정 파일을 쓰기 가능

보안 강화 : 네트워크를 분리하여 외부로부터 접근을 제한

유지보수 용이 : 설정 파일 하나로 컨테이너를 관리하기에 바꿀 일 있으면 파일 수정하면 된다.


Docker compose 파일 설명

version: '3'
services:
  web:
    image: nginx:latest
    ports:
      - 80:80
    volumes:
      - ./web:/usr/share/nginx/html
    depends_on:
      - api
    links:
      - api:api
  api:
    image: java:latest
    volumes:
      - ./api:/app
    ports:
      - 8080:8080
    environment:
      - REDIS_HOST=redis
      - MYSQL_HOST=mysql
      - MYSQL_USER=root
      - MYSQL_PASSWORD=password
      - MYSQL_DATABASE=test
    depends_on:
      - mysql
      - redis
    links:
      - mysql:mysql
      - redis:redis
  redis:
    image: redis:latest
    ports:
      - 6379:6379
  mysql:
    image: mysql:latest
    ports:
      - 3306:3306
    volumes:
      - ./mysql:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=test
      - MYSQL_USER=root
      - MYSQL_PASSWORD=password

 

설명

  • version: Docker Compose의 버전을 정의합니다.
  • services: 네 개의 서비스를 정의합니다.
    • web 서비스는 Nginx 이미지를 사용하며, 포트 80번을 호스트 머신에 노출합니다.
    • api 서비스는 Java 이미지를 사용하며, 포트 8080번을 호스트 머신에 노출합니다.
    • redis 서비스는 Redis 이미지를 사용하며, 포트 6379번을 호스트 머신에 노출합니다.
    • mysql 서비스는 MySQL 이미지를 사용하며 포트 3306번을 호스트 머신에 노출합니다.
  • volumes:  web 서비스는 현재 디렉토리 내 web 디렉토리를 컨테이너에 연결합니다. api 서비스는 현재 디렉토리 내 api 디렉토리를 컨테이너에 연결합니다.  mysql 서비스는 현재 디렉토리 내 mysql 디렉토리를 사용하여 MySQL 데이터를 영구적으로 저장하게 합니다.
  • depends_on: 각 서비스 간의 의존성을 정의합니다. web 서비스는 api서비스에 의존합니다. api 서비스는 mysql과 redis 서비스에 의존합니다.
  • links: 각 서비스 간의 링크를 정의합니다. web 서비스는 api서비스에 링크됩니다. api 서비스는 mysql과 redis 서비스에 링크됩니다.

Docker Compose CLI

  • docker-compose [COMMAND] [SERVICES...]의 형태로 지정된 서비스(컨테이너)만 제어가 가능합니다. 예를 들어서 web, redis 중에 web만 기동하고 싶을 경우 docker-compose up -d web와 같이 실행합니다.`
  • docker-compose up
    • docker-compose up 실행시 다음의 순서로 진행합니다. 이미 생성된 경우 해당 단계를 건너뜁니다. (멱등성)
    1. 서비스를 띄울 네트워크 생성
    2. 필요한 볼륨 생성(혹은 이미 존재하는 볼륨과 연결)
    3. 필요한 이미지 풀(pull)
    4. 필요한 이미지 빌드(build)
    5. 서비스 실행 (depends_on 옵션 사용시 서비스 의존성 순서대로 실행)
  • --build
    • 이미 빌드가 되었더라도 강제로 빌드를 진행합니다.
  • -d
    • 백그라운드로 실행합니다.
  • --force-recreate
    • docker-compose.yml 파일의 변경점이 없더라도 강제로 컨테이너를 재생성합니다. 다시 말해서 컨테이너가 종료되었다가 다시 생성됩니다.
  • docker-compose down
    • 서비스를 멈추고 삭제합니다. 컨테이너와 네트워크를 삭제합니다.
  • --volume
    • 선언된 도커 볼륨도 삭제합니다.
  • docker-compose stop, docker-compose start
    • 서비스를 멈추거나, 멈춰 있는 서비스를 시작합니다.
  • docker-compose ps
    • 현재 환경에서 실행 중인 각 서비스의 상태를 표시합니다.
  • docker-compose logs

컨테이너 로그를 확인합니다.

  • -f
    • tail -f와 유사하게 컨테이너 로그를 실시간으로 확인합니다. (follow)
  • docker-compose exec
    • 실행 중인 컨테이너에 해당 명령어를 실행합니다.
docker-compose exec django ./manage.py makemigrations
docker-compose exec db psql postgres postgres
  • docker-compose run
    • 특정 명령어를 일회성으로 실행하지만 컨테이너를 batch성 작업으로 사용하는 경우에 해당합니다. 이미 기동하고 있는 컨테이너에 명령어를 실행하고자 하면 docker-compose exec을 사용하는 반면에 docker-compose run을 사용할 경우 컨테이너를 기동시키고 특정 명령어를 실행이 완료된 후에 컨테이너를 종료합니다.
docker-compose exec web echo "hello world" # 이미 실행된 web 컨테이너에서 echo "hello world"를 실행
docker-compose run web echo "hello world" # web 컨테이너에서 echo "hello world"를 실행하고 컨테이너 종료

사용 예제

사용한 git 예제 : https://github.com/nbcdocker/spring-boot-sample

docker-compose.yaml 작성

version: "3"
services:
  channel-api:
    image: xxxx.dkr.ecr.ap-northeast-2.amazonaws.com/reaction-channel:${AWS_ENV_STAGE:-dev}-${TAG:-latest}
    build:
      context: .
      dockerfile: dockerfile
      args:
        STAGE: ${STAGE:-develop}
    ports:
      - "8000:8000"
    environment:
      - NEW_RELIC_CONFIG_FILE=newrelic.ini
      - NEW_RELIC_ENVIRONMENT=ecs-${STAGE:-develop}
    logging:
      driver: awslogs
      options:
        awslogs-stream-prefix: channel
        awslogs-group: /ecs/reaction/${AWS_ENV_STAGE:-dev}/channel-api
        awslogs-region: ap-northeast-2

  reverseproxy:
    image: xxxxx.dkr.ecr.ap-northeast-2.amazonaws.com/reverseproxy:prod-channel-latest
    ports:
    - "80:80"
    - "81:81"
    logging:
      driver: awslogs
      options:
        awslogs-stream-prefix: reverseproxy
        awslogs-group: /ecs/reaction/${AWS_ENV_STAGE:-dev}/reverseproxy
        awslogs-region: ap-northeast-2

'코딩 공부 > Docker' 카테고리의 다른 글

[Docker] Docker Network  (0) 2024.09.27
[Docker] 명령어  (0) 2024.09.27
[Docker] Dockerfile 작성  (0) 2024.09.27