Docker-Compose
[Orchestration Command Set] 자동화 설정 명령 셋. docker build , docker run 명령을 대체해주는 도구.
다수의 명령들을 하나의 구성 파일로 합친다.
💡 모든 컨테이너를 즉시 시작하고, 필요하다면 모든 이미지를 빌드해버린다. 모든 것을 중지하고 중단하는 것도 가능 !
하지만
- 도커 컴포즈는 커스텀 이미지를 위한 Dockerfile 을 대체할 순 없다.
- Dockerfile 과 함께 작동 가능
- 이미지나 컨테이너를 대체하는 것이 아니라, 그 작업을 더 쉽게 할 수 있게 해주는 것.
- 다수의 호스트에서 다중 컨테이너 관리에는 적합하진 않다.
- 하나의 호스트에서 다중 컨테이너를 관리하는 데에 강점이 있음.
컴포즈 파일에서 정의해야하는 것
Service (컨테이너)
- 다중 컨테이너 애플리케이션을 구성하는 컨테이너
- 모든 서비스 아래에서 해당 서비스를 구현 가능
- 포트 , 환경 변수, 볼륨, 네트워크 등을 정의 → 도커 컴포즈에서 ㄱㄱ
도커 컴포즈 사용해보기!
- 혹시 리눅스라면 먼저 도커 컴포즈 설치를 하자.
1. sudo curl -L "<https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$>(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
2. sudo chmod +x /usr/local/bin/docker-compose
3. sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
4. to verify: docker-compose --version
경로 참고
docker-compose.yml
- 일단 데이터베이스 컨테이너만 올려보며 기본 설정들을 확인하자 😃
# 참고로 docker-compose 는 ?
# defult `-d` (detached 모드) `--rm` (서비스 내려가면 바로 제거)
# DockerCompose 버전 (프로젝트X 도커컴포즈O)
version: '3.8'
# 정의할 컨테이너들...
services:
mongodb:
image: 'mongo' # 사용할 이미지 (로컬이나 도커허브리포지토리에서 가져옴)
volumes: # 볼륨 정의
- data:/data/db
# environment:
# - MONGO_INITDB_ROOT_USERNAME=max # 이렇게도 가능!
# MONGO_INITDB_ROOT_USERNAME: max
# MONGO_INITDB_ROOT_PASSWORD: secret
env_file: # 환경 변수 파일에서 읽어오도록 정의
- ./env/mongo.env
# 하나의 docker-compose 파일에 정의된 서비스는 도커에 생성된 동일한 네트워크의 일부가 됨! -> 네트워크 설정 필요 X
# 만약 이렇게 따로 추가한다면, 컴포즈에 있는 서비스에 있는 네트워크 `외`에 goals-net 네트워크에도 추가되는 것.
# networks:
# - goals-net
# backend:
# frontend:
# service 에서 생성중인 '명명' 도커 볼륨 나열해야 함.
# 도커가 추가해야하는 볼륨을 알려주는 것.
volumes:
data:
Docker-Compose command
# 기본 attached 모드
docker-compose up
# detached 모드 실행
docker-compose up -d
# docker-compose 중지
docker-compose down
# 중지하며 볼륨까지 제거
docker-compose down -v
Docker-Compose + with Backend
# 참고로 docker-compose 는 ?
# defult `-d` (detached 모드) `--rm` (서비스 내려가면 바로 제거)
# DockerCompose 버전 (프로젝트X 도커컴포즈O)
version: '3.8'
# 정의할 컨테이너들...
services:
# 코드에서 사용할 수 있는 이름
mongodb:
image: 'mongo' # 사용할 이미지 (로컬이나 도커허브리포지토리에서 가져옴)
volumes: # 볼륨 정의
- data:/data/db
# environment:
# - MONGO_INITDB_ROOT_USERNAME=max # 이렇게도 가능!
# MONGO_INITDB_ROOT_USERNAME: max
# MONGO_INITDB_ROOT_PASSWORD: secret
env_file: # 환경 변수 파일에서 읽어오도록 정의
- ./env/mongo.env
# 하나의 docker-compose 파일에 정의된 서비스는 도커에 생성된 동일한 네트워크의 일부가 됨! -> 네트워크 설정 필요 X
# 만약 이렇게 따로 추가한다면, 컴포즈에 있는 서비스에 있는 네트워크 `외`에 goals-net 네트워크에도 추가되는 것.
# networks:
# - goals-net
# 코드에서 사용할 수 있는 이름
backend:
# image: 'goals-node'
# 이미 존재하는 이미지를 사용하지 않더라도, Dockerfile이 있는 경로를 알려주면 이미지를 직접 빌드해줌.
build: ./backend
# build:
# 이미지가 생성되는 장소, 즉 이미지에 포함될 모든 파일이 있어야하는 장소이기도 하다.
# 도커파일이 있는 장소가 아닌 다른 곳으로 설정해야할 수도 있어서 복잡할수도..
# context: ./backend
# dockerfile: Dockerfile
# arge:
# some-arg: 1
ports:
- '80:80' # 호스트 포트:앱포트
volumes:
- logs:/app/logs
- ./backend:/app # docker-compose.yml 파일의 상대 경로 사용 가능. (바인드마운트)
- /app/node_modules
env_file:
- ./env/backend.env
# 어떤 컨테이너에 의존하고 있는지 알려줌.
# mongodb 를 불러와야 백엔드 앱이 실행 가능하기 때문에 mongodb에 종속성이 있다고 알려줌.
depends_on:
- mongodb
# frontend:
# service 에서 생성중인 '명명' 도커 볼륨 나열해야 함.
# 도커가 추가해야하는 볼륨을 알려주는 것.
volumes:
data:
logs:
Docker-Compose + with Frontend(React)
# 참고로 docker-compose 는 ?
# defult `-d` (detached 모드) `--rm` (서비스 내려가면 바로 제거)
# DockerCompose 버전 (프로젝트X 도커컴포즈O)
version: '3.8'
# 정의할 컨테이너들...
services:
# 코드에서 사용할 수 있는 이름
mongodb:
image: 'mongo' # 사용할 이미지 (로컬이나 도커허브리포지토리에서 가져옴)
volumes: # 볼륨 정의
- data:/data/db
# environment:
# - MONGO_INITDB_ROOT_USERNAME=max # 이렇게도 가능!
# MONGO_INITDB_ROOT_USERNAME: max
# MONGO_INITDB_ROOT_PASSWORD: secret
env_file: # 환경 변수 파일에서 읽어오도록 정의
- ./env/mongo.env
# 하나의 docker-compose 파일에 정의된 서비스는 도커에 생성된 동일한 네트워크의 일부가 됨! -> 네트워크 설정 필요 X
# 만약 이렇게 따로 추가한다면, 컴포즈에 있는 서비스에 있는 네트워크 `외`에 goals-net 네트워크에도 추가되는 것.
# networks:
# - goals-net
# 코드에서 사용할 수 있는 이름.
backend:
# image: 'goals-node'
# 이미 존재하는 이미지를 사용하지 않더라도, Dockerfile이 있는 경로를 알려주면 이미지를 직접 빌드해줌.
build: ./backend
# build:
# 이미지가 생성되는 장소, 즉 이미지에 포함될 모든 파일이 있어야하는 장소이기도 하다.
# 도커파일이 있는 장소가 아닌 다른 곳으로 설정해야할 수도 있어서 복잡할수도..
# context: ./backend
# dockerfile: Dockerfile
# arge:
# some-arg: 1
ports:
- '80:80' # 호스트 포트:앱포트
volumes:
- logs:/app/logs
- ./backend:/app # docker-compose.yml 파일의 상대 경로 사용 가능. (바인드마운트)
- /app/node_modules
env_file:
- ./env/backend.env
# 어떤 컨테이너에 의존하고 있는지 알려줌.
# mongodb 를 불러와야 백엔드 앱이 실행 가능하기 때문에 mongodb에 종속성이 있다고 알려줌.
depends_on:
- mongodb
frontend:
build: ./frontend
ports:
- '3000:3000'
volumes:
- ./frontend/src:/app/src
# 인터렉티브 모드를 만들고 싶어요
stdin_open: true # -it (외부 입력 받기 O)
tty: true # 터미널 연결
depends_on:
- backend # backend 가 시작된 경우에만 frontend 시작하기 !
# service 에서 생성중인 '명명' 도커 볼륨 나열해야 함.
# 도커가 추가해야하는 볼륨을 알려주는 것.
volumes:
data:
logs:
- 깔ㅡ끔
유용하다 !
docker-compose up
# 이미지 강제 리빌드
docker-compose up --build
# 이미지만 리빌드
docker-compose build
컨테이너 이름 추가
- container_name 으로 추가 가능!
💡 docker-compose 명령은 docker 명령을 대체하지 않는다. 두 명령을 함께 사용할 수 있다. (docker push 등)
💡 Docker-Compose 를 사용한다고 Dockerfile 이 필요하지 않은 게 아님. 둘은 함께 작동한다. !
728x90
'개발공부 개발새발 > Docker' 카테고리의 다른 글
Docker ) 유틸리티 컨테이너 (1) | 2024.04.03 |
---|---|
Docker ) 다중 컨테이너 (0) | 2024.04.02 |
Docker ) Network (0) | 2024.03.29 |
Docker ) ARG 와 ENV (0) | 2024.03.18 |
Docker ) 도커 볼륨과 바인드 마운트 (0) | 2024.03.18 |