最終更新日
Docker は OS レベルの仮想化技術を利用して、コンテナーと呼ばれる形式 でソフトウェアのパッケージを提供する技術です。コンテナー内で実行される プロセスは、他のプロセスやファイルシステムから隔離され、独自のファイル システもやプロセステーブルを持ち、あたかもそれ専用のコンピューターで実 行されているかのように見えます。
(ファイルやポートを共有するように起動時に設定しない限り)コンテナー 内で実行するプロセスは、コンテナー外のプロセスやファイルシステムに影響 を及ぼすことはありません。
Docker コンテナーは、OS 自体を実行するわけではないので、仮想マシンな どと比べると軽量で、一つのハードウェアでも多数実行することができます。
Windows Subsystem for Linux 2 により、Windows 上でも手軽に Docker を実行で きるようになりました。
Dockerfile は、Docker イメージを構築するための命令の集まりです。 Docker イメージは Docker コンテナーの土台・ひな型です。
Dockerfile のコマンドには、元となるイメージの指定
(FROM
)、ファイルの取得
(ADD
, COPY
)、コマンドの実行
(CMD
)などがあります。詳しくは Dockerfile
のリファレン
スを見てください。
ADD
と COPY
は似ていますが、
ADD
のほうは tar ファイルを展開する、source にURL を指定す
ることができる、など
の違
いがあるようです。単なるファイルのコピーならば、COPY
コマンドを使うとよいでしょう。
Dockerfile を作成しておくと、Docker が動いている環境ならどこ でも、サーバー環境をコマンド一つで起動することができます。
卒業論文や修士論文の研究で作成したシステムにサーバー側のプログラムを含 んでいる場合は(例えば Java Servlet/JSP, node.js, PHP, WAI, Django, Flask, Ruby on Rails などで作成している場合は)Dockerfile を作成してお いて、サーバー側プログラムを、どのマシンにでも、すぐに配備できるように 準備しておいてもらえると、卒業・修了後に後輩が気軽に試せるようになりま す。
というわけで、サーバー側のプログラムを使っている場合は、Dockerfile も同時に用意するようにしてください。(また、同時にクライアント側のプロ グラムはソースの少数の箇所を書き換えるだけで、サーバー側の URL を変更で きるようにしておいてください。)
Dockerfile 内の ADD
コマンド、COPY
コマン
ドは、シンボリックリンクをたどりません。しかし、場合によっては、シンボ
リックリンクをたどってほしいことがあります。そういうときは、以下のよう
に tar
コマンドと組み合わせると、シンボリックリンクをたどっ
てくれます。
tar -czh . | docker build - -t tagname
参考: How to make a symlinked folder appear as a normal folder
Docker Hub の Browse Popular Images
で、元にする Docker Image を探すことができます。例えば、Node.js を使うなら、オフィシャルイメージの
node
を使うことができます。
Docker コンテナー起動するときのコマンド(docker run
)の
よく使うと思われるオプションとして、次のようなものがあります。
--publish=… コンテナーのポートをホスト側に公開する --restart=… 再起動ポリシーを指定する --volume=… ホスト側のファイルシステムをコンテナー側にマウントする
詳しくは、
docker run
のコマンドライン・リファレンスを見てください。
Docker で配備したサーバー側のプログラムを、研究室の外にも公開する場 合、NGIX の Reverse Proxy の設定で 80 番ポートへのアクセスを Docker コンテナーのポートへ通過させる場合が多い と思われます。
あるポートをサービスの待受けに使ったら、
/etc/nginx/conf.d/default.conf
の先頭に、コメントのカタチ
でメモしておいてください。
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;