취미가 좋다

[2-5] Docker-compose 본문

Sparta Coding Club/Docker

[2-5] Docker-compose

benlee73 2021. 7. 31. 10:29

Docker-compose 란?

여러 컨테이너를 편리하게 실행하기 위해 만들어진 도구이다.

yaml 파일을 정의해서 사용한다.

(YAML 이란 데이터를 저장하는 파일 포맷으로, XML / JSON 보다 사람이 읽기 더 편하다는 장점이 있다.)

 

docker-compose 로 memo application 실행하기

기존 커맨드는 아래와 같다.

docker build . -t wellshs/docker-memo:latest
docker run -d -p 5000:5000 wellshs/docker-memo:latest

위의 과정을 docker-compose로 실행하기 위해, 아래의 docker-compose.yaml 파일을 생성한다.

version: "3.9"

services:
  flask:
    build:
      context: .
    ports:
      - "5000:5000"
  • 버전에 따라 지원되는 기능이 다르기 때문에, 버전을 명시해야 한다.
  • 서비스 아래에는 컨테이너들을 어떻게 실행할 것인지 명시한다.
    • flask 라는 이름으로 어플리케이션을 실행한다.
    • build 옵션을 통해 실행할 때마다 빌드하도록 설정한다.
    • context 로 빌드가 되는 위치를 설정한다. '.'은 yaml 파일이 있는 위치이다.
    • ports 옵션으로 flask 컨테이너를 실해할 때, 연결할 포트를 지정한다.

 

아래의 명령어를 통해 docker-compose로 컨테이너를 실행시킨다.

docker-compose up -d

아래의 명령어를 통해 docker-compose로 컨테이너를 삭제한다.

docker-compose down

 

docker-compose 로 DB가 있는 application 연결하기

docker-compose로 여러 컨테이너를 실행할 때, 같은 파일에 정의된 컨테이너들은 같은 네트워크를 사용하게 된다.

version: "3.9"

services:
  flask:
    build:
      context: .
    ports:
      - "5000:5000"
  mongo:
    image: mongo:latest
    ports:
      - "27017:27017"

mongo 컨테이너는 이미지를 가져와서 띄우기 때문에 위와 같이만 정의하면 된다.

기존에는 network-alias 를 통해서 네트워크 접근을 할 수 있었다.

docker-compose에서는 기본적으로 이름(flask, mongo)으로 접근할 수 있다.

 

docker-compose 를 이용하여 volume으로 유지되는 application 실행하기

docker-compose에서는 named volume과 bind mount 를 모두 지원한다.

version: "3.9"
services:
  flask:
    build:
      context: .
    volumes:
      - ./templates:/templates
    ports:
      - "5000:5000"
  mongo:
    image: mongo:latest
    volumes:
      - mongo:/data/db/
    ports:
      - "27017:27017"

volumes:
  mongo:

flask 컨테이너 내에서 volumes 옵션을 주어 bind mount를 한다.

로컬의 ./templates 와 컨테이너 내의 /templates 를 연결한다.

기존에는 로컬 위치로 절대 경로를 입력해야 했지만, 여기서는 상대 경로를 입력해도 된다.

 

services 밖의 volumes 옵션을 주어 named volume을 생성하여 사용한다.

mongo 컨테이너 내에서 volumes 옵션을 주어 생성한 volume을 사용하도록 한다.

 

결론적으로,

bind mount를 통해 app.py나 index.html의 코드를 변경할 때, 바로 적용되도록 한다.

named volume을 통해 컨테이너가 종료되고 새로 생성되더라도 이전 데이터가 유지되도록 한다.

Comments