본문 바로가기

Docker

Docker 사용법 (django)

docker 사용하는 이유

개발을 하면서 필요한 라이브러리들을 local에 계속 설치하면 복잡해진다.

그래서 프로젝트마다 필요한 라이브러리만 설치하기 위해 가상의 환경을 사용하게 된다.

내가 만든 앱을 local로 돌릴땐 잘 돌아가지만 다른 사람의 컴퓨터에서 돌려보려면 복잡해진다.

가상환경 셋팅 부터 종속성 패키지 설치 등 시간이 오래걸린다.

그러나 docker로 image를 만들면 한 번에 개발환경 세팅을 해결해 주기 때문에 간편하다.

어떤 OS를 사용하던 어떤 컴퓨터를 사용해도 동일한 환경에서 서버를 돌릴 수 있다.

docker install

docker 설치 확인하기

itrem에서 docker를 입력해보면 명령어가 나온다. 그렇다면 설치가 된것이다.

docker hub 및 가입하기

https://hub.docker.com/ 으로 가서 가입하자

django image 가져오기

이미지는 컨테이너를 만들 수 있는 설계도이다. 그리고 private, public으로 설정할 수 있다.

이미지는 컨테이너 실행에 필요한 모든 것들이 설정 되어 있고, 하나의 이미지로 여러개의 컨테이너를 만들 수 있다.

$ docker pull django:latest

여기서 :latest 는 최신버전으로 가져온다는 뜻이다.
(docker pull django 까지만 해도 된다. :latest는 default로 처리되어 있기 때문이다.)

django app에 Dockerfile 만들기

django project 제일 상단에 Dockerfile이라는 이름을 가진 파일을 만든다. (뒤에 확장자는 없어도 된다.)

파일을 만들었다면 이제 Dockerfile에 내용을 담아야 하는데 ARG PROJECT_DIR이 제일 중요하다. 중요한 이유는 docker의 directory를 만드는 것이고

이후에 내 컴퓨터에 directory와 docker의 컨테이너의 directory를 정확하게 연결하는 과정에서 쓰이기 때문이다.

ARG PROJECT_DIR에 담길 내용은 django를 처음 세팅할때 startproject로 만들어준 폴더이름을 적어주면 된다. (쉽게 말하면 settings.py가 있는곳)

FROM python:3.9.5

ARG PROJECT_DIR="/config"

COPY . ${PROJECT_DIR}

WORKDIR ${PROJECT_DIR}

RUN pip install --upgrade pip && pip install -r requirements.txt

CMD python manage.py runserver 0.0.0.0:8000 --settings=config.settings.local

EXPOSE 8000

위와 같이 셋팅 해주면 된다.

requirements.txt 만들기

django project를 만들었다면 패키지 종속성 관리를 위해 requirements.txt에 패키지들을 모아주어야 한다.

docker는 새로 만드는 형태이기 때문에 현재 프로젝트를 가지고 가려면 패키지 종속성 관리 파일을 가지고 있어야한다.

만약 아직 패키지를 담아내지 못하였다면 아래 명령어로 requirements.txt로 담을 수 있다.

$ pip freeze > requirements.txt

추가 적으로 위 Dockerfile에 있는 내용으로서 패키지 설치를 하는 명령어는 아래와 같다.

$ pip install -r requirements.txt

docker 돌리기

내가 만든 app을 이미지로 만드는 단계

docker build -t <사용할 이름> .

-t 는 tag의 줄임말로 docker에 이름을 붙여준다는 의미이다.

뒤에 . 의 의미는 현재 폴더에 있는 Dockerfile을 이미지로 만들겠다는 의미이다. (.. 은 상위 폴더를 의미한다.)

만약 여기서 빌드가 실패 했다면 Dockerfile에 입력한 내용이 문제가 있을 수 도 있으므로 확인 해봐야한다.

참고) pygraphviz가 requirements.txt에 있으면 제거하고 build해주자

pygraphviz -> 모델 다이어그램 그릴때 설치하는 패키지라 프로젝트에 피해 없음.

이미지를 컨테이너로 만드는 단계

컨테이너는 이미지가 실행된 상태라고 볼 수 있고, local에만 있는것으로 공유할 수 없다.

$ docker run -it -p 8000:8000 --volume $(PWD):/config --name django_container1 fbv-django

위의 명령어 구문에 대해서 하나씩 알아보겠다.

-it

-it는 interaction으로 서버의 log를 확인하고 싶을 때 쓴다.

log를 확인하지 않아도 될 때는 -d를 쓴다. (detach)

-p

-p--port의 줄임말이다. 컴퓨터(local)의 portdocker의 port를 맞춰줘야 한다.

장고의 기본 port는 8000이다.

앞의 8000이 local의 port / 뒤의 8000은 docker의 port다.

: (콜론)은 연결의 의미

--volume

local 파일에서 수정한 내용이 docker에 적용이 되게 하기 위해서

local의 디렉토리를 docker 컨테이너 내부의 디렉터리와 정확히 연결해야 하고 그 역할을 하는 것이 --volume이다. (중요함)

$(PWD)

$(PWD)는 현재 경로(local)

/config는 앞에 Dockerfile에서 만든 ARG PROJECT_DIR의 이름 (사용자 지정 이름이라 알맞게 사용하면 된다.)

--name은 컨테이너의 이름을 붙여주는 부분이다. (정하고 싶은 이름을 입력하면 된다.)

마지막으로 어떤 이미지를 컨테이너로 만들 것인지 지정해 주어야 한다.

마지막에 fbv-django는 이미지의 이름이다.

컨테이너 끄고 켜기

컨테이너 켜기

$ docker start -i <docker_image 이름>

컨테이너 끄기

$ docker stop <docker_image 이름>

docker 이미지 제거

$ docker rm <docker_image 이름>

만약 도커 이미지 이름을 설정 해주지 않았다면 image_id를 입력해주어야 하는데 그 부분은 아래에 설명을 참고 하면 된다.

docker ps / docker ps -a

$ docker ps
$ docker ps -a

docker ps 는 지금 실행되고 있는 docker image가 나오고 docker ps -a 는 현재 docker에 있는 모든 image가 나온다.