[Docker] Docker compose가 뭐야?

yeeunsy·2024년 12월 13일
post-thumbnail

Docker compose란?

여러 개의 Docker 컨테이너들을 하나의 서비스로 정의하고 컨테이너로 묶어서 관리하고 실행하는 도구 입니다.

Docker compose는 어떻게 등장했는가?

지금까지는 Docker에서 컨테이너를 개별적으로 관리해왔습니다.
하지만 애플리케이션이 복잡해지면서 여러 컨테이너를 관리하는 것은 어려워졌죠.

이러한 문제를 보안하기 위해 2014년도에 구조화된 파일, 즉 시스템 구축에 필요한 명령어의 설정을 정의해주는 Docker compose 파일인
'YAML'(야믈 혹은 야멜)이라는 이름의 파일이 생겼습니다.
이는 전체 시스템 일괄 실행(run) 또는 일괄 종료 및 삭제(down)를 실행할 수 있는 도구와 같습니다.

여러 개의 명령어를 하나의 정의 파일로 합쳐서 실행할 수 있는 것이죠!

🔷 현재 Docker Desktop은 Docker compose가 함께 설치되기 때문에
추가로 설치할 필요가 없습니다 !

언제 쓰이는가?

개발 프로덕션 환경에서 여러 서비스로 구성되어있는 프로젝트를 빠르게 실행하고 관리하기 위함입니다.

만약 대규모 프로젝트에서 Docker를 사용하게 될 경우,
수많은 컨테이너들을 관리하게 된다면 테스트 단계에서 각 컨테이너에 들어가서 하나하나 명령어를 입력하는 작업을 반복하는 것을 방지하기 위해 쓰입니다.

docker compose 파일 예시

#docker-compose.yml

services:
  mysql:			# 식별 가능한 이름 ex) web-db, server-db ..
    image: mysql:latest
    environment:	# 환경 변수 설정 (.env의 내용과 동일)
      MYSQL_ROOT_PASSWORD: mydb
      MYSQL_DATABASE: USER_DB
    volumes:		# 데이터가 저장되는 경로 (docker desktop이 있다면 volumes에서 확인 가능)
      - mysql_data:/var/lib/mysql
    ports:
      - '3306:3306'  # 개인 환경에 맞춰주기
      
  game-server:
    build:
      context: ./app_SERVER		# 해당 디렉토리를 docker이미지로 빌드하는 경로로 사용 ex) . 
      dockerfile: Dockerfile    # dockerfile 경로 ex) ./web/dockerfile
    ports:
      - '3306:3000' # 서버 포트 개인 환경에 맞춰주기
    environment:
      - PORT=3000	# 내부 포트
      - HOST=0.0.0.0	# IPv4를 사용하는 주소는 전부 허용
      - CLIENT_VERSION=1.0.0
      - DB1_HOST=mysql
      - DB1_PORT=3306
      - DB1_USER=root
      - DB1_PASSWORD=mysb
      - REDIS_HOST=redis	# 의존하는 이미지의 HOST를 공유
      - REDIS_PORT=6379
    depends_on:		# 의존하고자 하는 이미지 ex) web-db, server-db ..
      - mysql
      - redis

위와 같은 구조로 환경에 맞게 작성하고 'docker-compose up --build' 명령어를 실행했을 때 오류 없이 컨테이너가 잘 생성이 되고 실행이 된다면 일단 성공한 것이다.

docker-compose up -d 명령어는 기존에 생성된 컨테이너 이미지를 그대로 사용하기 때문에 이미지 재시작의 의미로 사용됩니다.
새로운 컨테이너로 빌드하고 싶다면 docker-compose up --force-recreate 명령어를 실행해주세요 !


주의 사항 🔴

  1. docker compose 파일 명칭은 'docker-compose.yml'로 고정으로 한 폴더에 하나만 존재해야 합니다.

  2. 프로젝트의 루트경로에 존재해야 원하는 구조의 컨테이너로 빌드가 가능합니다.

  3. 만약 여러개를 사용하고 싶다면 그 수만큼 폴더를 추가로 생성하여 보관을 분리해야 합니다. (해당 방법은 지양합니다.)


그렇다면 어떤 설정들이 있는가?

도커 컴포즈의 옵션을 다 사용해보진 못하겠지만
그래도 어떤 것들이 있는지 살펴보자 !

1. services : 실행할 컨테이너 목록

services:	# 무조건 상단에 선언해주기
	container1: # 첫 번째 컨테이너 서비스 ex) db, web ...
    	image: nginx:latest
        ...
        
    container2:
    	...

2. build : 설정해준 Dockerfile의 내용대로 이미지 빌드

container:
	build: .  # 같은 경로에 있을 때 예시
    		  # 경로가 다를 경우 - ./app/Dockerfile

3. image : 실행할 이미지

container:
	image: redis:latest 

4. command : 컨테이너에서 실행할 명령어

container:
	command: sh -c "yarn init -y && yarn install"

5. port : 외부와 통신하기 위한 컨테이너 포트

container:
	port:
      - 8080:3306
  • 🔴 정말 만약 8080:8090:80 와 같은 포트 설정을 발견하거나 작성하게 된다면,
    이는 잘못된 포트 범위 지정 방식입니다. docker compose 파일에서는 위와 같은 방법을 지원하지 않습니다.

6. expose : 연계된 컨테이너끼리 통신하기 위한 포트로 컨테이너 내부 포트에 액세스 할 수 있도록 해주는 컨테이너 포트
- port와 달리 호스트 시스템에 게시하지 않습니다.

container:
	expose:
    	- 3306
  • 서비스가 다른 컨테이너와 통신하기 위한 설정으로 내부 통신을 위한 포트 입니다.
    외부와 액세스 하지 않습니다.

7. volumes : 도커에 의해 관리되는 독립적인 데이터 저장 공간으로 할당해주는 가상 하드 디스크의 개념

container1:
  volumes:
    - db_data:/var/lib/mysql
container2:
  volumes:
    - wp_data:/var/www/html
    
volumes:
  db_data: {}  # docker-compose에 의해 새로 생성될 볼륨 / {}: 추가적인 설정이 없음
  wp_data:
    external: true  # 이미 생성된 볼륨을 사용함

8. environment : 환경 변수 정의 (.env의 내용과 동일)

container:
  environment:
    PASSWORD: P@ssW0Rd

9. restart : 컨테이너가 종료될 때 적용할 실행 정책

container:
  # no: 안 함
  # always: 수동으로 끄기 전까지 항상 재시작
  # on-failure: 오류 있을 시 재시작
  restart: no | alywas | onfailure

직접 확인해볼 수는 없지만 restart를 always로 설정해주면
pc를 껐다 켜도 실행이 계속 되어있는 것을 볼 수 있다.


10. context : Dockerfile을 빌드하기 위해 필요한 파일 경로


container2:
	build:
      context: . # 보통 루트 경로에 지정하지만 환경에 맞게 설정
      			 # ex) ./web
      dockerfile: Dockerfile # ex) ./app/Dockerfile

11. depends_on : 컨테이너 간의 종속성 정의. 해당 서비스를 실행하기전에 먼저 동작해야 할 서비스를 명시해줍니다.

db:
  image: mysql:latest
  
container2:
	build:
      context: .
    depends_on:
      - db

명시해줄 서비스는 먼저 선언해줍니다.

마무리하며

수많은 도커 컴포즈 설정 문법이 있지만
종종 쓰이는 문법들로 간단하게 docker compose에 대해 알아보았습니다.

이런 편리한 플랫폼을 사용해볼 때마다 신기하다는 느낌을 많이 받는데
이번에 사용한 도커는 "이게 왜 되는걸까?, 어떻게 작동하는거지?" 라는 생각을 자주 들게 만들었던 것 같습니다. 정말 알다가도 모를 요술램프같은 플랫폼이랄까요. 😃

그만큼 개발 프로덕션을 테스트 하는 단계에서는 너무나 편리한 것 같습니다!

그럼 모두 Happy hacking ! 🥳

0개의 댓글