[도커] 도커 컴포즈 (docker compose) practice! 데이터베이스

이러한 자료구조를 가진 디렉토리에서 작업을 시작할것이다.

백앤드와 프론트엔드 폴더안에 각각 Dockerfile이 있다. (도커 컴포즈는 Dockerfile을 대체하지 않는다. )

 

그리고 디렉토리 가장 최상단에 docker-compose 파일을 만든다 확장자는 yml이 되어도 되고, yaml이어도 된다.

이 파일안에 다중 컨테이너 환경, 프로젝트 설정을 기재한다.


Versions

도커 확장프로그램을 설치했다면, 제일 첫줄에 버전 기재를 할때 도움을 받을 수 있다.

여기서 version이란 도커 컴포즈 사양의 버전을 지정하는 것이다.

여기서 기재한 버전은 도커 컴포즈 할때 사용할 수 있는 기능에 영향을 미친다.

https://docs.docker.com/compose/compose-file/  

위 링크에서 Compose file reference/ Legacy versions/ Version3에서 사용할 수 있는 버전이 나와있다. 지금 시점에서는 3.8이 최신이다.


Servieces

 

 

services: 를 입력한 뒤 밑에 줄에서 두칸을 들여쓰는게 중요하다. yaml은 들여쓰기를 사용해서 종속성을 표현하기 때문이다.

그렇게 두칸을 들여쓰기 해서 쓰면 종속되는 부자 관계가 되는데 여기서 자녀가 되는것은 컨테이너들이 된다.

컨테이너에 레이블(label)을 지정하기 위해 원하는 이름을 골라 컨테이너에 이름을 지정할 수 있다.

mongodb와 frontend 그리고 backend는 모두 services에 대해 동등한 자식이므로 같은 두개의 들여쓰기로 구분되어있다.

Run MongoDB Container
---------------------

docker run --name mongodb \
  -e MONGO_INITDB_ROOT_USERNAME=max \
  -e MONGO_INITDB_ROOT_PASSWORD=secret \
  -v data:/data/db \
  --rm \
  -d \
  --network goals-net \
  mongo

mongo 컨테이너를 시작할때 사용하는 커멘드를 기준으로 docker-compose 파일을 만들것이다.


image

 

image를 기입하는 것에서 시작한다.

이미지가 속한 컨테이너 아래에 기입하는데, 그 컨테이너 안에 속한 것이므로 그 컨테이너로 부터 두칸 들여쓰기 하여 작성한다.

-rm 옵션은 따로 적을 필요가 없다. 왜냐하면 서비스를 중단하면 서비스가 제거되기 때문이다.


volumes

volumes 옵션은 Image와 같은 들여쓰기를 한다.

그리고 volumes내에서 하나 이상의 값이 있을 수 있으니 중첩값을 가지도록 '-'를 추가한다.

 

혹시 필요하다면 볼륨 뒤에 ro혹은 rw를 추가하여 읽기 전용, 쓰기전용으로 만들어 줄 수도 있다.


environment

environment옵션 역시 image와 volumes와 같은 수준의 들여쓰기를 해준다.

 

MONGO_INITDB_ROOT_USERNAME: june

이런방식으로도 표현이 가능하고

 

혹은 environment에서는 키-값 쌍으로 특정할 수 있다. 취향따라 쓰면 된다.

혹시 환경변수를 기입안하고 환경파일을 가져와서 하는 경우에는 같은 경로에 env 파일을 만들고 값을 넣어준 뒤 저장을 하고

env_file을 사용하여 mongo.env에 대한 상대경로를 입력하면 된다.


networks

많은 경우에 네트워크를 따로 설정할 필요가 없다. 왜냐하면 도커가 이 컴포즈 파일에 특정된 모든 서비스에 대해 새 환경을 자동으로 생성하고 모든 서비스를 즉시 그 네트워크에 추가하기 때문이다.

즉 서비스에 의해 정의된 컨테이너들은 이미 도커에 의해 생성된 동일한 네트워크의 일부가 된다.

물론 이렇게 networks를 정의하는것도 가능한데 이 경우에는 도커 컴포즈를 하며 도커가 생성한 네트워크에 추가되는것 뿐만 아니라 지정한 특정 네트워크에도 추가가 된다.

난 지정따로 안할거다.

 

frontend와 backend를 주석처리하고 한번 도커 컴포즈로 실행해보려고한다.

services와 같은 수준의 들여쓰기로 volumes로 services에 정의되어있는 볼륨 이름을 넣어줘야한다.

이렇게해야 도커가 services를위해 생성해야하는 명명된 볼륨을 인식한다.

추가로 다른 서비스에서 동일한 볼륨 이름을 사용하면 그 볼륨이 공유된다. 따라서 다른 컨테이너가 호스팅 머신상의 동일한 볼륨 동일한 폴더를 사용할 수 도 있다.


docker compose up

docker compose up

주욱 실행결과와 함께 컨테이너가 생성된 것을 볼 수 있다. Image 파일인 mongo도 다운받아져있다.

도커 컴포즈 실행 내역을 보면, 컨테이너를 실행할 기반이미지인 mongodb를 다운받고 디폴트 네트워크가 생성된 것을 볼 수 있다. 그리고 볼륨을 붙이고 컨테이너를 시작한것을 볼 수 있다.

디폴트로 attach모드에서 실행이된다. 커맨드 +c를 누르면 컨테이너를 중지할 수 있다.

 

docker compose up -d

-d 옵션을 사용해서 detach모드로 도커 컴포즈를 할 수 있다.

 

docker compose down

모든 컨테이너가 삭제되고 생성된 네트워크가 지워지는것을 볼 수 있다. 하지만 볼륨은 삭제되지 않는다.

 

docker compose down -v

볼륨도 삭제하려면 -v 플래그를 사용해야한다. 하지만 볼륨은 삭제하지 않는것이 좋다.

 

JUNE .

20'S LIFE IN SYDNEY and BUSAN

    이미지 맵

    DevOps Study/Docker 다른 글

    이전 글

    다음 글