LoginSignup
53
51

DockerでPython+uWSGI+Nginxの環境を作成

Last updated at Posted at 2017-06-28

#DockerでPython3.5で作成したWebアプリケーションの検証用環境を作成
PythonでWebアプリケーションを作成することはほんとんどなかった。ノンブロッキングI/Oの(node.jsGolangとの比較検証等を考慮した)動作検証をする際にWebアプリケーションとして用意したかったので、その際、Docker for Macで簡単な環境を構築したので備忘録として記載。
Docker ComposeでPython3.5+uWSGI+Nginxの動作環境用のコンテナを用意した。
余談だが、uWSGIは「ウエスギ」という読み方が一般化しているようだ。「ユーウイスキー」と読んでいた。

##Docker for Macのインストール
Docker for Macを利用した。ここからDocker for Macをダウンロードして、Macにインストールする。

##Docker Composeの設定ファイルの用意
###ディレクトリ構成
下図が今回のディレクトリ構成。

スクリーンショット 2017-06-28 18.45.27.png

###docker-compose.yml
コンテナは1つだけ、コンテナ起動後、ローカルからはポート番号8080でhttpアクセスする。

docker_python/docker-compose.yml
version: "2"
services:
  # nginx
  nginx-python:
    build: ./nginx-python
    ports:
      - "8080:80"
    volumes:
      - ./app/:/var/www/html/app/
    environment:
      TZ: "Asia/Tokyo"

###Webサーバの構成
CentOSにPython3.5、uWSGI、Nginxをインストールする。

####Dockerfile
CentOS6.8をベースにした。

docker_python/nginx-python/Dockerfile
FROM centos:6.8

ADD ./conf/nginx.repo /etc/yum.repos.d/

# nginx & python
RUN yum localinstall -y http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
RUN yum install -y https://centos6.iuscommunity.org/ius-release.rpm
RUN yum install -y nginx-1.10.1
RUN yum install -y make gcc
RUN yum install -y libxml2-devel
RUN yum install -y python35u python35u-libs python35u-devel python35u-pip
RUN yum clean all

RUN ln -s /usr/bin/python3.5 /usr/bin/python3
RUN unlink /usr/bin/python
RUN ln -s /usr/bin/python3 /usr/bin/python
RUN ln -s /usr/bin/pip3.5 /usr/bin/pip

RUN pip install uwsgi

# setting nginx
COPY conf/nginx.conf /etc/nginx/nginx.conf
ADD conf/default.conf /etc/nginx/conf.d/default.conf
RUN usermod -u 1000 nginx

EXPOSE 80

ADD ./conf/start.sh /tmp/start.sh

CMD /bin/sh /tmp/start.sh

####追加ファイル

docker_python/nginx-python/conf/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1
docker_python/nginx-python/conf/nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        off;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}
docker_python/nginx-python/conf/default.conf
server {
    listen 80 default;
    server_name _;

    location / {
        include uwsgi_params;
        uwsgi_pass localhost:8080;
    }

    location = /favicon.ico {
        empty_gif;
    }
}
docker_python/nginx-python/conf/start.sh
#!/bin/sh

/etc/init.d/nginx start
cd /var/www/html/app
chmod -R 777 .
uwsgi --ini uwsgi.ini

###アプリケーション
アプリケーション用のディレクトリを用意し、PythonファイルとuWSGIの設定ファイルを配置。コンテナ起動時にマウントされる。
uwsgi.loguwsgi.pidは空ファイル(touchコマンド)で用意。

docker_python/app/webapp.py
def application(environ, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"]
docker_python/app/uwsgi.ini
[uwsgi]
master = True
socket = localhost:8080
wsgi-file = webapp.py
stats = localhost:8181
logto = uwsgi.log
pidfile = uwsgi.pid

空ファイルを作成。

$ touch docker_python/app/uwsgi.log
$ touch docker_python/app/uwsgi.pid

##コンテナの操作
###コンテナのビルドと起動
ビルドと起動両方を実施する場合(-dオプションを指定するとバックグラウンドで起動):

$ docker-compose up --build

ビルドのみの場合:

$ docker-compose build

起動のみの場合(-dオプションを指定するとバックグラウンドで起動):

$ docker-compose up

###コンテナIDの確認
コンテナのビルドが正常に完了した後で実行。

$ docker ps -a
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS                     PORTS                           NAMES
0be4855e99df        dockerpython_nginx-python   "/bin/sh -c '/bin/..."   2 hours ago         Up 2 hours                 0.0.0.0:8088->80/tcp            dockerpython_nginx-python_1

###コンテナの停止・開始
上記の”コンテナIDの確認”を例にするとCONTAINER_ID0be4855e99dfを指定。

停止する場合:

$ docker stop 0be4855e99df

開始する場合:

$ docker start 0be4855e99df

再起動する場合:

$ docker restart 0be4855e99df

###起動しているコンテナにログイン
コンテナに入ることができ、サーバの状態等が確認できる。

$ docker exec -it 0be4855e99df bash

###コンテナの削除
コンテナが停止している状態であれば、削除可能。

$docker rm 0be4855e99df

##デモ
コンテナを起動して、http://localhost:8080にブラウザでアクセスすると、"Hello World"が表示される。

53
51
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
53
51