Docker Compose 정리

버건디·2024년 1월 25일
0

도커

목록 보기
9/10
post-thumbnail

- 도커 컴포즈란 ?

도커 컴포즈는 다중 컨테이너, 즉 여러개의 컨테이너를 손 쉽게 설정할수 있도록 도와주는 도구이다.

프론트엔드, 백엔드, DB 3개의 컨테이너를 관리해야한다고 가정하면,

  1. db 컨테이너 실행

  2. 백엔드 이미지 빌드

  3. 백엔드 컨테이너 실행

  4. 프론트엔드 이미지 빌드

  5. 프론트엔드 컨테이너 실행

식의 흐름으로 흘러가는데, 이 실행을 할때도 볼륨이나 바인드마운트 등 여러개의 명령어를 입력해야하는 경우 하나라도 빼먹는다면 에러를 발생시킬수도 있다.

단순히 docker build와 docker run으로 실행을 했을때의 순서도이다.

이럴때 Docker Compose를 이용하면 깔끔하게 여러개의 컨테이너를 관리해줄수 있다.

Docker compose는 다수의 docker run과 다수의 docker build 명령어를 대체해줄수 있다.

하나의 명령어를 통해 다수의 컨테이너를 실행시키거나, 중지해줄수 있다.

❗️ 하지만 그렇다고 해서, Docker compose가 Dockerfile을 대체하지는 않는다. 또한 이미지나 컨테이너도 대체하지 않는다❗️

또한 Docker compose는 다수의 호스트 머신에서 다수의 컨테이너를 관리하기보다, 하나의 호스트 머신에서 다수의 컨테이너를 관리하는데에 유용하다.

- 시작하기

1. docker-compose.yml 파일 만들기

2. 파일 내용 작성

  1. version

이 버전은 해당 프로젝트의 버전이 아니라, 도커 컴포즈의 버전을 나타낸다.

공식 문서를 참조해보면, 버전에 따라서 사용할수 있는 기능이 다르다. (현재 v1은 업데이트가 중단되었다)

  1. services

서비스들에는 우리가 사용할 컨테이너들의 이름들이 들어가면 된다.

❗️ 또한 yml파일내에서 하위에 포함될 내용들은 꼭 공백 두개를 들여서 작성해주어야 포함되는 내용인걸 알수 있다 ❗️

version: "3.8"
services:
  backend:
  frontend:
  mysql:

서비스 하위의 컨테이너이름들은 임의로 작성해줄수 있다.

- mysql 내용 작성

version: "3.8"
services:
  mysql:
    image: "mysql"
    volumes:
      - data:/var/lib/mysql
    container_name: mysql-container
    environment:
      - MYSQL_DATABASE=test
      - MYSQL_ROOT_PASSWORD=secret
  # backend:
  # frontend:
volumes:
  data:
docker run --rm --name mysql-container --net=test-network -e MYSQL_ROOT_PASSWORD=mysql비밀번호 -e MYSQL_DATABASE=생성하고싶은스키마 -v data:/data/db -d mysql:latest

이 명령어를 그대로 가져왔다고 생각하면된다.

이미지는 mysql 이미지를 가져온것이며, 데이터의 지속성을 위해 명명 볼륨을 추가해주었다.

그리고 services, version과 같은 계층에서 volumes를 추가해주어서 명명한 볼륨 이름과 같이 볼륨 내역을 추가해주었다.

또한 환경변수 파일을 직접 주입해주었다.

컴포즈파일내에서는 따로 네트워크를 설정해줄 필요가없다.

해당 컴포즈 파일 내에서 빌드되는 컨테이너들끼리 공유할수 있는 네트워크를 따로 만들어준다.

docker-compose up // detach모드 원하면 -d 추가

해당 실행을 해주면 이미지 빌드와 컨테이너 실행까지 다 한꺼번에 처리가 된다.

docker-compose down // 만약 볼륨 삭제까지 원한다면 -v

여기서 주의해야할건, 해당 서비스 이름들이 컨테이너 이름이 아니라는 것이다.

서비스 이름으로 만들어주는것은 도커내에서 기억하고 있고, 이를 네트워크 연결에 사용한다.

- frontend 부분

  frontend:
    build: ./frontend
    ports:
      - "3000:3000"
    volumes:
      - ./frontend/src:/app/src
    stdin_open: true
    tty: true
    depends_on:
      - backend

stdin_open : 이는 컨테이너의 표준 입력을 열어둔다. 즉 -d 모드로 백그라운드에서 실행되더라도, 입력을 받을수 있도록한다.

tty : 해당 컨테이너에 가상 터미널을 할당해서, 출력값이 바로 콘솔에 나오도록 한다. 보통 컨테이너의 로그 출력을 바로바로 보거나, 인터렉티브 쉘을 실행할때 유용하다

인터렉티브쉘이란 예를 들어서 docker exec -it [컨테이너 이름] bash를 통해서 해당 컨테이너의 터미널 창에 접속하는것이다.

즉 리액트를 사용한다고 가정했을때, 소스코드를 변경하면 바로바로 브라우저에 적용될수 있다.

docker compose up --build

끝 명령어에 build를 추가해주면 컨테이너를 실행할때 기존 이미지를 발견했더라도 다시 해당 이미지를 재빌드해서 실행시킨다.

profile
https://brgndy.me/ 로 옮기는 중입니다 :)

0개의 댓글

관련 채용 정보