【mac】Docker初心者が最短で「Django」 の開発環境作ってみた

f:id:nomunomu0504:20200128014626p:plain:w0

開発環境は持ち歩く時代

流石に物理的には持ち歩けませんが笑、今回は開発環境をポータブル化するべく「docker」を使って環境を作っていきたいと思います。docker初めて使う民なので、下調べ多めで行きます。

dockerで作成したい開発環境群はこちら。最低限これが作れて動けば問題なさそう。

・python3.5.x + pip3(主にDjango)

・ruby2.5.1 + Rails 5.x

・php 7.x

docker

dockerに関しての記事は、こちらの記事がとても参考になりました。ここまでまとまってるのすごい。 qiita.com

インストールに関しては、こちらの記事が参考になりました。 qiita.com

先にdockerとgithubを連携させておく

どうもdockerは「dockerfile」というファイルに書かれている情報を元に環境を構築していくようです。前回書いた「Brewfile」とかと同じ原理っぽそう。そのdockerfileをgithubで管理して、リポジトリにpushしたら、自動的にdocker-imageを作ってくれるように連携ができるらしい。 dockerfile更新したら、毎回手動で作り直す手間が面倒なので、先に設定しておきます。

参考になった記事はこちらです qiita.com

この設定(Automated build ってやつ)をしておけば、masterブランチが更新されたら自動的に最新のイメージが生成されるみたいでした。

dockerを管理するディレクトリ

今後、dockerで開発することを考えると様々な環境を作ることになりそうなので、dockerfileに関しては以下のようなディレクトリを構成してgit管理することにしました。

dockers/
├── python3.x(git管理)
  ├── Dockerfile
  ├── requirements.txt
  └── src    # ソース用のディレクトリ
    ├── source_dir_001
    └── source_dir_002
|
└── Rails 5.x(git管理)
  ├── Dockerfile
  ├── Gemfile
  └── src    # ソース用のディレクトリ

python3.x系のdocker-imageを作る

pythonのDocker-imageは公式の物がDocker-Hubにあるみたいですが、今回は勉強も兼ねてubuntu上に環境を構築していくことにします。

mkdir dockers ; cd dockers
mkdir python3.x ; cd python3.x ; git init

# ここで、さっき作成したdocker管理のリポジトリを紐づけておいてください

touch Dockerfile

そして、作成したDockerfileに以下を記述します。以下のDockerfileの内容を元にimageが生成されます。なので、ここに色々追記していくことで、カスタムimageを生成することができます。

FROM ubuntu:18.04
RUN apt-get -y update \
    && apt-get -y upgrade \
    && apt-get install -y locales curl python3-distutils python3-dev gcc make \
    && curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py \
    && python3 get-pip.py \
    && pip install -U pip \
    && mkdir /code \
    && rm -rf /var/lib/apt/lists/* \
    && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
ENV LANG en_US.utf8
WORKDIR /app
ADD requirements.txt /app
RUN pip install -r requirements.txt    # requirements.txtからパッケージのインストール

そしてDockerfileと同じ場所にrequirements.txtを作成します。必要なパッケージを書き込んだら、masterブランチにコミット/プッシュします。すると、自動的にDockerfile, requirements.txtを読み込みdocker-imageの生成が始まります。

image作成中のlogなどは、DockerHubから確認することができます。(これは失敗している例です) f:id:nomunomu0504:20200127132039p:plain

エラーを確認したければ、エラーがでてるbuildをクリックすると詳細がみれます。 f:id:nomunomu0504:20200127132339p:plain

実際にmac上で正常にdocker-buildができるかどうかを確認する場合には以下のコマンドを実行します。<DOCKER_IMAGE_NAME>には、自分でdocker-imageにつける名前を入力します。DockerHubで管理している場合には、DockerHubで作成したアカウント名/イメージ名にしておかないとpushすることができないので注意!!

docker build -t <DOCKER_IMAGE_NAME> .

色々処理が流れますが、最終的にSuccessfully tagged <DOCKER_IMAGE_NAME>:latestの表示が出ていれば成功しています。docker imagesコマンドを実行してimageが表示されていれば成功です。 f:id:nomunomu0504:20200127140157p:plain

docker-imageからコンテナを作る

さて、開発環境のベースが出来上がったわけですが、これをもとにプロジェクトの元になるコンテナを作っていきたいと思います。このコンテナを複数作れるところがいいところなんだと思います。同じような環境のプロジェクトがコマンド1つで作れるわけですから...。

cd dockers/python3.x
docker run --name python3x -p 8000:8000 -v $(pwd):/app -d -it nomunomu0504/docker-for-webscrap

このコマンドを実行することで、コンテナを作成できます。どのようなコンテナを作成しているかは以下の通りです。

docker run ; docker-imageからコンテナを生成し実行する
--name python3x ; コンテナの名前を"python3x"にする
-p 8000:8000 ; コンテナの8000番ポートをローカルマシンの8000番ポートにポートフォワードする
-v $(pwd):/app ; ローカルマシンのカレントディレクトリをコンテナの /app にバインドする
-d ; コンテナをバックグラウンドで実行する
-it nomunomu0504/docker-for-webscrap ; コンテナを生成する際に参照するdocker-imageを指定する

dockerプロセスが正常に動作していれば、開発環境構築は終了です。

docker ps
CONTAINER ID        IMAGE                              COMMAND             CREATED             STATUS              PORTS                    NAMES
4d3ca6aff93c        nomunomu0504/docker-for-webscrap   "/bin/bash"         5 minutes ago       Up 5 minutes        0.0.0.0:8000->8000/tcp   python3x

あとはコンテナ内に入って操作したりします。

docker exec -it python3x /bin/bash

を実行することで、コンテナ内のbashを操作することが可能。以下のようなディレクトリ構造になっていれば問題なし。

root@4d3ca6aff93c:/app# ls -la
total 12
drwxr-xr-x  5 root root  160 Jan 27 14:36 .
drwxr-xr-x  1 root root 4096 Jan 27 15:51 ..
-rw-r--r--  1 root root 6148 Jan 27 14:02 .DS_Store
drwxr-xr-x 32 root root 1024 Jan 27 13:37 source_dir_001
drwxr-xr-x 19 root root  608 Jan 27 03:52 source_dir_002

あとは通常通り、コンテナ内のdjangoでrunserverを 0.0.0.0:8000 に向けて起動すれば、ローカルマシンで localhost:8000 で通信することができる。

root@4d3ca6aff93c:/app# cd source_dir_001
root@4d3ca6aff93c:/app/source_dir_001# python3 manage.py runserver 0.0.0.0:8000 &
[1] 32
root@4d3ca6aff93c:/app/source_dir_001# Performing system checks...

System check identified no issues (0 silenced).
January 27, 2020 - 16:01:59
Django version 1.11.27, using settings 'source_dir_001.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
^M
root@4d3ca6aff93c:/app/source_dir_001#

コンテナ自体はバックグラウンドで起動しているため、コンソールを抜けてもサーバーが落ちることはない。

root@4d3ca6aff93c:/app/source_dir_001# exit

とりあえずこれで、dockerでDjangoの開発環境は構築できたので、めでたしめでたし。 f:id:nomunomu0504:20200128014348p:plain