Python with Docker : Pythonもくもく会　@2018/10/16


こんにちは、みなふです。
初投稿です。よろしく。

東北大学の１年、文系プログラマです。
全脳アーキテクチャ東北支部という、人工知能のサークルの東北支部に所属しています。

#概要
Docker内でPython環境を構築し、動作の検証をする。

2018/10/16追記

#動機

現在、筆者はITサービス開発のワークショップにチームで参加しています。
僕たちのチームではDockerを使って開発環境を整備しようと考えているので、その環境の整備を試験的にやってみようかと。

#環境
Oracle VM VirtualBox(on Windows10) -> 5.2.18
Ubuntu(on VirtualBox) -> 18.04.1 LTS
Docker CE(on Ubuntu) -> 18.06.1-ce

#いざ実装！

しかし、ここでコンテナとイメージの違いを理解できていないことに気づく…

そんな僕にピッタリのスライドを公開してくれている方がいらっしゃった。
https://www.slideshare.net/zembutsu/docker-images-containers-and-lifecycle

なるほど！
めっちゃわかりやすい記事ですね！

###軽く要約
1. イメージは、コンテナイメージとも呼ばれるが、コンテナとは異なる。
2. イメージは、イメージレイヤーがたくさん重なったもののこと。編集不可。
3. イメージレイヤーは、かんたんに言って差分情報のこと。実ファイルもイメージレイヤーに含まれている。イメージレイヤー=差分+実ファイル
4. コンテナは、イメージに「編集中のイメージレイヤー」を重ねたもの。コンテナを実行することで、イメージに含まれる実ファイルを利用できる。コンテナ=作業中イメージレイヤー+イメージ
5. 編集中のイメージレイヤーをもとのイメージに加えることで、新しいイメージを生成することができる。このとき、新しいイメージ=もとのイメージに含まれていたイメージレイヤーの集合+新しいイメージレイヤー（編集の差分情報）。


というわけで、コンテナとイメージの違いもわかったことだし、実装していきましょう！

まずはpython3.6の公式dockerイメージを拾ってきます。

```terminal
root@mino-VirtualBox:~# docker pull python:3.6
3.6: Pulling from library/python
05d1a5232b46: Pull complete 
5cee356eda6b: Pull complete 
89d3385f0fd3: Pull complete 
80ae6b477848: Pull complete 
28bdf9e584cc: Pull complete 
dec1a1f0462b: Pull complete 
a4670d125615: Pull complete 
547b45a875f5: Pull complete 
ee15e3195a8d: Pull complete 
Digest: sha256:54b8aeb1516d7c180d92b47f9f89641926be05a0469b1376195d6bb4eba383f4
Status: Downloaded newer image for python:3.6

```

そしたら、もってきたdockerイメージを実行して・・・


```terminal
root@mino-VirtualBox:~# docker run -it python:3.6
Python 3.6.6 (default, Sep  5 2018, 03:40:52) 
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print("hello world!!")
hello world!!
```

やった！
案外にもさっくり行きましたね。

しかし、これではモジュールが何もインストールされていません。
というわけでモジュールをインストールしていきましょう！

##モジュールインストール
さて、pipは入ってるかな？

```terminal
root@mino-VirtualBox:~# pip --version

Command 'pip' not found, but can be installed with:

apt install python-pip
```
あらら、ではまずpipをインストールしましょう。

```terminal
root@mino-VirtualBox:~# apt install python-pip
E: dpkg は中断されました。問題を修正するには 'sudo dpkg --configure -a' を手動で実行する必要があります。
```

また怒られた。言われるまま実行。

```terminal
root@mino-VirtualBox:~# dpkg --configure -a
cpp (4:7.3.0-3ubuntu2.1) を設定しています ...
python3.6 (3.6.6-1~18.04) を設定しています ...
xbrlapi (5.5-4ubuntu2.0.1) を設定しています ...
libecal-1.2-19:amd64 (3.28.5-0ubuntu0.18.04.1) を設定しています ...

〜（中略）〜

update-manager (1:18.04.11.5) を設定しています ...
libc-bin (2.27-3ubuntu1) のトリガを処理しています ...
initramfs-tools (0.130ubuntu3.5) のトリガを処理しています ...
update-initramfs: Generating /boot/initrd.img-4.15.0-36-generic

```
数十行がずらずらーっと。おわぁ…

で、pipをインストール。

```terminal
root@mino-VirtualBox:~# apt install python-pip
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  build-essential dpkg-dev fakeroot g++ g++-7 gcc gcc-7 libalgorithm-diff-perl

〜（略）〜
```
また数十行ずらずらー。
これでやっとpipが使えます。

```terminal
root@mino-VirtualBox:~# pip --version
pip 9.0.1 from /usr/lib/python2.7/dist-packages (python 2.7)
```
おっと2.7...

```terminal
root@mino-VirtualBox:~# pip3 --version

Command 'pip3' not found, but can be installed with:

apt install python3-pip
```
どうやら、pip3とpipを間違えて入れてしまったようですね。
インストール略。

```terminal
root@mino-VirtualBox:~# pip3 --version
pip 9.0.1 from /usr/lib/python3/dist-packages (python 3.6)
```
やれやれ。
で、色々インストール。チームメンバーの過去のコードを見て採用されてるやつはとりあえずインストールしておく。
##インストールしたモジュール
1. numpy
2. pandas
3. matplotlib
4. scipy
4. google cloud
5. mecab
6. pyaudio
7. scikit-learn

チームがデータ解析系のことをやろうとしているので、自然とそっち系のモジュールが多くなりますね。
じゃあ、この状態のコンテナをイメージにして保存しておきましょう！

…というところで時間が来てしまったので、今日はここまで。

#次回
コンテナイメージの作成とプッシュ
DockerHubの調査

次回のもくもく会は10/18(木)です！




#参考サイト
DockerでPython3.6の環境構築！matplotlibインストールで詰まった話とかも
https://qiita.com/reflet/items/4b3f91661a54ec70a7dc

形態素解析のライブラリ「Mecab」と「Janome」を使ってみよう
http://ushinji.hatenablog.com/entry/2017/11/23/161031

scikit.learn を pip でインストールする
https://qiita.com/mzmttks/items/ee0e53e9b98573a0bd40

pyaudioのインストールで詰んだ時の対処法
https://qiita.com/musaprg/items/34c4c1e0e9eb8e8cc5a1

#2018/10/16追記
コンテナ名はなんだったかな…？　と思い、実行中のコンテナを表示してみる。

```terminal
root@mino-VirtualBox:~# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

```
アッ…

というわけで、runコマンドとattachコマンドを混同していた俺は今回、DockerではなくUbuntu上にせっせと環境構築していたのでした。

Ω＼ζ°)ﾁｰﾝ

~~これ完全にタイトル詐欺~~