수복의 프로그래밍 여행기
article thumbnail

Docker Compose 사용이유

 

Dockerfile 은 개별 컨테이너를 빌드하는 역할을 했습니다. 이미지를 생성하고 컨테이너를 생성 및 실행 합니다.

 

파일안에 필요한 명령어 FROM 부터 RUN 그리고 Entrypoint... 등등

 

그리고 도커파일을 실행하기 위한 명령어와 옵션들이 있습니다.

 

이러한 것을 조금 더 간편하게 사용할 수 있는 게 Compose 입니다.

 

예시: nginx 를 설치하고 그 위에 node 를 설치하며 이름은 node-server 및 포트는 4000 이라는 컨테이너를 만들어야 한다면??

 

- Dockerfile 을 사용할 경우

FROM node

 

그리고 명령어로 아래와 같이 입력합니다.

docker run --name node-server -d -p 4000:4000 nginx

 

- compose 를 사용할 경우

services:
  backend:
	containter_name: node-server
    	image: node:18-alpine
    	ports:
      	- 4000:4000

 

그리고 아래의 명령어를 입력합니다.

docker compose up -d

 

복잡한 명령어를 입력하지 않고 compose 파일안에 포트나 이미지 등 한눈에 보기 쉽습니다.

 

이러한 장점으로 compose 를 사용하기도 하지만 아래의 이유가 가장 큰 이유가 아닐까 싶습니다.

  • Dockerfile은 하나의 컨테이너를 정의
  • Docker Compose는 여러 개의 컨테이너 정의 가능

 

방법

차이점을 보여주기 위해 간단히 파일안에 문법과 실행하는 명령문을 이용하였는데 

 

좀 더 자세히 알아볼 필요가 있습니다.

 

compose 파일안을 확인하겠습니다.

 

services: # 실행할 서비스들 
  my-web-server: # 서비스의 이름 (임의로 지정 가능합니다)
    container_name: web-server-test # 컨테이너 이름을 의미
    image: nginx # Dockerhub 에서 nginx 이미지를 다운로드 후 실행
    ports:
      - 80:80 # 호스트는 80번 포트를 컨테이너 내부 80번 포트로 연결

 

그리고 해당 파일을 실행하는 명령어는 아래와 같습니다.

docker compose up -d

 

여기서 마지막에 -d 옵션을 붙이는 이유는 백그라운드에서 실행되는 것입니다.

 

만약 옵션  -d를 붙이지 않는다면 포그라운드에서 실행됩니다.

 

 

이렇게 다시 터미널 창을 열어야 하는 번거로움이 있기 때문에 -d 옵션을 사용합니다.

 

그리고 실행 중인 Docker Compose의 모든 컨테이너를 종료하고 삭제 싶다면 아래의 명령어를 입력합니다.

docker compose down

 

stop 이라는 옵션도 있는데 차이점이 있습니다.

 

명령어 컨테이너 실행 컨테이너 중지 컨테이너 삭제 네트워크 삭제  볼륨 삭제 (옵션)
docker-compose up -d  ✅ 실행 - - - -
docker-compose stop - ❌ 유지 ❌ 유지 ❌ 유지 ❌ 유지
docker-compose down - ✅ 중지 ✅ 중지 ✅ 중지 (옵션 사용 시)

 

또한 이미지를 다시 빌드하게 될 경우 옵션으로 --build 를 입력합니다. 

 

docker compose up --build

 

Dockerfile과 함께 쓰는 방법도?

Dockerfile과 함께 사용도 가능합니다.

 

현재 폴더에 또는 특정 폴더에 Dockerfile 이 있고 해당 파일에 명령어를 입력해 놓았다면

 

compose 안에서 build 라는 것을 사용할 수 있습니다.

 

build: [상대 경로]

 

이전에 사용했던 것 중 dockerfile 이 같은 폴더 내에 존재하게 될 경우 아래와 같이 변경 가능합니다.

 

services:
  backend:
	containter_name: node-server
    	build: .

 

dockerfile 안에 베이스 이미지가 있고 RUN을 통한 실행을 할 수도 있습니다.

 

이렇게 위와 같이 build 를 통해 현재 또는 특정 폴더에 있는 dockerfile 을 실행하여 설치도 가능합니다.

Docker Compose 를 이용하면 두 개 이상도 가능하다?

compose 를 사용하는 주된 이유가 두 개 이상 컨테이너를 설치하고 정의가 가능한 것입니다.

 

예시로 프론트는 프론트엔드 폴더안에 dockerfile 있고 백엔드는 백엔드 폴더안에 dockerfile 이 있으며,

 

db 는 이미지를 다운로드 받아서 실행해야할 경우가 있다고 가정합니다.

 

그럴 경우 compose 에는 아래와 같이 실행할 수 있습니다.

services:
  frontend:
    build: ./frontend
    ports:
      - "3000:3000"
    depends_on:
      - backend
  backend:
    build: ./backend
    ports:
      - "4000:4000"
    depends_on:
      - db
  db:
    image: postgres:latest
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydb

 

물론 build 가 아닌 image 를 통해 dockerhub 에서 pull 할 수 있습니다.

 

또한, 실행 순서 제어 (depends_on)로 조건을 통해 DB가 실행된 후 백엔드 실행 등 조정 가능합니다.

 

작업 Dockerfile Docker Compose
컨테이너 실행  docker run 여러 개 입력 docker-compose up -d
컨테이너 개별 컨테이너 중지 docker-compose down
종료로그 확인  docker logs docker-compose logs -f
환경변수 관리  직접 -e 옵션 사용  .env 파일 적용 가능

 

반응형
profile

수복의 프로그래밍 여행기

@컴수복

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!