Docker Compose를 활용해 파이썬 개발환경 구성하기

김기욱·2021년 1월 14일
2

PIP install -r requirement.txt는 무적인가?

  1. 보안관련 패키지 설치 시 오류 발생가능

  2. DB관련 패키지 설치 시 오류 발생가능

  3. 이미지 관련 패키지 설치 시 오류 발생가능

  4. 권한관련 패키지 설치 시 오류 발생가능

sudo pip install 같은 위험한 접근법이나 brew install같은 번잡한 과정은 해결책이 될 수 없음.

또한 배포할 때는 {이런 노가다 과정들을}한 번 더 해야한다.

문제발생 원인

소프트웨어가 성장 => 의존하는 패키지 증가 => 문제가 발생할 지점들이 많아짐
(ex: 상호 의존하는 패키지들의 버전 충돌)

비단 백엔드뿐만 아니라 프론트엔드 같은 경우에도 webpack설정 package_json에 상기된 여러 의존성 파일들이 똑같은 원인으로 여러 오류가 발생이 가능합니다.

도커란?

다양한 프로그램, 실행환경을 컨테이너로 추상화하여, 배포 및 관리를 단순하게 도와주는 도구입니다.

컨테이너? 선박화물 규격화 vs 도커 컨테이너? 프로그램(서버) 규격화

도커의 실행과정

docker run -it python:3 : 도커로 파이썬3(최신버전) 실행
docker ps
docker logs [CONTAINER ID] : : 실행 중인 파이썬3의 로그를 살펴보기
docker exec -it : 실행 중인 파이썬3에 접속해보기

python:3 == 도커 이미지
실행중인 파이썬3(컨테이너아이디)== 컨테이너

클래스(이미지)와 인스턴스(컨테이너)같은 느낌

웹 서버 실행에 필요한 것

  1. 서버 (python:3)
  2. 실행될 코드 (--volume)
  3. 실행 될 명령어 (bash)
  4. 환경변수 (--env)

도커 안에 모두 넣을 수 있다!

  1. 서버 환경 구성
  2. 의존 패키지 설치

도커파일(Dockerfile)을 이용해 나만의 도커 이미지를 만들 수 있다.

예제

FROM python:3
RUN apt-get update && apt-get -y install \
	libpq-dev
ADD ./djangosmaple
WORKDIR /app
CMD ["python", "manange.py", "runserver", "0:8000"]

이미지를 만들고(도커파일을 다 만들고 난 후에)

예제

git clone [리포지토리 주소]
cd django-smaple-for-compose <-- 이동할 디렉토리
docker build -t my-django <-- 빌드업시작(프로젝트이름)

컨테이너 실행

예제

docker run -d \
--env POSTGRES_DB = djangosample \
--env POSTGRES_USER = smapleuser \
--env POSTGRES_PASSWORD = samplesecret \
--name db \
postgres

docker run -it \
--env DJANGO_DEBURG = True \
--env DJANGO_DB_HOST = postgres \
--link db:postgres \
--publish 8000:8000 \
my-django

open http://127.0.0.1:8000

--name db : 컨테이너의 이름을 db로 지정합니다
--link db:postgres : db컨테이너에 접근할 때, postgres라는 이름을 사용합니다
--publish 8000:8000 : 로컬 8000포트를 컨테이너 8000포트에 연결합니다

문제점 : my-postgres 컨테이너를 종료하면 그동안 개발서버를 띄우고 작업했던 내용들도 모두 사라짐

mkdir data
docker run -d \
--env POSTGRES_DB = djangosample \
--env POSTGRES_USER = smapleuser \
--env POSTGRES_PASSWORD = samplesecret \
--name db \
--volume data: var/lib/postgresql/data \ <-- 새로추가
postgres

문제점 : 컨테이너 종료 후에도 찌꺼기가 남는 문제

mkdir data
docker run -d \
--env POSTGRES_DB = djangosample \
--env POSTGRES_USER = smapleuser \
--env POSTGRES_PASSWORD = samplesecret \
--name db \
--volume data: var/lib/postgresql/data \ <-- 새로추가
-- rm <-- 새로추가2
postgres

문제점 : 소스를 바꿔도 개발서버가 재실행 되지 않는 문제

docker run -it \
--env DJANGO_DEBURG = True \
--env DJANGO_DB_HOST = postgres \
--link db:postgres \
--publish 8000:8000 \
--volume `pwd` : /app \ <-- 새로추가
my-django

Docker Compose

이런 복잡한 명령어들을 docker-compose up으로 심플하게 실행가능
비밀은 docker-compose.yml에서 미리 위의 내용들을 적어두기

실행 중인 서비스 상태보기

docker-compose ps

서비스 실행도 하고 로그도 따라가기

docker-compose up

로그없이 서비스 실행

docker-compose up -d

서비스 컨테이너에서 명령어 실행

docker -compose exec django manage.py
docker -compose exec django bash 등등..

컨테이너 멈추고 삭제하기

docker -compose down

pdb붙이기

#docker-compose.yml
 django:
 	...
    stdin_open:true
    tty: true
#docker attach CONAINER_ID

print출력을 빠르게

도커서버가 print('예제') 출력이 느린이유? 파이썬 버퍼가 잡고있어서!
ENV PYTHONUNBUFFERED 0 설정 추가

상황별 up 명령의 옵션

  • Dockerfile을 수정했다면..?
    docker-compose up --build

  • docker-compose.yml을 수정했다면..?
    docker-compose up --force-recreate

팁 : 배포용 도커파일과 개발용 도커파일은 분리

/Dockerfile : 배포용
/compose/django/Dockerfile-dev : 개발용

ERROR : 'No space left on device' 해결

Docker for OSX에서 사용하는 가상 디스크가 꽉 차서 발생하는 문제
Docker for OSX의 환경설정 -> Reset탭 -> Reset Disk Image

단점?

  • pdb같은 디버거 붙이기가 까다롭다
  • 저사양 컴퓨터에서 좀 느리다

출처 : https://youtu.be/oQ50eqDH91A

profile
어려운 것은 없다, 다만 아직 익숙치않을뿐이다.

0개의 댓글