1. 도커 컴포즈 yaml 파일 구성
version: 파일 규격 버전을 적습니다. 파일의 규격에 따라 지원하는 옵션이 달라지는데, “3”이라만 적으면 3으로 시작하는 최신 버전을 사용한다는 의미입니다.
services: 실행하려는 컨테이너들을 정의합니다. 컴포즈에서는 컨테이너 대신 서비스라는 개념을 사용합니다.
image : 빌드할 이미지를 작성한다.
volumes: 컨테이너에서 사용할 볼륨, 바운드 마운트를 작성한다. run 명령과 작성법은 같지만 run 명령어의 경우 바운트 마운트 경로는 절대경로만 작성이 가능한 반면 컴포즈에서는 상대경로 또한 가능하다. 명명된 볼륨의 경우 다른 컨테이너에서도 사용할 수 있기 때문에 services 구문과 같은 레벨에 volumes: 을 사용하여 볼륨을 명시해줘야 한다. - compose 파일 참조.
build:
api 컨테이너와 같이 아직 이미지가 빌드 되지 않았지만 컨테이너를 생성하고 싶은 경우 해당 Dockerfile이 존재하는 파일 경로를 작성한다. 도커는 해당 경로를 찾아 Dockerfile을 인식해 이미지 빌드 후 컨테이너 생성까지 자동으로 실시한다.
참고 - 도커를 다시 실행할 때마다 항상 이미지를 다시 빌드하지는 않는다. 이미지가 이미 존재하는 경우 기존 이미지를 다시 사용하며 그 이미지에 대해 변경된 것이 있는 경우에만 리빌드한다.
- build: 를 통한 컨테이너 생성
여기서 중요한 점은 컴포즈 파일 services 아래 명시한 backend, mongo 이름으로 컨테이너 name이 할당되는 것이 아닌 폴더이름-1 으로 컨테이너가 생성되지만 컴포즈 파일에 명시한 이름은 도커가 기억하고 있기 때문에 코드 내에서 실제 컨테이너 name이 아닌 services 아래 명시한 이름을 사용할 수 있다.
참고 : 컨테이너 이름을 직접 직정하려면 'container_name: ' 사용
ex) 여전히 app.js 파일 내의 코드 'mongodb' 를 사용할 수 있다.
`mongodb://${process.env.MONGODB_USERNAME}:${process.env.MONGODB_PASSWORD}@mongodb:27017/course-goals?authSource=admin`,
ports: docker run명령어의 -p 와 같이 네트워크에 열 port 를 지정한다.
env_file: env 파일 생성 후 키=값 을 작성한 뒤 컴포즈 파일에서 env_file: 을 이용하여 env 파일 경로를 작성하면 도커는 파일 경로를 찾아 작성된 인자 값을 인식한다.
모든 서비스를 중지하고 모든 컨테이너 등을 제거하려면 docker-compose down 사용한다. 그러나 볼륨은 삭제되지 않는다. 볼륨도 삭제하려면 docker-compose down -v 을 사용하면 볼륨까지 제거된다. 데이터 유지를 위한 볼륨이기 때문에 명시적으로 -v 붙여줘야 제거되도록 규칙이 정해져있다.
depends_on : 도커 컴포즈는 docker run 명령어와 같이 개별 실행이 아니기 때문에 한번에 여러 컨테이너를 생성한다. 하지만 컨테이너 생성 시 다른 컨테이너를 의존해야 하는 경우가 존재한다. 이런 문제를 해결하기 위해 컴포즈는 depends_on: 구문을 제공하여 의존하는 컨테이너를 명시할 수 있도록 해준다.
ex) api 컨테이너는 db 컨테이너를 의존한다. depends_on: mongodb
stdin_open: 개방형 입력 연결이 필요하다는 것을 도커에게 알림
tty: 터미널에 연결
참고 - stind_open:true , tty : true 로 설정 시 -it 처럼 인터렉티브 모드로 실행
2. 도커 컴포즈 명령어
- up: docker-compose.yml에 정의된 컨테이너를 실행
- docker-compose up
- docker-compose up -d: docker run의 -d옵션과 동일
- docker-compose up --force-recreate: 컨테이너를 새로 만들기
- docker-compose up --build : 도커 이미지를 다시 빌드(build로 선언시에만)
- down: 컨테이너를 종료하고 삭제
- docker-compose down
3. 도커 컴포즈 .yml 파일 예시
'백엔드 개발' 카테고리의 다른 글
Docker 다중 컨테이너 배포 (4) | 2023.01.04 |
---|---|
docker 배포 (0) | 2022.12.31 |
Docker DB 컨테이너 (0) | 2022.10.23 |
도커 컨테이너의 네트워크 통신 (0) | 2022.10.14 |
Docker Bind Mounts (0) | 2022.10.11 |
댓글