일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- kurento
- 미니큐브
- 자바스크립트
- revert
- minikube
- 위코드
- Docker Compose
- underscore
- 리눅스
- kubernetes
- Python
- 기초
- Docker
- JavaScript
- 파이썬
- Dockerfile
- onicecandidate
- 표준에러
- stash
- corsmiddleware
- 표준출력
- 도커
- 독스트링
- 6.6.0
- 명령어
- 쿠버네티스
- RTCP
- 7.0.0
- docstring
- fastapi
- Today
- Total
Devlog
Docker-Compose 사용하기 본문
도커를 사용하다 보면 커스텀하는 정도에 따라 컨테이너를 띄울 때 굉장히 긴 명령어를 입력해야 할 때가 있다. 어떤 모드로 실행할 것인지, 컨테이너 이름은 무엇으로 할 것인지, 어떤 네트워크에 연결할 것인지 등등...
그리고 서로가 통신을 하는 여러 개의 컨테이너로 이루어진 서버를 띄우기 위해 그 많은 명령어를 모두 입력한다고 생각하면 아찔하다... 물론 어딘가에 문장을 저장해 두었다가 복붙을 해도 되지만 뭔가 개발자적이지 못한 느낌이 들지 않는가?
이를 위해 도커는 수많은 명령어를 미리 선언해 손쉽게 컨테이너를 띄워주는 docker-compose를 지원한다. docker-compose를 사용하는 방법을 알아보자.
docker-compose 파일 작성하기
우선 명령문을 미리 선언해 둘 파일이 필요하다. 프로젝트의 최상단 경로에 파일명은 "docker-compose" 확장자는 ".yml" 또는 ".yaml"로 만들어준다. 확장자는 둘 중 어떤 것이든 상관없다. 그저 옵션 간 종속성을 표현하는 특정한 텍스트 포맷일 뿐이다.
그리고 각 옵션은 상위 옵션과 하위 옵션으로 나뉘게 되는데, 이는 2칸 공백의 들여 쓰기로 구분한다.
version: "3.8"
service:
mongodb:
image: 'mongo'
volumes:
- data:/data/db
environment:
MONGO_INITDB_ROOT_USERNAME: USER
MONGO_INITDB_ROOT_PASSWORD: PASSWORD
backend:
build: ./app
port:
- '8000:8000'
volumes:
- logs:/app/logs
- ./app:/app # 바인드 마운트
- /app/node_modules
env_file:
- ./env/backend.env
depends_on:
- mongodb
volumes:
data:
logs:
위에서 예시로 작성한 docker-compose파일은 Nodejs 백엔드, MongoDB 데이터베이스로 구성된 서버를 한 번에 연결해 컨테이너로 띄우는 예시이다.
맨 위부터 차례대로 살펴보자. "version"옵션은 도커 컴포즈의 버전이다. 각 버전별로 다른 옵션들을 지원할 수 있다. 만약 본인이 활용하고 싶은 옵션이 어떤 버전에서 사용할 수 있는지 확인하고 싶다면 링크를 참고하도록 하자.
도커 컴포즈 버전: https://docs.docker.com/compose/compose-file/compose-versioning/
"services"는 특정한 값을 가지는 옵션은 아니다. 컴포즈를 통해 띄울 컨테이너 들을 하위 항목으로 두는 옵션이다.
하위항목으로 오는 컨테이너들의 경우 위와 같이 "mongodb", "backend"이름을 지어주면 되는데 이는 도커가 해당 이름을 사용하기 때문이다. 이에 대한 것은 밑에서 따로 설명할 것이다.
만약 도커 컨테이너를 띄울 이미지가 이미 빌드되었거나 도커 허브에서 가져오는 이미지일 경우 "image"옵션을 사용한다. 해당 옵션의 값으로 "이미지명:태그"를 주면 된다.
참고사항으로 도커 컴포즈로 컨테이너를 띄우면 해당 컨테이너가 정지될 때 자동으로 삭제되는 옵션을 가지고 있으니 명심하자. 삭제되게 하고 싶지 않다면 별도의 옵션을 주어야 한다.
"volumes"를 통해 볼륨 설정을 할 수 있다. 위의 예시에서는 명명된 볼륨은 만들어 준 모습을 볼 수 있는데, 만약 명명된 볼륨을 만들어준다면 "services"옵션과 동등한 계층에서 볼륨을 한번 더 선언해야 한다. 예시와 같이 선언한다. 물론 익명 볼륨과 바인드 마운트는 이름이 없기에 해당 작업이 필요 없다.
백엔드 서버의 경우 이미지가 빌드되지 않은 경우를 예로 들어 "build"옵션을 사용해 주었다. 빌드의 값으로는 도커 컴포즈 파일이 위치한 경로를 기준으로 상대경로를 주면 된다.
로컬과 컨테이너의 포트를 "port"옵션을 통해 개방시켜 주었다.
"volumes"옵션에서 한 가지 특이한 점은 우리가 "docker run"으로 바인드 마운트 볼륨을 설정할 때는 절대 경로로 모든 경로를 다 써주어야 했다. 하지만 도커 컴포즈는 그러한 수고를 들일 필요 없이 도커 컴포즈를 기준으로 상대 경로를 설정하면 된다.
그다음은 환경변수인데 데이터베이스 컨테이너와 다르게 외부 환경변수 파일에 별도로 설정해 준 환경변수를 "env_file"옵션으로 가져올 수 있다. 해당 환경변수 파일에는 "키=값"형태로 저장되어 있으면 된다.
마지막에 "depends_on"옵션의 경우 해당 값에 해당하는 컨테이너에 종속한다는 말이다. 사실 백엔드 서버를 개방하기 위해서 데이터베이스에 연결하는 작업이 있는데, 만약 데이터베이스 컨테이너가 먼저 실행되지 않으면 오류를 반환할 수 있다. 그래서 해당 컨테이너가 특정 컨테이너가 실행되기 전에 먼저 실행되지 않게 설정해 주는 것이다.
그리고 여기서는 따로 네트워크를 설정하지 않은 모습을 볼 수 있다. 이유는 해당 도커 컴포즈 파일에 속하여 생성된 컨테이너는 도커가 자동으로 네트워크를 생성하며 컨테이너들을 해당 네트워크에 연결시킨다. 그리고 앞에서 지정해 주었던 이름으로 도커는 내부 로직을 통해 해당 이름에 매핑된 ip로 연결한다.
docker-compose 실행하기
컴포즈 파일의 작성이 완료되었다면 해당 파일이 있는 경로로 이동해 "docker-compose up"명령어를 사용하면 파일에 선언해 주었던 명령들이 자동 실행되며 모든 컨테이너가 띄워진다.
명령어를 통해 컨테이너를 띄우면 attached 모드로 실행되어 해당 터미널에서 명령어를 쓸 수 없는데 이럴 때는 명령어 뒤에 "-d"옵션을 주면 명령어를 쓸 수 있다.
그리고 컨테이너를 종료시키고 싶다면 "docker-compose down"명령어를 이용해 주면 된다.
여기까지 간단하게 예시를 통해 도커 컴포즈 파일을 작성하는 방법을 알아보았다. 명심해야 할 것은 도커 컴포즈는 그저 도커 컨테이너를 띄우는데 명령문을 손쉽게 사용하는 것일 뿐 Dockerfile을 대체할 수는 없다는 것을 기억하자.
'데브옵스' 카테고리의 다른 글
kubernetes 입문하기 (0) | 2023.02.23 |
---|---|
컨테이너 내부 서버가 통신 하는 방법 (1) | 2023.01.09 |
도커 볼륨으로 데이터 관리하기 (0) | 2023.01.08 |
Dockerfile 만들기 (0) | 2023.01.08 |