Dockerの基本的な使い方とDockerでDjangoの環境構築

  • このエントリーをはてなブックマークに追加

Dockerとは

MacOS上でUbuntuやCentOSなどを起動できる仮想環境のひとつ。似たものにVirtualboxがあるけど、Dockerはコンテナ型にすることで軽量かつ高速に起動する。

Dockerにすることで ・軽量かつ高速な仮想環境を構築できる ・仮想環境をコード化できるので、他の人も同じ環境をすぐに作れる ・仮想環境を簡単に削除&再生できる

そもそもDockerを使っていないということは一大トレンドから取り残されてしまっているということ。

上記の作業が出来ない方はトレンドから相当遅れてしまっていると考えた方が良いと思われます。 サービスのコンテナ化というのはここ数年のWeb業界の一大トレンドというか完全に一般化してきていますので、もしこの記事を読んでおられる皆さんの会社がまだ本番環境でDockerを運用していないのであれば、多分その会社は早めに辞めたほうが良いと思います。(そのくらい重要な技術になってきています)

「dockerわからない」って人も今から説明することを理解すれば問題ないはず。

Dockerにまつわる用語説明

基本用語
・dockerイメージ
・dockerコンテナ
・docker Register
・dockerfile
・docker-compose

docker イメージ

CentOSやubuntuなどのOSやLinux+Python3などのアプリケーションのテンプレート。基となるdockerイメージをダウンロードして、いろいろ加工していく。いわゆる骨組みみたいなもん。

docker コンテナ

dockerイメージを起動すると生まれる仮想環境のこと。1つのdockerイメージから複数のコンテナを作ることもできる。コマンド一つで立ち上がり、コマンド一つで消せる。

docker Register

基となるdockerイメージが保存されている場所。DockerHubなどが有名。CentOSやubuntuなどのOSはもちろんのこと、Djangoやtensorflowなども公式の作成元が公開してくれている。もちろん自分で作ったimageも保存できる。

DockerHubは1つのimageだけ非公開できるが、あとは公開しないといけない仕様

dockerfile

dockerイメージに自ら追加で付け加えたいライブラリや機能を追加してかけるファイル。例えばCentOSを取得してvimをインストールしたい場合は、docker RegisterからCentOSのdockerイメージを取得して、yumでvimをインストールするコマンドを記載すればCentOS+vimをインストールしたimageを自ら作ることができる

詳しい使い方は後述するので、やってみればわかると思います。

docker-compose

dockerコンテナを複数連動させて立ち上げることができるファイルです。例えば、CentOSにNginxをインストールしたImage+Python3をインストールしたイメージ+MySQL5.7をインストールしたImageを連動して起動させることができる。コンテナを分けることで、MySQL8.0バージョンアップするのも簡単に設定し直しができる。

DockerをMacにインストールする

Docker for Mac をインストールする。 下記URLにアクセスして、「Download from Docker Store」→「Get Docker」

ターミナルでこんなのが出てきたらOK

$ docker --version
Docker version 18.06.1-ce, build e68fc7a

Dockerを色々試してみる

イメージ、コンテナを使う

DockerHubでインストールしたいimageを探す。

docker pull ${images}:${tag} でimageをインストールできる。タグは指定しなければ最新版がインストールされる。

試しにCentOSをダウンロードしてみる。

$ docker pull centos:7.2.1511
7.2.1511: Pulling from library/centos
f2d1d709a1da: Pull complete
Digest: sha256:363db1e9de38f400fad23188559a18217cbbae70edbc103b12bd26fd6de5c7ec
Status: Downloaded newer image for centos:7.2.1511

$ docker run centos   #コンテナ(仮想環境)を構築
$ docker ps -a #コンテナすべて確認(-aをなくせば起動のみのコンテナを確認)
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS                      PORTS               NAMES
0d9bcdfdf95a        centos                "/bin/bash"         4 seconds ago       Exited (0) 3 seconds ago                        agitated_kapitsa

$ docker rm 0d9bcdfdf95a #不要なコンテナの削除

名前は --name ${name} で指定できる。指定しなければ勝手に名前が作られる。 また、imageをpullせずにいきなりrunをしても、imageがローカルになければ勝手にDockerHubから取ってきてくれる。

$ docker run -it centos #コンテナ(仮想環境)を構築して仮想環境にログインできる。(iでログインできて、ttyをONにできるのでコンテナを停止しても再ログインできる)
[root@e60ebf87736d /]$ vim index.txt #vimが入っていないのでエラー
bash: vim: command not found
[root@e60ebf87736d /]$ yum install -y vim #vimをインストール
[root@e60ebf87736d /]$ vim index.txt #今度はvimが使える
[root@e60ebf87736d /]$ exit #終了
exit

$ docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS                         PORTS               NAMES
e60ebf87736d        centos                "/bin/bash"         6 minutes ago       Exited (0) 3 minutes ago                           adoring_poincare
$ docker start e60ebf87736d #コンテナが停止しているので起動
$ docker exec -it e60ebf87736d /bin/bash #コンテナにbashでログインする
[root@e60ebf87736d /]
[root@e60ebf87736d /] exit
exit
$ docker rm -f e60ebf87736d #-fをつけることで起動中でも強制的に消せる

dockerfileを使う

CentOSにもともとvimをインストールしておくimageをdockerfileでつくる。

$ cd ~/Desktop/ #場所はどこでもいい
$ vim Dockerfile

下記を記載

FROM centos:7.2.1511
RUN yum install -y vim

$ docker build -t mita/centos . #tはタグ名をつけるってこと。タグ名は${作った人}/${名前}:$(タグ)でつけるのがセオリー。DockerHubにpushするときに役立つ。
$ docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
{Username}/centos           latest              2b9ff6ce8760        13 seconds ago      339MB
$ docker history mita/centos #各コマンドの容量を確認できる
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
2b9ff6ce8760        2 minutes ago       /bin/sh -c yum install -y vim                   144MB
ddc0fb7d7a72        7 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>           7 weeks ago         /bin/sh -c #(nop)  LABEL license=GPLv2          0B
<missing>           7 weeks ago         /bin/sh -c #(nop)  LABEL vendor=CentOS          0B
<missing>           7 weeks ago         /bin/sh -c #(nop)  LABEL name=CentOS Base Im…   0B
<missing>           7 weeks ago         /bin/sh -c #(nop) ADD file:b3bdbca0669a03490…   195MB
<missing>           7 weeks ago         /bin/sh -c #(nop)  MAINTAINER The CentOS Pro…   0B
$ docker run -it {Username}/centos /bin/bash
[root@c0825a09f4a1 /]# vim index.txt #最初からつかえるようになってる

次はPython3をインストールして、ローカルと仮想環境をマウントしてみましょう。 先程のDockerfileを書き換えます。

# vim Dockerfile
下記に上書き

FROM centos:7.2.1511

RUN yum -y update
RUN yum install -y https://centos7.iuscommunity.org/ius-release.rpm
RUN yum install -y vim python36u python36u-libs python36u-devel python36u-pip
RUN yum clean all
RUN ln -s /usr/bin/python3.6 /usr/bin/python3 &&\
         unlink /usr/bin/python &&\
         ln -s /usr/bin/python3 /usr/bin/python && \
         ln -s /usr/bin/pip3.6 /bin/pip && \
         pip install --upgrade pip
RUN localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG="ja_JP.UTF-8" \
LANGUAGE="ja_JP:ja" \
LC_ALL="ja_JP.UTF-8"
WORKDIR /var/www/html

$ mkdir ~/Desktop/code/
$ vim ~/Desktop/code/index.py

print('hello world!')
print('こんにちは')

$ docker run -it -v ~/Desktop/code/:/var/www/html mita/centos /bin/bash
[root@726d99b546bf html]# ls
index.py
[root@726d99b546bf html]# python index.py
hello world!
こんにちは

DockerHubを活用してみる

アカウントがない方は作りましょう。

「Create Repository」 で「python」をつくっておきましょう。非公開でもOKです。

$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username:
Password:
Login Succeeded

$ docker commit 943210d70fdc ${Username}/python
$ docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
{Username}/python        latest              7aec65292ab4        29 seconds ago      828MB
$ docker push {Username}/python

$ docker pull {Username}/python #どの環境でも利用できるようになる。gitみたいにpushしていけばいい

$ docker push ${Username}/python #docker login認証が通っていないとエラーになる
denied: requested access to the resource is denied

これで他のパソコンの環境でもdockerが入っていれば、どこでも利用できるようになります。仮想環境のgit版ですね。 一番最初のpullには時間がかかりますが、更新した環境がそこまで変化なければ、2度目移行はすぐです。 また、githubと連動することで自動ビルドすることもできるみたいです。

docker-composeを活用してみる

AlpineにNginxインストール+PHP+MySQLで各imageを作り、docker-composeで連動させて起動する。

これを基に解説するので、git cloneしてください。

■ docker-compose.yml
・versionは2と3があるが3のほうが増えたオプションとかあるらしいから、3をつかいましょう
・servicesの配下にコンテナを作ります。コンテナの作り方はwebのようにnginx:1.13.5-alpineのimageだけを取る方法とappのようにdockerfileを使ってbuildする方法があります。
・alpineはdocker用のめっちゃ軽いOSです。ubuntuやCentOSなどの1/20くらいの容量になる
・容量が軽いと起動が早いし、ダウンロードやアップロードが早いし、いいことづくし。生産性あがる。

$ docker-compose build
$ docker-compose up -d

http://localhost/ にアクセスすると犬が出てきます。phpのverは7.1ですね。

次に「app」フォルダをコピーして、「php5.6」に名前を変えます。 そして、Dockerfileを下記に書き換えます。

FROM php:5.6.38-fpm-alpine
RUN docker-php-ext-install pdo_mysql mysqli mbstring

docker-compose.ymlも書き換えます。

  app:
    build: ./app
↓
  app:
    build: ./php5.6

もう一度build&upします。

$ docker-compose build
$ docker-compose up -d

http://localhost/ にアクセスすると犬が出てきます。phpのverは5.6ですね。切り替えは簡単ですね。

もうちょっと遊んで見る

kerasの環境構築めんどい。。ってことでkerasとかtensorflowとか入ってるし、この環境使えばええんじゃね。最初のimageのダウンロードは重いけど。

$ docker run --rm -it kaggle/python
$ docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
kaggle/python                latest              92e9bd37d14a        9 days ago          25.4GB

25.4GB...。使うかどうかはおまかせします。

オリジナルのサーバー環境を作ってみる。 Dockerfileに下記を記載。

FROM ubuntu:16.04

RUN apt-get update -y && \
    apt-get install -y vim python3-pip python3-dev locales && \
    cd /usr/local/bin && \
    ln -s /usr/bin/python3 python && \
    pip3 install --upgrade pip
RUN export LC_ALL=ja_JP.UTF-8

RUN rm -rf /usr/bin/python && \
    ln -s /usr/bin/python3.6 /usr/bin/python && \
    ln -s /usr/bin/pip3.6 /bin/pip

RUN pip install --upgrade pip

WORKDIR /usr/src/
COPY ./requirements.txt /usr/src/requirements.txt
RUN pip install -r requirements.txt

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

同カテゴリに欲しいライブラリをrequirements.txtに記載する。

pandas
scipy
scikit-learn
BigQuery-Python
google-api-python-client
google-auth
google-auth-httplib2
google-auth-oauthlib
googleads
gspread
gspread-dataframe
jupyter
jupyter-client
jupyter-console
jupyter-core
keyring
mysql-connector-python
oauth2client
oauthlib
PyDrive
slackbot
times

djangoで遊んで見る。

まずはdjangoの開発環境の用意から。 ■ ファイル構成

code
L docker-compose.yml
L html
L storage
L web
 L django.conf
 L Dockerfile
 L requirements.txt

■ docker-compose.yml

version: '3'
services:
  web:
    build: ./web
    restart: always
    volumes:
      - ./html/:/var/www/html/
    links:
      - mysql
    expose:
      - "8000"
    ports:
      - "8000:8000"
    privileged: true

  mysql:
    image: mysql:8.0
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_USER: test
      MYSQL_PASSWORD: test_pass
      MYSQL_DATABASE: django
    volumes:
      - ./storage:/var/lib/mysql

■ django.conf

Listen 8000

# mod_wsgi-express module-config でパスを確認
LoadModule wsgi_module /usr/lib64/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so

WSGIDaemonProcess myapp python-home=/usr python-path=/var/www/html/myapp
WSGIProcessGroup myapp
WSGIScriptAlias / /var/www/html/myapp/myapp/wsgi.py

<Directory var/www/html/myapp/myapp>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

■ Dockerfile

FROM centos:centos7

RUN yum -y update && \
    yum install -y https://centos7.iuscommunity.org/ius-release.rpm && \
    yum install -y vim python36u python36u-libs python36u-devel python36u-pip httpd httpd-devel gcc nodejs && \
    yum clean all && \
    rm -rf /usr/bin/python && \
    ln -s /usr/bin/python3.6 /usr/bin/python && \
    ln -s /usr/bin/pip3.6 /bin/pip && \
    pip install --upgrade pip

COPY ./requirements.txt /var/www/html/requirements.txt
COPY ./django.conf /etc/httpd/conf.d/django.conf
WORKDIR /var/www/html
RUN pip install -r requirements.txt
RUN django-admin.py startproject myapp

ENTRYPOINT ["/usr/sbin/httpd", "-D", "FOREGROUND"]

本記事では使っていないが、vue.jsを利用するため、nodejsもインストールする

■ requirements.txt

Django==2.1.1
PyMySQL==0.9.2
mod-wsgi==4.6.4

ここまでできたら実行

$ docker-compose build
$ docker-compose up -d
$ docker exec -it web /bin/bash
[root@057ef3d4dd05 html]# django-admin.py startproject myapp

http://localhost:8000 にアクセスするとロケットが出てきます。

djangoをrest frame(ようはAPI化)にしてvue.jsと連動させることでできる。 この記事のとおり、やれば楽しめるんで、ぜひやってみてください。 Python Django チュートリアル SPA編(1)

  • このエントリーをはてなブックマークに追加