도커
- 현재 내가 만든 프로그램을 다른 서버에서 제대로 실행하려면 환경설정이 동일해야함
- 다른 하드웨어, 운영체제에서 작업하더라도 동일한 환경을 갖추도록 도와주는 기술
- 가상환경(venv)는 개발환경 구축을 위함 배포까지는 한계가 있음
- 도커는 배포까지 가능
도커의 동작원리
- 도커 설정파일에 운영체제, 프로그래밍 언어 버전, 라이브러리, 소스코드, 이미지 파일 등 프로그램 배포에 필요한 환경설정 정보를 모두 지정함
- 도커를 실행하면 도커 설정 파일에서 지정한 대로 서버 전체를 온전히 복제한 컨테이너 이미지가 생성
- 컨테이너 이미지를 작동하면 컨테이너가 실행되면서 기존과 동일한 상태로 프로그램 서버를 실행
- 컨테이너 이미지를 처음 만들때는 모두 복제해야해서 오래걸림
- 이후에는 이미 받아놓은 이미지에서 변경된 부분만 갱신하면 되기 때문에 시간이 단축됨
- 여러 서버에서 컨테이너 이미지만 받으면 동일한 환경으로 서버를 실행할 수 있음
도커 파일 만들기
모듈 리스트 만들기
pip freeze > requirements.txt
- 가상환경에 설치한 라이브러리들을 리스트로 만들어 저장
도커 설정 파일 만들기
- 프로젝트 폴더에
Dockerfile
이름으로 설정 파일 만들기
- 프로그래밍 언어 버전, 작업 폴더 등을 지정
도커 컴포즈 파일 만들기
- 컨테이너 여러 개를 한 번에 실행시킬 수 있음
- 컨테이너 실행 시킬 때 옵션도 줄 수 있음
- 도커 컴포즈 파일의 기본 파일 명은
docker-compose.yml
환경설정 파일
- 디버깅 모드를 유지하는지 여부 등을 설정
- 파일명은
.env.dev
도커 컨테이너 실행하기
도커 이미지 생성
도커 컨테이너 실행
docker-compose up
python manage.py runserver
와 동일하게 서버가 실행됨
docker-compose up -d
백그라운드에서 서버 실행
도커에 생성된 이미지와 컨테이너 확인
docker image ls
docker container ls
도커 컨테이너 종료
도커로 디비 변경하기
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.py
는 sqlite
를 사용하도록 설정되어 있음
- 여기에
postgresql
을 사용하는데 필요한 정보를 추가해야함
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
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
를 실행하라는 의미