[Docker] 도커 compose

최동혁·2023년 4월 18일
0

docker

목록 보기
5/5

compose

  • Docker Compose는 Docker 애플리케이션을 정의하고 실행하기 위한 도구이다.

  • Docker Compose를 이용하면 여러 개의 컨테이너를 정의하고 구성할 수 있으며, 이를 단일 파일로 정의할 수 있다.

  • 이렇게 정의된 파일을 실행하면, Docker Compose는 컨테이너들을 자동으로 실행하고, 이들 간의 네트워크를 구성한다.

  • Docker Compose를 이용하면, 개발 환경을 쉽게 구축할 수 있다.

  • 예를 들어, Django 애플리케이션을 실행하는 데에 필요한 데이터베이스, 웹 서버, 캐시 서버 등을 하나의 Docker Compose 파일로 정의할 수 있다.

  • 이렇게 하면, 로컬 개발 환경에서 모든 컨테이너를 실행할 수 있으며, 배포를 위한 이미지도 동일한 설정으로 빌드할 수 있다.

  • Docker Compose를 이용하면, 여러 컨테이너를 실행하고 구성하는 과정을 간소화할 수 있다.

  • 이를 통해 개발자는 애플리케이션 개발에만 집중할 수 있으며, 인프라 구성 등의 작업에 시간을 낭비하지 않을 수 있다.

docker-compose.yml

services:
  db:
    image: mysql:8.0.32-debian
    command: --init-file /init/db.sql
    volumes:
      - ./data:/var/lib/mysql
      - ./init:/init
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: qwer1234
    ports:
      - 3306:3306

  backend:
    build:
      context: .
      dockerfile: Dockerfile
    command: sh -c "sleep 5 && python manage.py migrate && gunicorn config.wsgi --bind 0.0.0.0:8000"
    ports:
      - 8000:8000
    depends_on:
      db:
        condition: service_started
  • image는 불러올 이미지를 명시
  • command는 mysql을 실행하는 커멘드 뒤에 db.sql 파일을 실행할 것을 명시해주는 것.
DROP DATABASE IF EXISTS `web`;
CREATE DATABASE IF NOT EXISTS `web`;
  • 이것이 db.sql 파일임. 데이터베이스를 생성해주는 것인데, 없을 때 따로 생성하라는 쿼리문

  • volumes는 앞선 게시글에서 컨테이너는 메모리 휘발성이기 때문에 host pc에 저장을 해줘야 한다. mount 개념.

  • context는 경로

  • dockerfile은 dockerfile 파일 이름

  • 전 게시글에서 Dockerfile에서 migrate를 하고, 서버를 돌렸는데, 그렇게 되면 db와 연결하는데 오류가 생김. 그리고, sh -c를 준 이유는 command에서 &&를 잘 못읽는거 같아서 그냥 shell로 특정 명령어 문장을 다 던져버림.

  • depends_on은 먼저 무엇이 만들어지고 실행될 수 있게 하는 것

    • 예를 들어 db가 안만들어지고 backend가 만들어지면 오류가 나기 때문에 db가 만들어진 후, backend를 만들게끔 하는 것이다.

Dockerfile

FROM python:3.9
ENV PYTHONUNBUFFERED 1
WORKDIR /app
COPY requirements.txt /app/requirements.txt
COPY . /app
RUN pip install -r requirements.txt

실행

  • pycharm 오른쪽 위에 이런식으로 떠이는데 재생 버튼을 누르면 docker-compose 파일을 돌린다.
  • 그러면서 자동으로 우리가 docker-compose에서 정의한 대로 이미지를 생성해주고, 그 이미지로 컨테이너를 돌린다!
  • 이렇게 되면 db 따로, back 따로 front 따로 3계층을 컨테이너 올리는 작업을 하는 것이 아니라, docker-compose 파일을 이용해 한번에 컨테이너를 올려버리는 것이다.
profile
항상 성장하는 개발자 최동혁입니다.

0개의 댓글