Dockerでの環境用意を積極的にしていきたいのですが、なかなかaptコマンドやyumコマンドほど手軽ではないイメージがあって、使えないことがあります。Ansibleとかも組み合わせたいのですが、環境構築に時間をかけられないときは、仮想マシンをコピーして(ディスクコピー時間中は調べものをして並行して処理)やってしまう方がいいかなぁと思ったり。Vagrant, KVM, VirtualBox, Dockerといろいろ選択肢があるところで、どれも使えるようになっているといいのですが、なかなか全部をやりきるというのは難しいもので。基本的には絞ったほうが何かと良いのですが、それぞれ適材適所があって、どれもそこそこには知っておきたいと思ってしまうのが負担となるのかもしれません。
ということで、「Dockerで作る最強のWeb開発環境2017 – Qiita」といった記事があったりすると読んで、参考にしたりというのはやっているのですが、実際に自分のところで使う環境とはやっぱり違うわけで、それを作る手間がなぁ、と思う次第。Dockerfileとdocker-compose.ymlを共有できてdockerが動く環境を用意すれば、それで先に進むといえば進むのですが…
最近、VirtualBox上のUbuntuでangularアプリを開発とかしているのですが、ファイルシステムの更新監視が結構負担になっているようで、ホスト側でDockerを動かして、そこで開発をしてあげた方がいいのかな、と思ったり、ディスクをSSDにして高速化を図ったほうがいいのかな、とも思ったり、環境については、なかなか決まりません。
それで、最近「Pythonによるスクレイピング&機械学習 開発テクニック BeautifulSoup,scikit-learn,TensorFlowを使ってみよう 」というのをちらっと眺めてみたところ、最後の付録にDockerの説明があって、そちらでもDockerコンテナに開発環境は用意して使うといいよ、と紹介がされていました。
実際のところ、GUI環境はDockerで用意するよりホスト側の方が楽な気がしたりもするのですが、ライブラリなどはDockerコンテナの方で用意してあげたほうが、確かに何かとやりやすいはずです。そこで紹介されている方法は、Dockerコンテナへシェルコマンドでアクセスして、aptコマンドなどでインストールして、そこでDockerイメージを保存するという方式でした。こういうやりかたにも慣れたいところですが、なんとなくDockerfileを作ってしまった方がいいのだろうな、と自分でハードルを高くしてしまったりすることも多いので、なんとも難しいところです。つくりっぱなしで、忘れてしまったりとか。忘れてしまうパターンは学習用のディレクトリを用意してどこまでやったか忘れてしまうパターンと同じなので、ぐだぐだいうよりやってしまったほうが良いのでしょうね。たぶん。
ということで、よく使うと思われるコマンドについて一通りメモ。
目次
Anacondaを用意
Anacondaを用意するには下記でイメージを取得
$ docker pull continuumio/miniconda3
bashでアクセス
下記でアクセス。exitで停止して終了することが可能。dockerコンテナは「docker rm コンテナID」で削除するまで残っている。
$ docker run -i -t continuumio/miniconda3 /bin/bash
dockerのコンテナ確認
起動しているコンテナの確認は下記
$ docker ps -a
dockerのコンテナイメージ保存
コンテナIDが表示されるので、それをつかってコンテナの状態を保存可能
$ container_id=`docker ps -a|grep miniconda3|grep -v grep|awk '{print $1}'` $ repo_name=anaconda3 $ tag_name=init $ docker commit ${container_id} ${repo_name}:${tag_name}
dockerのコンテナイメージの確認
$ docker images
dockerのコンテナイメージのリポジトリ名指定で起動
$ docker run -i -t anaconda3:init /bin/bash
デタッチ
exitではなくコンテナを動かしたまま切断(デタッチ)をするには、Ctrl+pのあとCtrl+q。docker psをすると起動中のコンテナが表示される。attachで接続できる。
$ docker ps $ container_id=`docker ps|grep Up|grep anaconda3|grep -v grep|awk '{print $1}'` $ docker attach ${container_id}
再開
exitで終了したコンテナを再開するにはstart
$ container_id=`docker ps|grep Exit|grep anaconda3|grep -v grep|awk '{print $1}'` $ docker start ${container_id} $ docker attach ${container_id}
ホームディレクトリのマウント
ホームディレクトリをマウントするには下記。-vへ「ホストのパス:コンテナのパス」を指定。こうしておけば、${HOME/workspace/docker/anaconda3においたファイルをDockerコンテナで使えるようになる
$ mkdir -p ${HOME}/workspace/docker/anaconda3 $ docker run -i -t -v ${HOME}/workspace/docker/anaconda3:${HOME} anaconda3 /bin/bash
dockerコンテナの削除
コンテナの削除は下記。
$ for t in `docker ps -a|grep -v CONTAINER|grep Exit|awk '{print $1}'`; do echo $t; docker rm $t; done