Django와 MariaDB를 연결해서 로컬 개발환경을 구축해보자
Nginx를 연결하지 않는 이유
로컬 환경에서 nginx까지 연결하게되면 코드를 수정하고 변경사항을 볼 때마다 django 컨테이너를 재시작해주어야 확인이 가능하다.
그리고 static파일을 따로 관리하는데 약간의 추가작업이 필요하기 때문에 더욱이 로컬 환경에서 nginx를 사용할 필요는 없다고 생각함!
1. Django 실습 프로젝트 파일 받기
먼저 프로젝트 저장소를 클론!
$ 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컨테이너가 없기때문에 오류가 발생해서 컨테이너가 실행될 수 없다.
Next Posting : MariaDB 컨테이너 생성, docker network를 통해 연결하기
'DevOps > Docker' 카테고리의 다른 글
[Docker] Docker 관련 tip #1 (0) | 2021.08.10 |
---|---|
[Docker] Django 개발 환경 세팅 #2 (0) | 2021.08.05 |
[Docker] MariaDB - docker로 관리하기 (0) | 2021.07.29 |
[Docker] container, image 삭제 (2) | 2021.07.26 |
[Docker] Nginx 웹서버 구동해보기 (2) | 2021.07.26 |