ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [docker]docker에서 uWSGI 사용하기
    CoreOS/Docker 2016. 1. 23. 23:02

    앞서 설명한 uWSGI는 우분투에서 virtualenv를 사용해 하는 방법이였습니다. 지금부터는CoreOS의 docker에서 uWSGI를 사용하는 방법을 설명하겠습니다.

    docker에서 uWSGI를 사용하는 방법은 한 가지가 아닌 여러 방법이 있어 그 중, 대표적인 것을 설명드리겠습니다.


    docker-uwsgi-nginx 이미지를 설치하여 사용하는 방법


    Core OS를 설치 한 후, 아래 명령어를 실행시켜 docker-uwsgi-nginx 이미지를 PULL 받습니다.

    $ sudo docker pull dockerfiles/django-uwsgi-nginx


    아래 명령어를 치면 다음과 같이 이미지가 받아진 것을 확인할 수 있습니다.

    $ docker images
    REPOSITORY                       TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
    dockerfiles/django-uwsgi-nginx   latest              184bcb8fc8d3        2 years ago         924.5 MB


    다음 아래의 명령어를 실행시켜 test-uwsgi라는 이름의 컨테이너를 생성합니다.

     $ docker run -i -t -d -p 80:80 --name test-uwsgi dockerfiles/django-uwsgi-nginx /bin/bash


    도커의 실행 명령어 및 옵션들은 다음 페이지에서 설명하겠습니다. 위 명령어가 정상적으로 동작했으면 다음 명령어를 입력해 현재 동작 중인 컨테이너를 확인할 수 있습니다.

    f1c0a6b7427373f31274e5880021f251ff1babf95cc063e4f82f8d975e8f7063
    $ docker ps
    CONTAINER ID        IMAGE                            COMMAND             CREATED             STATUS              PORTS                NAMES
    f1c0a6b74273        dockerfiles/django-uwsgi-nginx   "/bin/bash"         2 minutes ago       Up 2 minutes        0.0.0.0:80->80/tcp   test-uwsgi


    다음 명령어로 docker 내부에 들어간 다음, uWSGI가 있는 폴더 내부로 이동합니다.

    $ docker exec -i -t test-uwsgi /bin/bash
    ---- 도커 컨테이너로 이동 --------------
    # cd /home/docker/code
    # ls
    AUTHORS  Dockerfile  README.md  app  nginx-app.conf  supervisor-app.conf  uwsgi.ini  uwsgi_params


    현재 설치된 패키지를 확인 하려면 Dockerfile을 열어보면 되지만 컨테이너에는 vi나 namo등 텍스트 편집기가 없어 읽지 못합니다. 그래서 아래 명령어를 실행시켜 vim을 해당 컨테이너에 받아 줍니다.

    # apt-get install vim
    # vi Dockerfile
     
    from ubuntu:precise
    maintainer Dockerfiles
    run echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
    run apt-get update
    run apt-get install -y build-essential git
    run apt-get install -y python python-dev python-setuptools
    run apt-get install -y nginx supervisor
    run easy_install pip
    # install uwsgi now because it takes a little while
    run pip install uwsgi
    # install nginx
    run apt-get install -y python-software-properties
    run apt-get update
    RUN add-apt-repository -y ppa:nginx/stable
    run apt-get install -y sqlite3
    # install our code
    add . /home/docker/code/
    # setup all the configfiles
    run echo "daemon off;" >> /etc/nginx/nginx.conf
    run rm /etc/nginx/sites-enabled/default
    run ln -s /home/docker/code/nginx-app.conf /etc/nginx/sites-enabled/
    run ln -s /home/docker/code/supervisor-app.conf /etc/supervisor/conf.d/
    # run pip install
    run pip install -r /home/docker/code/app/requirements.txt
    # install django, normally you would remove this step because your project would already
    # be installed in the code/app/ directory
    run django-admin.py startproject website /home/docker/code/app/
    expose 80
    cmd ["supervisord", "-n"]

     다음과 같이 작성된 것들이 현재 컨테이너 내부에 세팅되어져 있습니다. 

    현재 컨테이너에 설치된 패키지들은 다음과 같습니다.



    python2.7.3
    django1.6.1
    nginx1.1.19


    만약 필요한 것들이 있을 시, apt-get으로 패키지를 받을 순 있으나 권장하는 방법은 아닙니다.

    이후 uWSGI를 하는 방법은 이전에 uWSGI 설명서에 나와 있으니 그대로 따라하면 됩니다.

    Dockerfile을 생성해 사용하는 방법


    첫 번쨰 방법인 docker-uwsgi-nginx 이미지를 받아서 내부에서 전부 처리하는 것과 같은 방법입니다. 첫 번째 방식은 이미지를 컨테이너로 생성한 후, 컨테이너 내부에서 사용자가 필요한 것들을 명령어로 직접 설치를 해야 한다는 번거로움이 있습니다. 

    여기서 사용할 방법은 Dockerfile을 생성해 해당 파일 내에 사용자가 필요한 패키지 설치 명령어를 입력합니다. 다음 이 파일을 이미지 생성 시, 읽도록하여 사용자의 추가적인 설치 없이 사용할 수 있다는 장점이 있습니다.


    도커 파일을 생성 후 내부 내용의 예시입니다.

    $ sudo vi Dockerfile
     
    from ubuntu:14.04
    maintainer Dockerfiles
    
    
    run echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
    run apt-get update
    run apt-get install -y build-essential git
    run apt-get install -y python python-dev python-setuptools
    run apt-get install -y nginx supervisor
    run easy_install pip
    # install uwsgi now because it takes a little while
    run pip install uwsgi
    # install nginx
    run apt-get install -y python-software-properties
    run apt-get update
    RUN add-apt-repository -y ppa:nginx/stable
    run apt-get install -y sqlite3
    # install our code
    add . /home/docker/code/
    # setup all the configfiles
    run echo "daemon off;" >> /etc/nginx/nginx.conf
    run rm /etc/nginx/sites-enabled/default
    run ln -s /home/docker/code/nginx-app.conf /etc/nginx/sites-enabled/
    run ln -s /home/docker/code/supervisor-app.conf /etc/supervisor/conf.d/
    # run pip install
    run pip install -r /home/docker/code/app/requirements.txt
    # install django, normally you would remove this step because your project would already
    # be installed in the code/app/ directory
    run django-admin.py startproject website /home/docker/code/app/
    expose 80
    cmd ["supervisord", "-n"]


    순서대로 살펴보면

    FROM ubuntu:14.04
    MAINTAINER  Dockerfiles

    FROM은 생성되는 이미지 내의 OS이고, MAINTAINER는 해당 파일을 생성 및 관리를 한 사람입니다.


    run echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
    run apt-get update
    run apt-get install -y build-essential git
    run apt-get install -y python python-dev python-setuptools
    run apt-get install -y nginx supervisor
    run easy_install pip
    # install uwsgi now because it takes a little while
    run pip install uwsgi
    # install nginx
    run apt-get install -y python-software-properties
    run apt-get update
    RUN add-apt-repository -y ppa:nginx/stable
    run apt-get install -y sqlite3
    # install our code
    add . /home/docker/code/
    # setup all the configfiles
    run echo "daemon off;" >> /etc/nginx/nginx.conf
    run rm /etc/nginx/sites-enabled/default
    run ln -s /home/docker/code/nginx-app.conf /etc/nginx/sites-enabled/
    run ln -s /home/docker/code/supervisor-app.conf /etc/supervisor/conf.d/
    # run pip install
    run pip install -r /home/docker/code/app/requirements.txt
    # install django, normally you would remove this step because your project would already
    # be installed in the code/app/ directory
    run django-admin.py startproject website /home/docker/code/app/

    다음은 설치에 필요한 패키지들을 설치합니다. RUN은 직접 쉘 명령어를 실행시키는 명령입니다.


    # install django, normally you would remove this step because your project would already
    # be installed in the code/app/ directory
    run django-admin.py startproject website /home/docker/code/app/
    expose 80
    cmd ["supervisord", "-n"]

    패키지 설치 후, website라는 django 프로젝트를 /home/docker/code/app/에 설치하여 줍니다.

    expose는 컨테이너가 오플 할 포트를 지정하여 줍니다.

    cmd는 컨테이너에서 실행될 명령어를 지정해 줍니다.


    해당 파일을 생성한 후, 아래 명령어로 빌드하여 이미지를 생성합니다.

    $ docker build -t test .

    마지막 .은 빌드 대상의 디렉토리를 가리킵니다.

    위 Dockerfile에서 설정한 run 명령 각각은 이미지로 생성됩니다. 그래서 docker images -a하면 이름없는 이미지들이 다수 생성된 것을 확인할 수 있습니다. (docker image를 하면 처음 설정한 이름만 목록 확인 가능)


    생성한 이미지를 run 명령어로 실행 시킨 후, 첫 번째 방법과 동일하게 진행합니다.

    댓글