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
을 사용
이 때, uWSGI
와 Nginx
를 실행하는 프로세스들이 모두 해당 소켓파일에 접근할 권한이 있어야 함.
(실습때는 uWSGI
와 Nginx
모두 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