kivantium活動日記

プログラムを使っていろいろやります

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+PCtrl+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 <イメージ名>

とすればよいです。

他に有用なコマンドを学んだら追記します。

広告コーナー