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)