[Docker] Django 개발 환경 세팅 #1
[Docker] MariaDB - docker로 관리하기
[Docker] Nginx 웹서버 구동해보기 컨테이너에 대하여 [Container 시리즈] 00. Container/ Docker란 뭔가요? Container / Docker 컨테이너.. 들어봤는데 무엇인지 잘 모르겠다..라고 생각하시는 분들을 위하여 이..
hyeo-noo.tistory.com
Django와 MariaDB를 연결해서 로컬 개발환경을 구축해보자
Nginx를 연결하지 않는 이유
로컬 환경에서 nginx까지 연결하게되면 코드를 수정하고 변경사항을 볼 때마다 django 컨테이너를 재시작해주어야 확인이 가능하다.
그리고 static파일을 따로 관리하는데 약간의 추가작업이 필요하기 때문에 더욱이 로컬 환경에서 nginx를 사용할 필요는 없다고 생각함!
1. Django 실습 프로젝트 파일 받기
GitHub - hyun98/Docker_Practice: Django-Nginx 서버를 Docker를 통해 로컬에서 구동해보는 연습코드
Django-Nginx 서버를 Docker를 통해 로컬에서 구동해보는 연습코드. Contribute to hyun98/Docker_Practice development by creating an account on GitHub.
github.com
먼저 프로젝트 저장소를 클론!
$ git clone https://github.com/hyun98/Docker_Practice.git
원하는 디렉토리 위치에서 위 코드를 실행해주자
2. 도커 이미지 빌드
이제 프로젝트의 루트 디렉토리에서 도커 이미지를 만들어보자
$ docker build -t django:test -f localbind.Dockerfile .
이렇게 하면 django:test 라는 도커 이미지가 만들어진다.
docker build : 도커 이미지를 만드는 명령어
-t : 이미지의 이름과 태그 지정 > 태그는 이미지의 버전을 나타낼 수 있는 좋은 옵션이다. -t 옵션을 사용하지 않으면 16진수 형태의 이름으로 이미지가 생성된다.
django:test : 새로 만들게 될 이미지의 이름과 태그
-f : Dockerfile을 지정해 줄 수 있는 옵션
localbind.Dockerfile : Dockerfile의 이름을 커스텀
. : 현재 디렉토리의 Dockerfile을 사용하겠다는 의미
3. Dockerfile 살펴보기
FROM python:3.9.0
COPY ./ /home/Docker_Practice/
WORKDIR /home/Docker_Practice/
RUN apt-get update
RUN pip install -r requirements.txt
EXPOSE 8000
CMD ["bash", "-c", "python manage.py migrate && python manage.py runserver 0.0.0.0:8000"]
FROM python:3.9.0
도커 허브에서 python:3.9.0 이미지를 기반으로 두고 이미지를 만들겠다는 뜻이다.
Dockerfile로 이미지를 생성할 때는 항상 기존에 있는 이미지를 기반으로 새 이미지를 만들기 때문에 FROM은 반드시 설정해야 한다.
태그를 붙이지 않는다면 latest가 자동으로 선택된다.
Dockerfile하나에 FROM을 여러 개 설정할 수 있다. FROM을 두 개 설정했다면 이미지가 두 개 생성됨. -t 옵션으로 이미지 이름을 설정했다면 맨 마지막 FROM에 적용이 되어 생성된다.
COPY ./ /home/Docker_Practice/
COPY [복사할 호스트 파일 경로] [이미지에서 복사한 파일이 위치할 경로] 형식이다.
[복사할 호스트 파일 경로] 는 항상 현재 Dockerfile이 위치한 경로 내부에 있는 파일만 가능하다. 상대경로 '../'를 통해 현재 디렉토리 바깥으로 나가거나 절대경로로 디렉토리 바깥의 파일을 복사할 수 없다.
[이미지에서 복사한 파일이 위치할 경로] 는 항상 절대 경로로 설정해야한다. 그리고 마지막이 / 로 끝나면 디렉토리가 생성되고 그 아래에 파일들이 복사된다.
COPY ./ /home/Docker_Practice/ 와 같이 현재 디렉토리를 복사할 때 .dockerignore에 추가되어 있는 파일과 폴더는 제외된다.
COPY 명령어 덕분에 이미지를 만들 때 git에서 파일을 가져올 필요가 없어진다.
WORKDIR /home/Docker_Practice/
WORKDIR [경로] 형식이다.
WORKDIR 뒤에 오는 모든 RUN, CMD, ENTRYPOINT에 적용된다. 중간에 다른 WORKDIR을 설정해서 언제든지 바꿀 수 있다.
상대경로를 사용할 수 있고, 직전에 설정한 WORKDIR의 경로를 기준으로 설정한다.
하지만 경로의 투명성을 위해서 절대경로를 사용하자.
RUN apt-get update
RUN pip install -r requirements.txt
FROM에서 설정한 이미지 위에서 스크립트나 명령을 실행한다.
RUN으로 실행한 결과는 캐시되며 다음 빌드 때 재사용한다.
캐시를 사용하지 않고 새로 이미지를 만들려면 docker build --no-cache 로 시작해서 이미지를 만들면 된다.
EXPOSE 8000
호스트와 연결할 포트 번호를 설정해 준다. docker run에서의 --expose 명령과 동일.
EXPOSE를 여러개 사용할 수 있다.
EXPOSE는 호스트와 연결만 하고 외부에 노출이 되지 않는다.
포트를 외부에 노출하려면 docker run에서 -p 명령어를 통해서 host:container 형식으로 포트를 노출시킬 수 있다.
CMD ["bash", "-c", "python manage.py migrate && python manage.py runserver 0.0.0.0:8000"]
도커 컨테이너가 구동될 때 실행하는 명령어들의 집합이다. CMD가 여러개인 경우 가장 마지막 CMD만 실행된다.
bash쉘에서 여러개의 명령어를 사용하려면 && 연산자로 명령어를 나누어주면 된다.
4. 컨테이너 생성하기
$ docker network create django
$ docker run -d --name djangotest -v ${PWD}:/home/Docker_Practice -p 8000:8000 --net=django django:test
network라는 개념이 처음 등장했다
네트워크 만들기 : docker network create {네트워크 명}
Docker network는 목적에 따라 다양한 종류의 네트워크 드라이버를 지원한다.
bridge : 하나의 호스트 컴퓨터 내에서 여러 컨테이너들이 서로 소통할 수 있게 해준다.
host : 호스트 컴퓨터와 동일한 네트워크에서 컨테이너를 돌리기 위해서 사용됨
--net을 통해서 네트워크 연결을 깜박했다면
$ docker network connect django djangotest
django 네트워크에 djangotest 컨테이너를 위와같이 연결해 줄 수 있다.
$ docker network inspect django
inspect 명령어를 통해서 'django' 네트워크의 상태를 볼 수 있다.
주의
djangotest 컨테이너를 만들고 -d 옵션으로 백그라운드에서 실행되게 했지만 아직 컨테이너가 구동될 수 없다.
django 설정에서 mariadb를 연결하도록 지정했고, Dockerfile을 보면 CMD에 'python manage.py migrate'를 볼 수 있다.
이 명령어는 데이터베이스에 장고의 모델들을 마이그레이션 해주는 명령어이다.
아직 mariadb컨테이너가 없기때문에 오류가 발생해서 컨테이너가 실행될 수 없다.