最終更新日

香川研究室でのDockerの使い方

はじめに

Docker は OS レベルの仮想化技術を利用して、コンテナーと呼ばれる形式 でソフトウェアのパッケージを提供する技術です。コンテナー内で実行される プロセスは、他のプロセスやファイルシステムから隔離され、独自のファイル システもやプロセステーブルを持ち、あたかもそれ専用のコンピューターで実 行されているかのように見えます。

(ファイルやポートを共有するように起動時に設定しない限り)コンテナー 内で実行するプロセスは、コンテナー外のプロセスやファイルシステムに影響 を及ぼすことはありません。

Docker コンテナーは、OS 自体を実行するわけではないので、仮想マシンな どと比べると軽量で、一つのハードウェアでも多数実行することができます。

Windows Subsystem for Linux 2 により、Windows 上でも手軽に Docker を実行で きるようになりました。

Dockerfile

Dockerfile は、Docker イメージを構築するための命令の集まりです。 Docker イメージは Docker コンテナーの土台・ひな型です。

Dockerfile のコマンドには、元となるイメージの指定 (FROM)、ファイルの取得 (ADD, COPY)、コマンドの実行 (CMD)などがあります。詳しくは Dockerfile のリファレン スを見てください。

ADDCOPY は似ていますが、 ADD のほうは tar ファイルを展開する、source にURL を指定す ることができる、など の違 いがあるようです。単なるファイルのコピーならば、COPY コマンドを使うとよいでしょう。

Dockerfile を作成しておくと、Docker が動いている環境ならどこ でも、サーバー環境をコマンド一つで起動することができます。

卒業論文や修士論文の研究で作成したシステムにサーバー側のプログラムを含 んでいる場合は(例えば Java Servlet/JSP, node.js, PHP, WAI, Django, Flask, Ruby on Rails などで作成している場合は)Dockerfile を作成してお いて、サーバー側プログラムを、どのマシンにでも、すぐに配備できるように 準備しておいてもらえると、卒業・修了後に後輩が気軽に試せるようになりま す。

というわけで、サーバー側のプログラムを使っている場合は、Dockerfile も同時に用意するようにしてください。(また、同時にクライアント側のプロ グラムはソースの少数の箇所を書き換えるだけで、サーバー側の URL を変更で きるようにしておいてください。)

シンボリックリンクに関する Tips

Dockerfile 内の ADD コマンド、COPY コマン ドは、シンボリックリンクをたどりません。しかし、場合によっては、シンボ リックリンクをたどってほしいことがあります。そういうときは、以下のよう に tar コマンドと組み合わせると、シンボリックリンクをたどっ てくれます。

tar -czh . | docker build - -t tagname

参考: How to make a symlinked folder appear as a normal folder

リンク

Docker repository

Docker Hub の Browse Popular Images で、元にする Docker Image を探すことができます。例えば、Node.js を使うなら、オフィシャルイメージの node を使うことができます。

Docker 起動オプション

Docker コンテナー起動するときのコマンド(docker run)の よく使うと思われるオプションとして、次のようなものがあります。

--publish=… コンテナーのポートをホスト側に公開する
--restart=… 再起動ポリシーを指定する
--volume=…  ホスト側のファイルシステムをコンテナー側にマウントする

詳しくは、 docker run のコマンドライン・リファレンスを見てください。

NGINX

Docker で配備したサーバー側のプログラムを、研究室の外にも公開する場 合、NGIX の Reverse Proxy の設定で 80 番ポートへのアクセスを Docker コンテナーのポートへ通過させる場合が多い と思われます。

あるポートをサービスの待受けに使ったら、 /etc/nginx/conf.d/default.conf の先頭に、コメントのカタチ でメモしておいてください。

Unix Domain Socket

NGINX は Unix Domain Socket への Reverse Proxy もサポートしているよ うです(以下の例を参照)。

    proxy_pass http://unix:/path/to/unix_domain_socket;

Unix Domain Socket を使えば、ポートが誰か他の人と被らないか、気にし なくても良くなります。もちろん、サーバー側のプログラムも Unix Domain Socket で待ち受ける必要があります。

Jetty を始め、ほとんどのサーバー側フレームワークは Unix Domain Socket をサポー トしています。サーバ側プログラムが Unix Domain Socket をサポートしてい ない場合は、Docker コンテナ内部に、別の NGINX を走らせるという手段もあ ります。

NGINX が Unix Domain Socket で待ち受ける場合の設定の書き方は、以下の 例のようになります。

  # 普通は 
  #   listen 80;
  # などと書くところ
  listen unix:/path/to/unix_domain_socket;

Koji Kagawa