すくすくすくらっぷ

とりあえずすくらっぷ

DockerでPythonの環境構築を行う

仕事でDockerを使う機会があったのですが、あまり馴染みがなかったので使い方を調べることにしました。 試しにPython3.xの環境構築を行ってみます。

Dockerのインストール

WindowsならDocker for WindowsMacならDocker for Macとわかりやすいですね。
ただし、Windows 10 Homeの場合だとDocker for Windows(Hyper-V)が利用できないため、 代わりにDocker Toolboxというものをインストールする必要があります。

今回はMacで行いますが、Windowsでも同様に動かせると思います。 Docker自体はすでにインストール済みだったためアップデートをして完了しましたが、
新規インストールの場合でも基本的にはインストーラに従えばOKだと思います。

Docker for Mac(Windows)はこちらからインストーラをダウンロードできます。
https://www.docker.com/products/docker-desktop

Windows 10 Homeな方はこちらから
https://github.com/docker/toolbox/release

DockerでのPython環境構築

まずはDockerを起動します。
するとこんなアイコンが出てきて、もそもそと動きます。
これが止まるとDockerの起動完了です。
Windowsであれば画面右下あたりに同じアイコンがいるはずです。 f:id:blauthree:20190712234202p:plain

ターミナルを起動し、以下のコマンドを実行してこんな結果になればOKです。

$>docker version
Client: Docker Engine - Community
 Version:           18.09.2
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        6247962
 Built:             Sun Feb 10 04:12:39 2019
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.2
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.6
  Git commit:       6247962
  Built:            Sun Feb 10 04:13:06 2019
  OS/Arch:          linux/amd64
  Experimental:     true

次にDockerのイメージを取得します。
docker search でdocker hubで共有されている作成済みイメージを検索できるようです。
検索に引っかかればそのイメージを使うことができます。

$>docker search python3
NAME                                  DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
sellpy/python3-jupyter-sklearn        python3-jupyter-sklearn                         4                                       [OK]
openwhisk/python3action               Apache OpenWhisk runtime for Python 3 Actions   4                                       
kuralabs/python3-dev                  Python 3 ready container to build Python pro…   3                                       [OK]
clutteredcode/python3-alpine-pandas   Python3 with pandas based on alpine             2                                       [OK]
sellpy/python3-jupyter-sklearn-java   python3-jupyter-sklearn-java                    2                                       [OK]
codenvy/python34                      Dockerfile:https://github.com/codenvy/docker…   1                                       
sellpy/python3-gphoto2                Python3, Gphoto2                                1                                       [OK]
tedder42/python3-scipy-cron           .                                               1                                       [OK]
brumbrum/python3                      Immagine contenente python3                     1                                       [OK]
... 以下略 ...                                                                                   

いっぱいあんなおい・・・どれ選べばいいんだよ・・・

ということでUbuntuのイメージを取得してPython3をインストールすることにしました。
LTS版であるUbuntu 18.04をインストールします。

$>docker pull ubuntu:18.04 
18.04: Pulling from library/ubuntu
5b7339215d1d: Pull complete 
14ca88e9f672: Pull complete 
a31c3b1caad4: Pull complete 
b054a26005b7: Pull complete 
Digest: sha256:9b1702dcfe32c873a770a32cfd306dd7fc1c4fd134adfb783db68defc8894b3c
Status: Downloaded newer image for ubuntu:18.04

docker imagesで取得したDockerイメージの一覧を表示できます。

$>docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              18.04               4c108a37151f        3 weeks ago         64.2MB

さっそくUbuntuを動かしてみます。以下コマンドでDockerコンテナの作成&起動が行われます。

$>docker run -it -d --name ubuntu18.04 ubuntu:18.04
aa320e5db96d9ead4c8e1a4b1194373c5353b90a90cbd86e8e4e71ad9f71b732

各オプションは以下のような感じです。

オプション 動作
-it ターミナルで操作可能に
-d バックグラウンド実行
--name コンテナに名前をつける

なんか長い文字列が出れば成功です。これはコンテナIDとなります。
docker psとすると、起動しているコンテナが表示されます。
ここで先程表示されたコンテナIDの一部が表示されているはずです。

$>docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
aa320e5db96d        ubuntu:18.04        "/bin/bash"         2 minutes ago       Up 2 minutes                            ubuntu18.04

あとはdocker execコマンドでDockerのUbuntuにログインすることができます。
ちなみにこの時点ではインストールされていないため、Python3は実行できません。

$>docker exec -it ubuntu18.04 /bin/bash
root@aa320e5db96d:/# 
root@aa320e5db96d:/# python3
bash: python3: command not found

apt-get updateしてから、Python3とpython3-pipをインストールします。
python3コマンドで実行できたらOK。

root@aa320e5db96d:/# apt-get update
Get:1 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]
Get:2 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
Get:3 http://security.ubuntu.com/ubuntu bionic-security/multiverse amd64 Packages [4172 B]
...
root@aa320e5db96d:/# apt-get install -y python3 python3-pip
...
root@aa320e5db96d:/# python3
Python 3.6.8 (default, Jan 14 2019, 11:02:34) 
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 

pip3でNumpy, Matplotlibをインストールします。
importでエラーが出なければ成功です。
exitでログアウトします。

root@aa320e5db96d:/# pip3 install numpy matplotlib
root@aa320e5db96d:/# python3
Python 3.6.8 (default, Jan 14 2019, 11:02:34) 
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> import matplotlib
>>> exit()
root@aa320e5db96d:/# exit

もとのターミナルに戻る場合は、docker stopでコンテナを停止させます。

$>docker stop ubuntu18.04
ubuntu18.04

DockerFileを作る

Pythonが実行できるところまでは確認できたので、次は別マシンでも動かせるようにします。
調べてみるとDockerFileというものを作ることで、環境構築をスムーズに行うことができるようです。手順書みたいですね。
ググった情報とMac上で動かした情報をもとにDockerfileを作ってみました。

# ベースとなるイメージ
FROM ubuntu:18.04

# RUNでコンテナ生成時に実行する
RUN apt-get update
RUN apt-get install -y python3 python3-pip
RUN pip3 install numpy matplotlib

以下コマンドでDockerfileからPython3, pi3のインストールをしてくれます。

$>docker build .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM ubuntu:18.04
 ---> 4c108a37151f
Step 2/4 : RUN apt-get update
 ---> Running in 85954746378d
Get:1 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]
Get:2 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
Get:3 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages [578 kB]
Get:4 http://archive.ubuntu.com/ubuntu 
...
197f63eae486eca2c35dcd334bab75ad524e0de1/kiwisolver-1.1.0-cp36-cp36m-manylinux1_x86_64.whl (90kB)
Requirement already satisfied: six in /usr/lib/python3/dist-packages (from cycler>=0.10->matplotlib)
Requirement already satisfied: setuptools in /usr/lib/python3/dist-packages (from kiwisolver>=1.0.1->matplotlib)
Installing collected packages: numpy, cycler, python-dateutil, pyparsing, kiwisolver, matplotlib
Successfully installed cycler-0.10.0 kiwisolver-1.1.0 matplotlib-3.1.1 numpy-1.16.4 pyparsing-2.4.0 python-dateutil-2.8.0
Removing intermediate container 4a4fcaf63749
 ---> 028e80075d12
Successfully built 028e80075d12

docker imagesを実行すると、イメージが追加されていることがわかります。
作成したイメージからコンテナの作成を行うと、Python3の環境構築が完了した状態で起動することができます。

$>docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              028e80075d12        49 seconds ago      605MB
ubuntu              18.04               4c108a37151f        3 weeks ago         64.2MB

いったんここまで。次はWindowsマシンに環境構築をしたいと思います。