2018-07-06 TIL(Docker)

Docker container에 ubuntu 17.10 설치하기

$ docker run --rm -it ubuntu:17:10 /bin/bash
  • –rm : 프로세스 종료 후 컨테이너 삭제
  • -it : 입력을 받도록 함
  • /bin/bash : bash 실행

업데이트 실행

# apt update

업그레이드 가능한 목록을 의존성에 맞게 업그레이드

# apt dist-upgrade

zsh 설치

# apt install zsh

여기서 exit를 눌러서 나가면 이미지로 만들어진 ubuntu를 제외하고 컨테이너에서 실행되었던 업데이트, 업그레이드를 포함하여 zsh까지 모두 사라지게 된다.

따라서 위와 같은 필수적인 내용을 포함하여 이미지를 만들어야한다. Dockerfile을 생성해주어야 한다.

FROM			ubuntu:17.10
MAINTAINER	chpark816@gmail.com

RUN				apt -y update && apt -y dist-upgrade

RUN				apt -y install zsh

쉘로 돌아와서 만들어 놓은 Dockerfile로 image build를 해본다.

$ docker build -t ec2-deploy -f Dockerfile .

4개의 layer를 확인할 수 있다.

이와 같은 방법으로 pyenv, python, pipenv, language 설정, Pipfile복사하는 Dockerfile을 설치해준다.

전체 Dockerfile은 다음과 같다.

FROM        ubuntu:17.10
MAINTAINER  pchpch0070@gmail.com

# update, upgrade
RUN         apt -y update && apt -y dist-upgrade

# zsh
RUN         apt -y install zsh curl git
RUN         curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh | bash
RUN         chsh -s /usr/bin/zsh

# pyenv
RUN         curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
RUN         apt -y install make build-essential libssl-dev zlib1g-dev libbz2-dev \
                   libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
                   xz-utils tk-dev libffi-dev
# pyenv settings
RUN         echo 'export PATH="/root/.pyenv/bin:$PATH"' >> ~/.zshrc
RUN         echo 'eval "$(pyenv init -)"' >> ~/.zshrc
RUN         echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.zshrc

# install python, apply pyenv settings
ENV         PATH /root/.pyenv/bin:$PATH
RUN         eval "$(pyenv init -)"
RUN         eval "$(pyenv virtualenv-init -)"
RUN         pyenv install 3.6.5

# pipenv
RUN         apt -y install software-properties-common python-software-properties
RUN         add-apt-repository -y ppa:pypa/ppa
RUN         apt -y update
RUN         apt -y install pipenv

# Language
ENV         LANG    C.UTF-8
ENV         LC_ALL  C.UTF-8

RUN         apt -y install vim

# Copy Pipfile files
RUN			  mkdir  /srv/project
COPY        ./Pipfile   /srv/project
WORKDIR     /srv/project
RUN         pipenv install --skip-lock

위 설치 과정이 들어있는 파일을 Dockerfile.base로 한다.Pipfile의 내용이 바뀌었을 때마다 base파일로 빌드해주면 된다.

그리고 uWSGI 실행 같은 명령어들은 dockerfile에 둔다.

FROM        ec2-deploy:base

ENV         PROJECT_DIR     /srv/project

# Nginx, Supervisor install
RUN         apt -y install nginx supervisor

# Copy project files
COPY        .   ${PROJECT_DIR}
WORKDIR     ${PROJECT_DIR}

# Virtualenv path
RUN         export VENV_PATH=$(pipenv --venv); echo $VENV_PATH;

# Nginx config
            # nginx.conf(Nginx자체 설정파일)을 덮어씌우기
RUN         cp -f   ${PROJECT_DIR}/.config/nginx.conf \
                    /etc/nginx/nginx.conf && \
            # available에 nginx_app.conf파일 복사
            cp -f   ${PROJECT_DIR}/.config/nginx_app.conf \
                    /etc/nginx/sites-available/ && \
            # 이미 sites-enabled에 있던 모든 내용 삭제
            rm -f   /etc/nginx/sites-enabled/* && \
            # available에 있는 nginx_app.conf를 enabled로 링크
            ln -sf  /etc/nginx/sites-available/nginx_app.conf \
                    /etc/nginx/sites-enabled

# Supervisor config
RUN         cp -f   ${PROJECT_DIR}/.config/supervisor_app.conf \
                    /etc/supervisor/conf.d/

# Run supervisor
CMD         supervisord -n

수업 필기 내용(아래)

Nginx - uWSGI - Django

Web Server <-> WSGI <-> Web Application

Requirements

  • Python (3.6)
  • pipenv

Secrets

.secrets/base.json

{
  "SECRET_KEY": "<Django secret key>"
}

.secrets/dev.json

  • PostgreSQL을 사용, DATABASES섹션의 설정이 필요
{
  "DATABASES": {
    "default": {
      "ENGINE": "django.db.backends.postgresql",
      "HOST": "<host>",
      "PORT": 5432,
      "USER": "<user>",
      "PASSWORD": "<password>",
      "NAME": "<db name>"
    }
  }
}

Installation

pipenv install
pipenv shell
cd app
./manage.py runserver

Nginx

웹 서버 설정

/etc/nginx/nginx.conf
  • user: nginx 프로세스를 실행할 유저
  • daemon: off로 나타낼 시, background가 아닌 foreground프로세스로 실행
    • nginx -g 'daemon off;' <- 이것과 같은 효과가 됨

운영가능한 가상서버(Virtual host)

A, B, C, D, E 5개의 서버정보가 있다면, sites-available폴더에 들어있음

/etc/nginx/sites-available/*

실제 운용중인 가상서버

sites-available폴더에 있는 파일을 링크해서 사용

/etc/nginx/sites-enabled/<링크파일>

링크 명령어

ln -s <소스> <타겟>

Nginx와 uWSGI

Web Server <-> WSGI

서로간에 Unix socket을 사용해서 연결 /tmp/app.sock을 사용

이 때, uWSGINginx를 실행하는 프로세스들이 모두 해당 소켓파일에 접근할 권한이 있어야 함.

(실습때는 uWSGINginx모두 root계정을 사용해서 해결)

Nginx에서

자신의 가상서버 설정 (server블록)의 location에서, uwsgi_pass부분에 유닉스 소켓 프로토콜과 위치(unix://, /tmp/app.sock)을 지정

uWSGI에서

uWSGI를 실행하기 위한 설정파일 (uwsgi.ini)의 socket항목에 /tmp/app.sock을 지정

uWSGI

uWSGI의 설정은 <파일명>.ini파일에 ini방식으로 설정을 기술.

  • chdir: 웹 애플리케이션의 파이썬 프로젝트 루트 폴더
  • home: 실행할 파이썬 가상환경 / 파이썬 인터프리터의 위치
  • module: 웹 애플리케이션에서 WSGI프레임워크와의 연결을 기술한 파이썬 모듈

uWSGI와 Django

WSGI <-> Web Application

서로간의 연결에 웹 애플리케이션(Django)의 config.wsgi모듈 (app/config/wsgi.py파일)을 사용

Comments