DockerでDjangoアプリケーションをデプロイする 

**Docker**は、コンテナを利用してアプリケーションの作成、デプロイ、実行を容易にする技術です。

*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/how-to-deploy-a-django-application-with-docker_581157)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*

###Dockerとは？
Dockerは、コンテナを利用してアプリケーションの作成、デプロイ、実行を容易にする技術です。コンテナを使うことで、開発者はアプリケーションに必要なすべてのコンポーネントをパッケージ化し、後からパッケージとして出荷することができます。また、同じサーバー上でより多くのアプリケーションを稼働させることも可能になります。

Dockerを使えば、コンテナ上で動作しているアプリケーションは互いに隔離されているため、より高いレベルのセキュリティを確保することができます。さらに、Dockerは各コンテナが独自のリソースを持っていることを保証するので、アプリケーションは割り当てられたリソースのみを使用することになります。

###前提条件
このガイドを開始する前に、以下のものが必要です。

- [Alibaba Cloud ECS](https://www.alibabacloud.com/ja/product/ecs) Linuxインスタンス。まだLinuxインスタンスをセットアップしていない場合は、[この記事](https://www.alibabacloud.com/blog/3-ways-to-set-up-a-linux-server-on-alibaba-cloud_572384)で様々なセットアップ方法を紹介します。
- Docker
- Python 2.7

###Dockerのインストール
ssh コマンドを使ってサーバにログインします。

`$ ssh root@47.88.220.88`

Ubuntuのパッケージを更新します。

`$ sudo apt-get update`

以下のコマンドで最新版のDockerをインストールします。

`$ sudo apt-get install docker`

Dockerが正しくインストールされていることを確認するには、以下のコマンドを実行します。

`$ sudo docker run hello-world`

正しく実行すれば、上記のコマンドでインスタンスがテストイメージをダウンロードしてコンテナ内で実行できるようになるはずです。

###Dockerでのコンテナとイメージ
[Alibaba Cloud ECS](https://www.alibabacloud.com/ja/product/ecs)インスタンスでは、イメージを使用して同じ構成のECSクラスタを作成することができます。同様に、Dockerコンテナにもイメージがあります。概念的には、両者は非常に似ています。Dockerの公式ドキュメントに基づいています。

コンテナイメージは、軽量でスタンドアロンの実行可能なソフトウェアのパッケージであり、それを実行するために必要なすべてのものが含まれています: コード、ランタイム、システムツール、システムライブラリ、設定。

実行中のコンテナは、`$ sudo docker ps`を実行することで見ることができます。

一方、イメージとは、コンテナのスナップショットのような不活性で不変なファイルのことです。イメージは build コマンドで作成され、run コマンドで起動するとコンテナを生成します。

イメージは `$ sudo docker images` を実行することで見ることができます。

###Djangoアプリケーションを構築する
まずはDjangoをインストールしてDjangoアプリケーションを作成してみましょう。

```
$ sudo pip install django==1.9
$ django-admin startproject djangoapp
```

###要件ファイル
djangoapp ディレクトリ内に要件ファイルを作成し、アプリケーションが必要とする依存関係を定義します。

```
$ cd djangoapp
$ nano requirements.txt
```

以下の依存関係を追加します。

```
#requirements.txt

Django==1.9
gunicorn==19.6.0
```

###Dockerファイルの作成
Dockerには、Dockerファイルから命令を読み込んで自動的にイメージを構築する機能があります。Dockerファイルには、Dockerがイメージを構築するために使用するすべてのコマンドと命令が含まれています。

Dockerfileで使用される基本的なコマンドをいくつか定義してみましょう。

- FROM - 新しいビルドステージを初期化し、その後の命令のためのベースイメージを設定します。そのため、有効なDockerfileはFROM命令で始まらなければなりません。
- RUN - 指定されたコマンドを実行します。
- ADD - コンテナにファイルをコピーします。
- EXPOSE - 実行時にコンテナが指定されたネットワークポートをリッスンしていることをDockerに通知します。
- CMD - 実行中のコンテナにデフォルトを提供します。
では、Dockerfileというファイルを作成してみましょう。

`$ nano Dockerfile`

まずはDockerfileに必要なプロパティをすべて定義してみましょう。ベースイメージとメンテナ名を定義します。

```
# base image 
FROM python:2.7

# File Author / Maintainer
MAINTAINER Esther
```

次に、コンテナ内のアプリケーションフォルダをコピーし、CMDが実行されるディレクトリを定義します。

```
# Copy the application folder inside the container
ADD . /usr/src/app

# set the default directory where CMD will execute
WORKDIR /usr/src/app
```

最後にデフォルトのコマンドを設定して実行します。

`CMD exec gunicorn djangoapp.wsgi:application --bind 0.0.0.0:8000 --workers 3 `

最終的なDockerfileは以下のようになるはずです。

```
# set the base image 
FROM python:2.7

# File Author / Maintainer
MAINTAINER Esther

#add project files to the usr/src/app folder
ADD . /usr/src/app

#set directoty where CMD will execute 
WORKDIR /usr/src/app

COPY requirements.txt ./

# Get pip to download and install requirements:
RUN pip install --no-cache-dir -r requirements.txt

# Expose ports
EXPOSE 8000

# default command to execute    
CMD exec gunicorn djangoapp.wsgi:application --bind 0.0.0.0:8000 --workers 3 
```

###Dockerイメージの構築
以下のコマンドを実行して、dockerイメージを構築します。

```
$ sudo docker build -t django_application_image .

Sending build context to Docker daemon   12.8kB
Step 1/7 : FROM python:2.7
 ---> 2863c80c418c
Step 2/7 : ADD . /usr/src/app
 ---> 09b03ff8466e
Step 3/7 : WORKDIR /usr/src/app
Removing intermediate container a71a3bf6af90
 ---> 3186c92adc85
Step 4/7 : COPY requirements.txt ./
 ---> 701c0be5e039
Step 5/7 : RUN pip install --no-cache-dir -r requirements.txt
 ---> Running in ed034f98db74
Collecting Django==1.9 (from -r requirements.txt (line 1))
  Downloading Django-1.9-py2.py3-none-any.whl (6.6MB)
Collecting gunicorn==19.6.0 (from -r requirements.txt (line 2))
  Downloading gunicorn-19.6.0-py2.py3-none-any.whl (114kB)
Installing collected packages: Django, gunicorn
Successfully installed Django-1.9 gunicorn-19.6.0
Removing intermediate container ed034f98db74
 ---> 1ffd08204a07
Step 6/7 : EXPOSE 8000
 ---> Running in 987b48e1a4ef
Removing intermediate container 987b48e1a4ef
 ---> ef889d6e8fcb
Step 7/7 : CMD exec gunicorn djangoapp.wsgi:application --bind 0.0.0.0:8000 --workers 3
 ---> Running in 4d929e361d0f
Removing intermediate container 4d929e361d0f
 ---> c6baca437c64
Successfully built c6baca437c64
Successfully tagged django_application_image:latest
```

構築されたイメージは、マシンのローカルのDockerイメージレジストリにあります。イメージを確認するには、`$ sudo docker images` を実行します。

```
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
django_application_image   latest              c6baca437c64        34 minutes ago      702MB
```

#アプリを実行する

```
$ sudo docker run -p 8000:8000 -i -t django_application_image

[2018-03-25 12:29:08 +0000] [1] [INFO] Starting gunicorn 19.6.0
[2018-03-25 12:29:08 +0000] [1] [INFO] Listening at: http://0.0.0.0:8000
[2018-03-25 12:29:08 +0000] [1] [INFO] Using worker: sync
[2018-03-25 12:29:08 +0000] [8] [INFO] Booting worker with pid: 8
[2018-03-25 12:29:08 +0000] [9] [INFO] Booting worker with pid: 9
[2018-03-25 12:29:08 +0000] [10] [INFO] Booting worker with pid: 10
```

**gunicorn** がアプリにサービスを提供しているというメッセージがhttp://0.0.0.0:8000に表示されます。 サーバーの IP (ip_address:8000) に移動し、Django のウェルカムページが表示されるはずです。

実行中のコンテナを見るには

```
$ sudo docker ps -a
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                           PORTS                            NAMES
100695b41a0a        django_application_image   "/bin/sh -c 'exec gu…"   13 seconds ago      Exited (0) 4 seconds ago                                          hopeful_easley
```

###結論
Dockerを使っていると、時としていくつかの問題に直面することがあります。エラーが発生したときに最初にすべきことは、Dockerのログファイルをチェックすることです。

Dockerやその他のコンテナは、アプリケーション開発のための従来の仮想マシンの強力な代替手段です。Alibaba Cloud上でコンテナを実行する方法の詳細については、[コンテナサービスのページ](https://www.alibabacloud.com/ja/product/container-service)をご覧ください。

*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*