도커

Sawol·2021년 6월 24일
0

도커

  • 현재 내가 만든 프로그램을 다른 서버에서 제대로 실행하려면 환경설정이 동일해야함
  • 다른 하드웨어, 운영체제에서 작업하더라도 동일한 환경을 갖추도록 도와주는 기술
  • 가상환경(venv)는 개발환경 구축을 위함 배포까지는 한계가 있음
  • 도커는 배포까지 가능

도커의 동작원리

  • 도커 설정파일에 운영체제, 프로그래밍 언어 버전, 라이브러리, 소스코드, 이미지 파일 등 프로그램 배포에 필요한 환경설정 정보를 모두 지정함
  • 도커를 실행하면 도커 설정 파일에서 지정한 대로 서버 전체를 온전히 복제한 컨테이너 이미지가 생성
  • 컨테이너 이미지를 작동하면 컨테이너가 실행되면서 기존과 동일한 상태로 프로그램 서버를 실행
  • 컨테이너 이미지를 처음 만들때는 모두 복제해야해서 오래걸림
  • 이후에는 이미 받아놓은 이미지에서 변경된 부분만 갱신하면 되기 때문에 시간이 단축됨
  • 여러 서버에서 컨테이너 이미지만 받으면 동일한 환경으로 서버를 실행할 수 있음

도커 파일 만들기

모듈 리스트 만들기

  • pip freeze > requirements.txt
  • 가상환경에 설치한 라이브러리들을 리스트로 만들어 저장

도커 설정 파일 만들기

  • 프로젝트 폴더에 Dockerfile 이름으로 설정 파일 만들기
  • 프로그래밍 언어 버전, 작업 폴더 등을 지정

도커 컴포즈 파일 만들기

  • 컨테이너 여러 개를 한 번에 실행시킬 수 있음
  • 컨테이너 실행 시킬 때 옵션도 줄 수 있음
  • 도커 컴포즈 파일의 기본 파일 명은 docker-compose.yml

환경설정 파일

  • 디버깅 모드를 유지하는지 여부 등을 설정
  • 파일명은 .env.dev

도커 컨테이너 실행하기

도커 이미지 생성

  • docker-compose build

도커 컨테이너 실행

  • docker-compose up
  • python manage.py runserver와 동일하게 서버가 실행됨
  • docker-compose up -d 백그라운드에서 서버 실행

도커에 생성된 이미지와 컨테이너 확인

  • docker image ls
  • docker container ls

도커 컨테이너 종료

  • docker-compose down

도커로 디비 변경하기

  • sqlite 에서 PostgreSQL로 변경하기
  • psyconpg2 모듈이 필요

docker-compose.yml에 컨테이너 추가

  • 원래 있던 web 컨테이너가 실행하고 디비가 실행되어야함 -> depends_on에 디비 등록
  • 도커에서 공식으로 제공하는 postgres 사용
  • volumes는 컨테이너가 중단되더라도 디비 내용이 사라지지 않도록 함
# docker-compose.yml

version: '3'

services:
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - ./:/usr/src/app/
    ports:
      - 8000:8000
    env_file:
      - ./.env.dev
    depends_on:
      - db
  db:
    image: postgres:12.0-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_USER=do_it_django_db_user
      - POSTGRES_PASSWORD=do_it_django_db_password
      - POSTGRES_DB=do_it_django_dev
volumes:
  postgres_data:

settings.py 수정

  • 현재 settings.pysqlite를 사용하도록 설정되어 있음
  • 여기에 postgresql을 사용하는데 필요한 정보를 추가해야함
# settings.py

# before
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

# after
DATABASES = {
    'default': {
        'ENGINE': os.environ.get("SQL_ENGINE", 'django.db.backends.sqlite3'),
        'NAME': os.environ.get('SQL_DATABASE', os.path.join(BASE_DIR, 'db.sqlite3')),
        'USER': os.environ.get('SQL_USER', 'user'),
        'PASSWORD': os.environ.get('SQL_PASSWORD', 'password'),
        'HOST': os.environ.get('SQL_HOST', 'localhost'),
        'PORT': os.environ.get("SQL_PORT", '5432'),
    }
}

.env.dev 파일 수정

  • 디비 엔진, 사용자, 패스워드 등을 정의
# .env.dev
SQL_ENGINE=django.db.backends.postgresql
SQL_DATABASE=do_it_django_dev
SQL_USER=do_it_django_db_user
SQL_PASSWORD=do_it_django_db_password
SQL_HOST=db
SQL_PORT=5432

컨테이너 실행

  • docker-compose build
  • docker-compose up
  • 디비가 PostgreSQL로 변경되었지만 이전 sqlite의 정보가 마이그레이션 되지 않아 테이블이 생성되지 않았기 때문

마이그레이션하기

  • docker-compose exec web python manage.py migrate
  • 도커로 만든 web 컨테이너에 접속해서 python manage.py migrate를 실행하라는 의미

0개의 댓글