Docker上で開発を行う
ライブラリの開発をするときに、現在のバージョンと開発中のバージョンの性能比較をすることがあります。同じ名前のライブラリが1つの環境に複数存在すると面倒なことになるのでDockerを使って環境を分けることにしました。そのときに使ったコマンドについて記録します。
Dockerの仕組みやインストール方法については触れません。
Ubuntu 16.04のコンテナのダウンロード
Ubuntu 16.04を使うには
docker pull ubuntu:16.04
とします。
Dockerイメージの実行
Dockerイメージを入手したら
docker run -it ubuntu:16.04 /bin/bash
を実行するとコンテナ上でシェルが実行されます。オプションの意味は以下の通りです。
-i
: 標準入力を開いたままにする-t
: 擬似ttyに接続する。
コンテナの実行中にCtrl+P
とCtrl+Q
を続けて押すとデタッチされます。
アタッチするには、
docker ps
で現在実行中のコンテナのCONTAINER IDを確認してから
docker attach <CONTAINER ID>
を実行します。
別の実行方法
上の方法でコンテナを実行するとCtrl+D
をうっかり押したときにコンテナが終了してしまいます。以下のようにすると回避できます。
まずバックグラウンド実行のオプションをつけた状態でコンテナを起動します。
docker run -it -d --name mycontainer ubuntu:16.04
シェルを開くときには
docker exec -it mycontainer /bin/bash
のようにコンテナ上でbashを実行します。
docker stop mycontainer
とすればコンテナが停止します。
参考 - Dockerコンテナ内で操作 attachとexecの違い - Qiita
サーバーの変更
Ubuntuイメージの初期設定では海外サーバーになっているのでapt-getする前に国内サーバーに変更するとよいです。
sed -i.bak -e "s%http://[^ ]\+%http://ftp.jaist.ac.jp/pub/Linux/ubuntu/%g" /etc/apt/sources.list
参考: apt-getの利用リポジトリを日本サーバーに変更する - Qiita
Dockerイメージの作成
ライブラリの開発に必要なパッケージをインストールしたDockerイメージを用意しておくと便利です。こういうときにはDockerfileというファイルを作ります。
OpenBabel 2.4.1をmakeしてインストールしてあるDockerイメージを作るときに使ったDockerfileの例を示します。
FROM ubuntu:16.04 RUN apt-get update && apt-get install -y \ build-essential \ cmake \ libcairo2-dev \ libeigen2-dev \ wget \ zlib1g-dev RUN wget https://github.com/openbabel/openbabel/archive/openbabel-2-4-1.tar.gz && \ tar xf openbabel-2-4-1.tar.gz && \ cd openbabel-openbabel-2-4-1/ && \ mkdir build && cd build/ && \ cmake .. && make -j ${nproc} && make install
これをDockerfile
という名前で保存し、
docker build -t openbabel2.4.1 .
を実行すると openbabel2.4.1
という名前のDockerイメージが作成されます。
RDKitのDockerfileの場所: rdkit_containers/Dockerfile at master · rdkit/rdkit_containers · GitHub
ファイルのコピー
ファイルをコピーするにはホスト側で
docker cp hoge.txt <CONTAINER ID>:/huga
のようにすればいいです。
停止したコンテナの扱い
停止したものも含めたコンテナ一覧を見るには
docker ps -a
とします。
docker start <CONTAINER ID>
でコンテナを起動することができます。
docker rm <CONTAINER ID>
でコンテナを削除することができます。
docker ps -a -q
でIDの一覧を出せるので、コンテナを一括で削除するには
docker rm `docker ps -a -q`
とすればよいです。(参考: Dockerイメージとコンテナの削除方法 - Qiita)
イメージの削除
イメージ一覧は
docker images
で確認できます。
削除するには
docker rmi <イメージ名>
とすればよいです。
他に有用なコマンドを学んだら追記します。