docker-composeを使用したコンテナでの開発環境セットアップ(Django)

## 前回までのあらすじ
仮想マシン栽培と加工を生業としてきたコンテナ初心者、人の作ったdocker-composeファイル群を種として使用することによりCakePHP3コンテナを発芽させることに成功。かねてより開発してきたDjangoのコンテナ開発環境の野望を抱く。

[Qiita:docker-composeを使用したコンテナでの開発環境セットアップ(CakePHP3)](https://qiita.com/GCkurabe/items/d1d49e08b5666d30d3b1)

## 今回の内容
というわけで今回はDjangoでのコンテナ環境のセットアップを実施しようと思います。

これまでvagrantで作ってきた仮想マシンに必死こいてyumコマンドを打ち込んで苦しみながら環境を整えてきましたが、もしかしたらこれが終わらせてくれるかもしれない。

今回はこちらの記事を書いてくれた方のGitLabからファイル群をいただき、実際にコンテナ開発環境を作っていきたいと思います。

[Qiita:DjangoをDocker Composeでupしよう！](https://qiita.com/kyhei_0727/items/e0eb4cfa46d71258f1be)

## 前提条件
またまたですが、事前に前回の記事と同一もしくはそれに準ずる環境、すなわちdocker-composeを使用可能な環境の準備をお願いします。
私の書いてきたこの二つの記事は参考になると思います。

[Qiita: 1.VirtualBox + Vagrant + DockerによるOSに縛られないコンテナ環境セットアップ](https://qiita.com/GCkurabe/items/151c2a57688c03cfbdd8)

[Qiita: 2.docker-composeを使用したコンテナでの開発環境セットアップ(CakePHP3)](https://qiita.com/GCkurabe/items/d1d49e08b5666d30d3b1)

## 今回の使用環境

- macOS Mojave 10.14.5
- VirtualBox 6.0.4
- Vagrant 2.2.4
- CentOS Linux release 7.6.1810 (Core)
- Docker 18.09.6
- docker-compose 1.24.0

## 実施する内容
1. Dockerファイルの配置とビルド
2. djangoのファイル設定
3. docker-compose up

## 1.Dockerファイルの配置とビルド

vagrantでvirtualboxの仮想マシンを操作している場合には、仮想マシンのルートディレクトリのすぐ下にvagrantディレクトリがいます。ここにファイルを配置するとvagrantが同期してくれています。

[Qiita: Vagrantにおける共有フォルダの使い方](https://qiita.com/Noe/items/623267cd8c8634ae11af)

[WEB ARCH LABO: Vagrant入門 – Vagrant の共有フォルダ機能 (Synced Folder)](https://weblabo.oscasierra.net/vagrant-synced-folder/)

```
$ cd /vagrant
$ ls
$ Vagrantfile  docker-django-master  root  vagrant
$ cd docker-django-master
```

コンテナファイル群を仮想マシン内に配置してビルドします。

```
$ su root
# docker build -t django2.1 -f ./django/Dockerfile.base ./django
```

ちなみにsu rootして作業しているのはdocker-composeを使う際には通常のユーザーだとエラーを返されてしまうためです。

```
ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running?

If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.
```

調べてみると権限まわりの問題で、解消方法は存在しているようです。

[Amazon Linux に Docker Compose を install する方法](https://qiita.com/rysk92/items/e10f898abdc701e09e38)

[Dockerコマンドをsudoなしで実行する方法](https://qiita.com/DQNEO/items/da5df074c48b012152ee)

話を戻し、dockerイメージを確認すると、以前CakePHP3を組んだ時のものなどいろんなものが出来上がっていることが確認できます。

```
# docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
django2.1                         latest              5dce395b8440        41 seconds ago      967MB
docker-cakephp3-template_host     latest              58a46e68225e        6 days ago          463MB
docker-cakephp3-template_phpfpm   latest              d0528836baf4        6 days ago          114MB
docker-cakephp3-template_mysql    latest              6a4af0ff5225        6 days ago          373MB
php                               7-fpm-alpine        3a7affb05baa        9 days ago          79.3MB
python                            3.7                 34a518642c76        11 days ago         929MB
mysql                             5.7                 a1aa4f76fab9        11 days ago         373MB
nginx                             mainline-alpine     bfba26ca350c        2 weeks ago         20.5MB
hello-world                       latest              fce289e99eb9        5 months ago        1.84kB
php                               7.0-apache          aa67a9c9814f        5 months ago        368MB

```

次に作成したイメージを使ったコンテナからプロジェクトファイルを作成します。まずcdしてからコマンドを起動します。

```
# cd django
# docker run --rm \
--mount type=bind,src=$(pwd),dst=/opt/apps \
django2.1 \
django-admin startproject my_docker_project .
```

すると本当にプロジェクトファイルが作成されています。たまげた......こんなに楽ならしばらく苦労しないぞ......

## 2.djangoのファイル設定
プロジェクトフォルダが作成されたとはいえど、これらはあくまでひな形なのでコンテナ用に合わせないといけません。そこでまずsetting.pyを編集していきます。

```
#〜中略〜
ALLOWED_HOSTS = ['192.168.33.10']
#〜中略〜
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'postgres',  #作成時のデフォルト
        'USER': 'postgres',  #作成時のデフォルト
        'PASSWORD' : 'hogemojahogemoja', #作成時にdocker-compose.ymlで設定
        'HOST' : 'postgres', #コンテナのサーバ名
        'PORT' : 5432,
    }
}
#〜中略〜
STATIC_URL = '/static/'
STATIC_ROOT = '/opt/static' #ボリュームマウント先のパス
#〜中略〜
```

## 3.docker-compose up
コンテナを起動します。

```
# docker-compose up --build
```

やりました。これで開発環境が整ったようです。

任意のURLにアクセスしてみます。
local環境で構築されている方はlocalhostなどでしょうが、私のようにvagrant×virtualBoxでdocker用VMを立てている人はこんな感じのURLになると思います。

```
http://192.168.33.10
```

<img width="1322" alt="スクリーンショット 2019-06-22 18.28.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431414/23203c9f-a904-ed67-2b6f-5c55165a9060.png">


機能を終了させるときはターミナルでCtrl-Cで終了します。

## おわりに
今回はふだん家で使うDjangoのセットアップを、仮想マシンのセットアップ以上に簡単に完了しました。これで本格的にアプリケーション開発をコンテナに移行できそうです。あとはk8sレベルにまでたどり着けばそのままアプリをデプロイというのも夢ではなさげです。

それとWebアプリケーションだけでなく機械学習の環境なんかもすぐ整えられたので、また記事にしていきます。ついにプログラミングの伴う機械学習ができる......