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 파일 적용 가능 |
'Docker' 카테고리의 다른 글
| [Docker] Docker Volume 을 이용한 데이터 저장하기 (0) | 2025.03.03 |
|---|---|
| [Docker] Docker로 MYSQL 설치 및 연결상태 확인 (0) | 2025.03.03 |
| [Docker] Dockerfile과 WORKDIR 명령어 (0) | 2025.02.26 |
| [Docker] Dockerfile 과 RUN 명령어 (0) | 2025.02.26 |
| [Docker] Dockerfile 과 ENTRYPOINT 명령어 (0) | 2025.02.26 |
