読者です 読者をやめる 読者になる 読者になる

「VirtualBox + Ubuntu 16.04 LTS + DockerでPython3の開発環境構築」の雑録

得られた重要な知見

・DockerでPython3の開発環境を構築することができた

・Dockerfile:myDockerfile/my_python_dev_env at master · hyperSuperHoge/myDockerfile · GitHub

・ただし、わざわざDockerまで導入する必要はなく、Miniconda3がすべて解決してくれる

・でも、Dockerを使えるようになったのは収穫だ

 

背景
    ディープラーニング学習
    Pythonの開発環境が欲しくなった
    2.x系と3.x系とで結構違うらしい 環境変数やパッケージ管理も要注意
        http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c
    手元にはWindows10 & Cygwin のマシン
    現環境を汚したくない
    VirtualBox + Ubuntu 16.04 LTS + Docker で行く
目的
    Python3の開発環境を用意する
        Python3のコード作成・実行・対話
        環境を汚さずに、使い捨てできる形
方法
    VirtualBox
    Ubuntu
    Docker
実行
    VirtualBox
        ok
    Ubuntu
        iso
        VirtualBoxで64bit OSをインストールするには、BIOS設定画面にてCPUの仮想化機能を有効にする必要があった
        sshサーバ インストール
        ポートフォワーディング
        アップデート
        ok
        エラー対処
            エラー
                hoge@hoge-VirtualBox:~$ apt-get update
                W: chmod 0700 of directory /var/lib/apt/lists/partial failed - SetupAPTPartialDirectory (1: 許可されていない操作です)
                E: ロックファイル /var/lib/apt/lists/lock をオープンできません - open (13: 許可がありません)
                E: ディレクトリ /var/lib/apt/lists/ をロックできません
                E: ロックファイル /var/lib/dpkg/lock をオープンできません - open (13: 許可がありません)
                E: 管理用ディレクトリ (/var/lib/dpkg/) をロックできません。root 権限で実行していますか?
            参考
                http://qiita.com/koara-local/items/e63b7e4ff3cea803bdea
            対処
                ロックファイル削除とか
                うんちゃら--configureとか
                install -fとか
            なんとかなった
    Docker
        インストール
            https://docs.docker.com/engine/installation/linux/ubuntu/
            sudo apt-get install -y --no-install-recommends \
                    apt-transport-https \
                    ca-certificates \
                    curl \
                    software-properties-common
            curl -fsSL https://apt.dockerproject.org/gpg | sudo apt-key add -
            apt-key fingerprint 58118E89F3A912897C070ADBF76221572C52609D
            sudo add-apt-repository \
                 "deb https://apt.dockerproject.org/repo/ \
                 ubuntu-$(lsb_release -cs) \
                 main"
            sudo apt-get update
            sudo apt-get -y install docker-engine
            sudo docker run hello-world
        使い方学習
            docker ps -a
            docker ps
            docker run hello-world
            docker images
            vim Dockerfile
                FROM docker/whalesay:latest
                RUN apt-get -y update && apt-get install -y fortunes
                CMD /usr/games/fortune -a | cowsay
            docker build -t docker-whale .
                各行が各レイヤーに対応
                各レイヤーにID
                公式での出力例にも出てるから、debconf: unable to~は問題ないようだ
            docker images
            docker run docker-whale
            Dockerfileがテンプレート、Imageがインスタンス
        使い方学習2
            http://www.mwsoft.jp/programming/numpy/docker.html
            https://docs.docker.com/engine/reference/run/
            ttyでインタラクティブにImage上で活動するには
                docker run -i -t ubuntu /bin/bash
            ただし、通常は"/bin/bash"に相当するものがDockerfileでデフォルトとして指定される
            Image(インスタンス)でアーダコーダした結果は、その後も残るの?
                普通にログアウトして、またrunしたら、まっさらになってた
                docker ps -a でたどれるっぽい
                デタッチしてからdocker commitとかで記録するっぽい
                http://aics-app.sakura.ne.jp/blog/2015/01/06/docker-%E3%81%A7-%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AE%E4%BF%9D%E5%AD%98commit/
    VirtualBoxの仮想HDDの空き容量が足りない。増やす
        http://qiita.com/ryo716/items/3b2298f9016a8a002ecd
        https://www.virtualbox.org/manual/ch08.html#vboxmanage-modifyvdi
        32GBに増やそう
        VirtualBox側の仮想HDDの容量を大きくする
            "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" modifymedium "G:\VirtualBox VMs\Ubuntu 16.04 LTS 日本語 Remix\Ubuntu 16.04 LTS 日本語 Remix.vdi" --resize 32768
                うまくいかない
                from 0.0MB
                マルチバイトのせい?
            "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" modifymedium "G:\VirtualBox VMs\Ubuntu 16.04 LTS Japanese Remix\Ubuntu 16.04 LTS Japanese Remix.vdi" --resize 32768
                だめでした
            バグの気配
                https://forums.virtualbox.org/viewtopic.php?f=6&t=81512
                http://blog.goo.ne.jp/ashm314/e/72bde878a8d56d0fc60ab49dcf7f0914
            SSD チェック OK チェック外し OK
            ./VBoxManage.exe modifymedium 'G:\VirtualBox VMs\Ubuntu 16.04 LTS 日本語 Remix\Ubuntu 16.04 LTS 日本語 Remix.vdi' --resize 32768
                だめでした
            バグだな
                https://www.virtualbox.org/ticket/16311
                https://www.virtualbox.org/changeset/65477/vbox
            仮想マシンを実行したりと、ぐちゃぐちゃ繰り返しresizeを試行してたらうまくいった
                0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
                #上記チェンジセットを見ると、状態の更新がされてなかったぽい
                ぐちゃぐちゃ繰り返して状態が更新されたからうまくいった?
                いや、今使っているのは、上記チェンジセットの反映済みかも
                わからn
            ok
        パーティション変更
            gpartedをインストールするスペースもない
                sudo apt-get clean
            sudo apt-get install gparted
            sudo gparted
                スワップ削除
                sda2を右端に移動
                スワップ作成
                sda1拡張
        swapのUUID変化に対応
            sudo blkid
                /dev/sda1: UUID="620458fd-4705-4b74-80a3-cb41886bb8e1" TYPE="ext4" PARTUUID="07cd590d-01"
                /dev/sda5: UUID="ef44aa65-381f-4d13-aa80-cfb78d6bebd2" TYPE="swap" PARTUUID="07cd590d-05"
            /etc/fstab
        ok
    Docker 続
        Dockerの公式ドキュメントは一通り見たほうがいいな
        使い方学習3
            https://docs.docker.com/engine/getstarted/step_five/
            docker tag 1908d5dd54d8 decadenthoge/docker-whale:latest
            docker login
            docker push decadenthoge/docker-whale
            docker image remove -f 1908d5dd54d8
            docker run decadenthoge/docker-whale
        他
            コンテナは、独立したプロセスのように振る舞う感じ
            コンテナIDで識別
            デタッチしたりアタッチしたり
            スナップショットを記録(=コミットしてImage生成)もでき、Docker Hubにあげられる
            workspaceがDocker Container、branchがDocker Image
    Python3の開発環境を用意する
        要求
            Python3のコード作成・実行・対話
            環境を汚さずに、使い捨てできる形
        要件
            下記コマンドを実行すると
                docker run -it decadenthoge/my_python_dev_env
            下記のPython3の開発環境が
                UbuntuとかのOS上
                シェル
                vim
                gitでバージョン管理
                python3インタプリタの実行
                pythonのパッケージ導入
                環境内の変更およびそれを次回のために維持
            手に入り、かつ、Dockerを動かす側の環境は一切汚れない
        方法
            Dockerfile記述 ubuntuをベース bashをエントリーポイント
            build
            docker run -it
            vim,git系を用意
                必要なパッケージをapt-get install
                    vim git
                自分のドットファイルをclone
                rcをリンク
            Python系を用意
                Minicondaについて調べてインストール
            デタッチ
            タグ
            Hubでリポジトリ作成
            プッシュ
                docker push decadenthoge/my_python_dev_env:latest
        実行する前に、minicondaのDockerImageを触ってみよう
            #docker pull continuumio/miniconda
            docker run -t -i continuumio/miniconda /bin/bash
            debianベースだから、ほんとに最小限だ
        実行
            Dockerfile記述
                https://github.com/hyperSuperHoge/myDockerfile
                ubuntuをベース
                vim,git系を用意
                    必要なパッケージをapt-get install
                        vim git
                    自分のドットファイルをclone
                    rcをリンク
                bashをエントリー
                USERコマンド使うと、以後のシェルコマンドはそのユーザでログイン
                Dockerfile内のCOPYなどの命令にて、環境変数を参照するときは注意
                    RUNによる環境変数の書き換えは反映されない
                    build時に確定するっぽい 静的というか
                    http://stackoverflow.com/questions/28966198/dockerfile-home-is-not-working-with-add-copy-instructions
            build
                道中が同じならキャッシュを使ってくれるから 時間短縮でうれしいな
            Python系を用意
                Minicondaについて調べてインストール設定追加
                公式のDockerfileが参考になる
                    https://hub.docker.com/r/continuumio/miniconda3/~/dockerfile/
                Pythonのバージョン云々でビクビクして実験用にDockerまで用意したわけだが、Minicondaで全然問題ないのでは?
                ワロス
                Dockerが使えるようになったのは収穫だからよしとしよう
                あとグラフを可視化するときにGUIが必要だから、Dockerで家クラウド的に使うのであれば、X Windowが必要になるなー
                    http://postd.cc/running-gui-apps-with-docker/
                ファー
                http://qiita.com/yubessy/items/2dd43551aa8308dc7eca
            build
            タグ付け
                docker tag c067abc4d8bd decadenthoge/my_python_dev_env:1.0
                docker tag c067abc4d8bd decadenthoge/my_python_dev_env:latest
            Hubでリポジトリ作成
            プッシュ
                docker push decadenthoge/my_python_dev_env:latest
            ローカルのコンテナ/Image全削除
                docker rm `docker ps -aq`
                docker rmi `docker images -aq`
                --
                Dockerfile:ビルド設定
                Image:ビルド結果
                コンテナ:Imageを起点として動いているもの
            テスト
                docker run -it decadenthoge/my_python_dev_env
                conda create --name myenv python=3.5 numpy=1.11.1
                source activate myenv

f:id:superHoge:20170223192402p:plain

f:id:superHoge:20170223192406p:plain

f:id:superHoge:20170223192410p:plain
            ok
考察
    目的は達成された
    わざわざDockerまで導入する必要はなく、Miniconda3がすべて解決してくれる
    ただ、事前調査でその知見を得られるかというと どうなんだろう
    少なくとも、Dockerを使えるようになったのは収穫だ
    環境を汚しまくっても気軽に使い捨ててクリーンな状態からやり直せる
メモ
    VirtualBoxの仮想イメージをDropbox下に置くのはナンセンスだった