Technique

Google Cloud, Docker로 간단하게 웹서비스 구축하기(feat. Django) 3

JAY-GO 2018. 1. 18. 00:50
반응형

앞에서 준비한 django 프로젝트 및 셋팅파일들을 포함하는 docker 이미지를 만들고자 합니다. 이를위해 dockerfile을 작성하고 이를 빌드하여 이미지를 만들고, 빌드한 이미지를 가지고 컨테이너를 생성하여 서버의 구동 및 django의 정상 동작을 확인해 보도록 하겠습니다.


1. dockerfile을 프로젝트 폴더에 작성 합니다.

<dockerfile>

FROM ubuntu:18.04

MAINTAINER DEV-GO

RUN apt-get update -y && \
apt-get install -y \
nginx \
python3-dev \
python3-pip

RUN pip3 install django uwsgi

RUN echo "daemon off;" >> /etc/nginx/nginx.conf
RUN rm -rf /etc/nginx/sites-enabled/default
COPY mysite_nginx.conf /etc/nginx/sites-enabled/mysite_nginx.conf

COPY . /mysite/
WORKDIR /mysite/

RUN chmod +x /mysite/docker_start.sh # give permission
CMD /mysite/docker_start.sh

expose 80

FROM ubuntu:18.04 : DockerHub에는 미리 다양항 설정을 완료한 이미지 들이 공개되어 있으나, 처음 접하는 입장에서 다른사람들이 셋팅해놓은 이미지를 활용하기도 어렵고, 원리도 이해가 가지 않기 때문에 여기서는 기본 ubuntu만 설치되어 있는 이미지를 이용 합니다.

RUN apt-get ... : 필수적인 리눅스 패키지 들을 설치 합니다. apt-get update를 수행해야 apt-get이 패키지 리스트를 업데이트 하여 우리가 원하는 패키지를 설치할 수 있습니다. python, nginx, pip 를 설치하였습니다.

RUN pip3 install ... : 필요한 파이썬 패키지를 설치 합니다. django와 서버 구동시 필요한 uwsgi를 설치합니다.

RUN echo "deamon off;" ... : nginx를 데몬으로 실행시 동작이 멈춘다고 합니다(참조)

RUN rm -rf ... : nginx의 기본 설정을 제거 합니다.

COPY mysite_nginx.conf ... : 앞장에서 준비해 준 nginx 설정 파일을 docker 이미지의 nginx 설정파일의 위치에 복사 합니다.

COPY . /mysite/ : 현재위치(프로젝트 폴더, dockerfile이 존재하는 폴더) 의 내용을 docker 이미지의 /mysite/로 복사 합니다.

WORKDIR /mysite/ : CMD로 인한 명령은 /mysite/의 위치에서 동작합니다.

RUN chmod +x ... : 앞장에서 준비한 docker_start.sh을 실행할 수 있도록 권한을 부여합니다.

CMD /mysite/docker_start.sh : docker_start.sh를 실행시켜 nginx 와 uwsgi를 동작시켜 서버를 구동시킵니다.

EXPOSE 80 : 컨테이너의 80번 포트를 개방 합니다.


2. 이제 dockerfile을 빌드 합니다.

 ㅇ DOKER CLI 로 프로젝트 폴더에 접근 하여 build 명령을 시행합니다.

PS C:\users\dev\pycharmprojects\docker_django> docker build --tag docker_django:0.1 .

docker build 명령은 dockerfile의 내용을 빌드하여 docker 이미지를 만들어 줍니다. 맨 뒤의 . 은 현재 위치에 dockerfile이 있음을 의미하므로 꼭 입력해야 합니다.


 ㅇ docker 이미지 생성 확인

PS C:\users\dev\pycharmprojects\docker_django> docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

docker_django       0.1                 8a7138a8a35f        7 minutes ago       489MB


3. docker 컨테이너 생성

 ㅇ 앞에서 빌드한 이미지를 docker run 명령을 통해 컨테이너를 생성합니다.

PS C:\users\dev\pycharmprojects\docker_django> docker run --name docker_django_container docker_django:0.1

*** Starting uWSGI 2.0.15 (64bit) on [Wed Jan 17 15:35:18 2018] ***

compiled with version: 7.2.0 on 17 January 2018 14:22:13

os: Linux-4.4.89-boot2docker #1 SMP Wed Sep 27 22:59:39 UTC 2017

nodename: 9b032b62347b

machine: x86_64

clock source: unix

detected number of CPU cores: 1

current working directory: /mysite

detected binary path: /usr/local/bin/uwsgi

!!! no internal routing support, rebuild with pcre support !!!

uWSGI running as root, you can use --uid/--gid/--chroot options

*** WARNING: you are running uWSGI as root !!! (use the --uid flag) ***

*** WARNING: you are running uWSGI without its master process manager ***

your processes number limit is 1048576

your memory page size is 4096 bytes

detected max file descriptor number: 1048576

lock engine: pthread robust mutexes

thunder lock: disabled (you can enable it with --thunder-lock)

uwsgi socket 0 bound to UNIX address /tmp/mysite.sock fd 3

Python version: 3.6.4 (default, Dec 27 2017, 13:02:49)  [GCC 7.2.0]

 * Starting nginx nginx

*** Python threads support is disabled. You can enable it with --enable-threads ***

Python main interpreter initialized at 0x55ab2a926980

your server socket listen backlog is limited to 100 connections

your mercy for graceful operations on workers is 60 seconds

mapped 72760 bytes (71 KB) for 1 cores

*** Operational MODE: single process ***

WSGI app 0 (mountpoint='') ready in 3 seconds on interpreter 0x55ab2a926980 pid: 7 (default app)

*** uWSGI is running in multiple interpreter mode ***

spawned uWSGI worker 1 (and the only) (pid: 7, cores: 1)

정상적으로 컨테이너가 생성되면 위와같은 출력이 나타납니다.


4. 컨테이너 동작 확인

 ㅇ kitemetic으로 컨테이너의 상태를 확인 합니다.

docker run으로 구동시킨 docker_django_container 컨테이가 동작하고 있습니다. 아직은 django가 동작하고 있는게 확인되지 않습니다.


4. django 동작 확인

 ㅇ dockerfile에 개방하도록 정의해둔 80번 포트를 호스트의 포트와 연결 합니다.


 ㅇ 컨테이너에서 django가 동작하고 있음을 확인할 수 있습니다.

WEB PREVIEW를 통해 django의 동작 화면이 보입니다. 아쉽게도 오류 화면이 나오고 있으나, 이는 django에 접속 허용 주소 셋팅을 하지 않아 발생하는 것이므로 추후 개발과정에서 셋팅에 접속할 주소만 입력해 주면 해결됩니다.


이제 우리는 docker 컨테이너를 생성하자마자 서버가 동작하여 django 화면을 출력해 주는 docker 이미지를 확보 하였습니다. 다음 번에는 해당 이미지를 활용하여 google cloud에 배포해 보도록 하겠습니다.








반응형