Django-Deploy_EC2(Docker)

본 문서는 패스트캠퍼스 ‘Web-Programming School’ 수업 자료를 바탕으로 작성되었습니다.


도커

(서비큘라 기술 블로그)[https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html]

도커 설치하기

도커는 Linux 컨테이너 기술이기 때문에 다른 운영체제의 경우 다른 방법으로 설치를 해야한다.

curl -fsSL https://get.docker.com/ | sudo sh

sudo 없이 사용하기

도커는 기본적으로 root 권한이 필요하기 때문에 sudo 없이 사용하려면 아래와 같이 사용자를 docker 그룹에 추가하자

>> sudo usermod -aG docker $USER # 현재 접속중인 사용자에게 권한주기
>> sudo usermod -aG docker your-user # your-user 사용자에게 권한주기

도커 파일 작성하기

.config와 같은 위치에 Dockerfile파일을 생성하자. 이미지를 만드는데 오래 걸리는 명령어의 경우 *.base 이런식으로 도커 파일을 분리하여 파일을 생성한다.


/* Dockerfile.base */
FROM        python:3.6.4

RUN         apt-get -y update
RUN         apt-get -y dist-upgrade

COPY        . /srv/project
WORKDIR     /srv/project
RUN         pip install -r requirements.txt

/* Dockerfile */
FROM    ec2-deploy.base

도커 이미지 만들기

docker build -t <도커 이미지 이름> -f <실행할 도커 파일> <도커 파일 위치>
>> docker build -t ec2-deploy.base -f Dockerfile ~/OH_Team/ec-deploy
  • -t: 도커 이미지 이름 설정을 위한 옵션
  • -f

도커 이미지 리스트

매번 도커 이미지를 만들 때마다 이전에 도커 이미지를 덮어 씌우는 것이 아니라 새로운 이미지가 생성된다. 그래서 사용하지 않는 이미지는 개별적으로 삭제해야 한다.

>> docker images

REPOSITORY              TAG                 IMAGE ID            CREATED              SIZE
ec2-deploy.base         latest              215974a714cb        About a minute ago   732MB

도커 이미지 실행하기

Host(도커를 실행중인 컴퓨터) :8000
-p :
Container (도커 이미지를 실행) :4567

docker run --rm -it -p 8000:4567 ec2-deploy /bin/bash
root@75ce82f84a1c:/srv/project#
root@75ce82f84a1c:/srv/project# cd app
root@75ce82f84a1c:/srv/project/app# export DJANGO_SETTINGS_MODULE=config.settings.dev
root@75ce82f84a1c:/srv/project/app# ./manage.py runserver 0:4567
  • -p : 포트 옵션

도커에서 uwsgi 실행

supervisor

Supervisor 시스템은 유저가 UNIX와 유사한 운영 체제에서 여러 프로세스를 모니터하고 관리 할 수 있는 클라이언트/서버 시스템이다.

nginx

  • nginx가 기본을 daemon으로 실행되는데 Supervisor를 사용하기 위해 몇가지 설정하자.
/* nginx.conf */
daemon off;
user root;
worker_processes 4;
pid /run/nginx.pid;
events {
    worker_connections 768;
    # multi_accept on;
}
http {
    ##
    # Basic Settings
    ##
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;
    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    ##
    # SSL Settings
    ##
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;
    ##
    # Logging Settings
    ##
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    ##
    # Gzip Settings
    ##
    gzip on;
    gzip_disable "msie6";
    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    ##
    # Virtual Host Configs
    ##
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}
#mail {
#   # See sample authentication script at:
#   # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
#   # auth_http localhost/auth.php;
#   # pop3_capabilities "TOP" "USER";
#   # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
#   server {
#       listen     localhost:110;
#       protocol   pop3;
#       proxy      on;
#   }
#
#   server {
#       listen     localhost:143;
#       protocol   imap;
#       proxy      on;
#   }
#}