Docker上でAnacondaを使って入れたDjangoをHerokuで動かす

#はじめに
1.Djangoを触ってみようと思った
2.pythonのパッケージ管理は全部anacondaのcondaでやりたい
3.Dockerで環境を分けるのでcondaで仮想環境とかは用意しない
4.ローカルの開発環境も本番環境もDockerでやりたい
5.Djangoの入門におすすめらしいDjango GirlsのTutorialを動かす前提でやる
6.本番環境はDjango GirlsのTutorialに従ってHerokuに公開する

こんな感じの方針でHeroku上でDockerを動かし、そこでAnaconda経由で入れたDjangoを動かす環境の用意の仕方をまとめます。



※※※※※
普段Djangoどころかサーバーサイドのプログラムをしない素人のまとめです。
Dockerも触り始めたばかりでもっと効率良い仕組みもある気がしてます。
何かこうした方がいいとかあればぜひ教えてください。
※※※※※

#参考

・ [Django入門にはDjango Girls Tutorialがおすすめ]
(http://qiita.com/takechanman/items/d711e175b32f833c5e9c)
・ [データサイエンティストを目指す人のpython環境構築 2016](http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c)
・ [Dockerの作業済みコンテナからイメージを作って移植を楽にする](http://qiita.com/tubone/items/a3bad04abf4c700cae3d)
・ [Django Girls Tutorial](https://www.gitbook.com/book/djangogirlsjapan/workshop_tutorialjp/details)
・ [Heroku Container Registry and Runtime](https://devcenter.heroku.com/articles/container-registry-and-runtime)

#事前準備
各自のコマンドライン環境でgitとdockerとherokuは使えるようにしておいてください。

#最終的なファイル構成
djangogirls/
　　　　　├Dockerfile
　　　　　└webapp/
　　　　　　　　└＜django project＞


#環境構築方法

(※ホスト)側と(※コンテナ)側で実行します。

※※※※※
手っ取り早く試したい人は`docker pull sakiyamak/django`を取って、「[9.herokuにデプロイするためのDockerfileを用意する](http://qiita.com/sakiyamaK/items/de6344234b51545f196c#9heroku%E3%81%AB%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEdockerfile%E3%82%92%E7%94%A8%E6%84%8F%E3%81%99%E3%82%8B)」まで進んでください。
※※※※※

##1.プロジェクトのルートディレクトリを用意する

```shell-session:(ホスト側)
mkdir path/to/djangogirls
mkdir path/to/djangogirls/webapp
cd path/to/djangogirls
```

##2.webapp/をマウントしてubuntuのコンテナを立ち上げる

```shell-session:(ホスト側)
docker pull ubuntu-upstart
docker run --name django -v path/to/djangogirls/webapp:/root/webapp -i -t ubuntu-upstart:latest /bin/bash
```

##3.gitを入れる

```shell-session:(コンテナ側)
apt-get update
apt-get install git -y
```

## 4.[pyenvを入れる](http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c#%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E6%96%B9%E6%B3%95-2)

```shell-session:(コンテナ側)
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc
```

## 5.[miniconda3(またはanaconda3)を入れる](http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c#%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E6%96%B9%E6%B3%95-1)

```shell-session:(コンテナ側)
pyenv install miniconda3-latest
pyenv rehash
pyenv global miniconda3-latest
```

## 6.djangoを入れる

```shell-session:(コンテナ側)
conda install -c conda-forge django=1.10.5 -y
```

## 7.[マウントしたディレクトリにdjangoプロジェクトを作成する](https://djangogirlsjapan.gitbooks.io/workshop_tutorialjp/content/django_start_project/)

```shell-session:(コンテナ側)
cd ~/webapp
django-admin startproject mysite .
```

※これ以降はdjangogirlsに従ってdjangoの作業を進めました

## 8.[コンテナをイメージとして保存](http://qiita.com/tubone/items/a3bad04abf4c700cae3d#%E5%81%9C%E6%AD%A2%E3%81%97%E3%81%9Fdocker%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%8B%E3%82%89%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%82%92%E4%BD%9C%E3%82%8B)

```shell-session:(ホスト側)
docker commit django djangogirls:1.0.0
```

ここまででローカルの開発環境は完成です。
同様の構成をしたイメージは以下で取得できます。

```shell-session
docker pull sakiyamak/django
```


## 9.herokuにデプロイするためのDockerfileを用意する

```:(ホスト側)djangogirls/Dockerfile
FROM djangogirls:1.0.0
COPY webapp/ ~/webapp
WORKDIR ~/webapp
CMD /root/.pyenv/shims/python manage.py runserver 0.0.0.0:$PORT
```

※anacondaを入れた場合はCMDのパスを変えてください
※`docker pull sakiyamak/django`でイメージを作った人はFROMの部分を変えてください


## 10.herokuの管理画面でapp(yourappnameとする)を用意する

<img width="508" alt="スクリーンショット 2017-02-06 0.08.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/105057/f838052e-e595-bf3d-7e32-6d1db727f53d.png">

<img width="432" alt="スクリーンショット 2017-02-06 0.13.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/105057/024a7b12-376b-6527-732b-50a467e1ae75.png">



## 11.[herokuにDockerfileをデプロイする](https://devcenter.heroku.com/articles/container-registry-and-runtime)

```shell-session:(ホスト側)
heroku plugins:install heroku-container-registry
heroku container:login
heroku container:push web --app yourappname
```

これでheroku上にDockerでdjangoの環境が用意できました！


## 12.ローカル環境の確認

```shell-session:(ホスト側)
docker rm -f django
docker run --name django -v path/to/djangoglrs/webapp:/root/webapp -p 8000:8000 -it djangogirls:1.0.0
```

```shell-session:(コンテナ側)
cd ~/webapp
python manage.py runserver 0.0.0.0:8000
```
http://0.0.0.0:8000 にアクセス

## 13.Heroku環境の確認

https://yourappname.herokuapp.com/ にアクセス



#終わり
 [Django Girls Tutorial](https://www.gitbook.com/book/djangogirlsjapan/workshop_tutorialjp/details)を進めるとこんな感じのサイトがHeroku上のDocker上で動きました

<img width="852" alt="スクリーンショット 2017-02-06 0.31.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/105057/8fe7315c-9ce3-dfe2-03c2-ea5c802c4d27.png">