Nedia What's up!

ネディアのエンジニアによるIT技術やサービスの紹介・検証などをお届け!

CentOS7で始めるDocker入門 2/2

二回目である今回はDockerの基本操作について解説します。
(一回目の記事はこちら)

コンテナ操作の基本

Dockerイメージの入手

最初に、基本となるDockerイメージを入手します。Dockerイメージは、Docker Hub Registry(https://hub.docker.com/)にて公開されています。
公開されているイメージは、docker searchコマンドで検索できます。CentOSのイメージを検索した場合の例がこちらです。

様々なイメージを様々な人が公開しています。OFFICIALの欄に[OK]と表示されているものが、CentOSのオフィシャルイメージです。あらかじめアプリケーションをインストールしたものがいくつも公開されています。
Dockerイメージのダウンロードは、docker pullコマンドで行います。CentOS7のイメージをダウンロードする場合の実行例がこちらです。

この例のように、いくつかのイメージが一括してダウンロードされます。ダウンロードしたイメージは、次のようにして確認することができます。

Dockerのイメージは、リポジトリとタグを”:”で区切って指定します。例えば、①のCentOS 7 のイメージは、docker.io/centos:latestという名称で利用します。

コンテナの作成

コンテナの起動というのは、このイメージの上でプロセスを起動することを指します。Dockerは指定したイメージを展開し、コンテナのファイルシステムセットとして使用します。
コンテナの作成には、docker run コマンドを使います。次のような書式で利用します。

使用するイメージをで、そのイメージ上で動かすコマンドとその引数をで指定します。

docker.io/centos:latest というイメージでbashを起動する「centos7」という名前のコンテナを作成する場合のコマンドがこちらです。

この例では、docker run にオプションとして「-it」を付けています。これは対話(Interactive)モードで、TTY(端末・コンソール)を割り当てるという指定です。
起動したコンテナの中でlsコマンドなどを実行することが出来ます。もちろん viなどを使ってファイルを修正することもできます。
コンテナは、起動した/bin/bashのプロセスが動いている間だけ動作します。つまりこのシェルをexitした時点でコンテナが停止します。

コンテナを停止することなく、操作を元のシェルに戻したい場合には、Ctrl-P + Ctrl-qでコンテナのTTYを抜けることができます。

コンテナへの再接続

動作しているコンテナに接続するには、次のようにdocker attach コマンドにコンテナ名を指定して実行します。

動作中のコンテナの確認

動作中のコンテナを調べるには、docker ps コマンドを使います。

コンテナ情報の確認

Dockerのコンテナの詳細な状態を知りたい場合には、docker inspectを使います。Dockerの起動時に指定したプロセスや、コンテナに割り当てたリソースなどを確認することができます。

コンテナの停止

動作しているコンテナをホスト側から停止することもできます。次のようなdocker stop コマンドにコンテナ名を指定して実行します。

この処理を行うと、コンテナプロセスには、TERMシグナル、KILLシグナルが送られます。つまり、コンテナプロセスを強制終了することになります。

コンテナの起動

停止しているコンテナを再度動かすこともできます。次のようにdocker startコマンドにコンテナ名を指定して実行します。

コンテナの再起動

動作しているコンテナを再起動するには、docker restart コマンドを使います。このコマンドを実行すると、コンテナのプロセスを強制終了し、再度スタートします。

コンテナのコミット

コンテナの中でファイルを編集しても、コンテナを削除するとすべて変更は削除されてしまいます。ただし、コンテナの状態を新しいイメージとして保管することができます。
保管は、docker commitで行います。
docker commit は、コンテナを指定したローカルリポジトリに保管します。タグも指定することができます。また、-aオプションで作成者を、-mオプションでメッセージを付けることができます。
centos7というコンテナをlocalrepoというリポジトリに保管する例がこちらです。

コンテナの削除

作成したコンテナを削除するには、docker rm を使います。コンテナを削除すると、コンテナ内で作成したファイルなどはすべて破棄されてしまいますので、保管が必要な場合にはあらかじめ docker commit で新しいイメージとして保管する必要があります。

アプリケーション環境のコンテナ化とサービスの公開

Dockerは、KVMなどの仮想マシンに比べるとはるかに小さいサイズでイメージを管理することが出来ます。そのため、アプリケーションの実行環境とアプリケーションやコンテンツを一緒にDockerイメージとして保存し、バージョン管理なども行うことが出来ます。
Dockerコンテナ上にWWWサーバとコンテンツの環境を構築する例を使って、アプリケーション環境のコンテナ化とサービスの公開について説明します。

なお、次のような手順で作成していきます。
(1)WWWサーバの元となるコンテナを作成する
(2)WWWサーバの設定を行う
(3)WWWコンテンツを配置する
(4)イメージを保存する(コンテナ化)
(5)保存したイメージで新しいコンテナを作成し、動作確認をする
(6)コンテナサービスの公開

今後の実行例ではコンテナの上で実行すべきものと、ホスト上で実行すべきものがあります。紛らわしいため、ホスト側で実行すべきものには、(ホスト上)、コンテナ上で実行べきものには、(コンテナ上)と明記します。

(1)WWWサーバの元となるコンテナを作成する

最初に、WWWサーバの元となるコンテナを作成します。centos7の公式イメージを使って、/bin/bashを起動します。このとき、ホストからWWWコンテンツを渡すためにボリュームを共有しておきます。WWWコンテンツが入っているディレクトリ(ここでは/home/admin/html)を共有します。

ホストボリュームのマウントについての解説

–volumeオプションを使って、ホストのボリューム(/home/admin/html)をコンテナの/mntにマウントしています。なおホストボリュームのマウントは、次のような用途にで利用できます。

  • ホストからコンテナへのファイルの受け渡し
  • コンテナ間でのファイル共有
  • コンテナのデータの保存

コンテナで作成したファイルは、コンテナを削除すると削除されてしまいますが、マウントしてある領域のファイルを変更すれば、そのままホスト側に反映されます。

(2)WWWサーバの設定を行う

作成したコンテナにWWWサーバをインストールします。

必要があればWWWサーバの設定ファイルを編集し、設定を整えます。

(3)WWWコンテンツを配置する

DockerコンテナにWWWコンテンツを配置します。/mntにマウントしたホストボリュームからファイルをコピーします。ただし、通常の状態のままではSELinuxの制限でファイルにアクセスすることができません。
(これはコンテナがホストに悪影響を及ぼすことを防いでいるとも言えます)。そのため、まずホスト側でコンテンツのテキストを一時的に変更します。

Dockerコンテナ内で適切なディレクトリーにコピーします。

(4)イメージを保存する(コンテナ化)

WWWサーバの設定が終わりコンテンツを配置したところで、コンテナを停止し、ホスト側でdocker commitを実行しコンテナのイメージを保存します。

これで、アプリケーションとコンテンツを含んだイメージが完成しました。イメージを保管したら、作業に利用したコンテナは一旦削除しておきましょう。

(5)保存したイメージで新しいコンテナを作成し、動作確認する。

保存したイメージを使って、動作確認用にWWWサーバ用のコンテナを作成します。このコンテナでは、WWWサーバ(/usr/sbin/httpd)を起動します。

これで、コンテナ上でWWWサーバが動作しているはずです。この状態でホストからコンテナの80ポートにアクセスして動作を確認します。

・IPアドレスの調査
コンテナに割り当てられたIPアドレスは、docker inspectで調べることができます。

(6)コンテナサービスの公開

動作確認をして問題がなければ、コンテナサービスを外部に公開することができます。ます、一旦コンテナを終了し削除します。

次に、正式なWWWサーバのコンテナを作成します。この時、–publishをつけてホストのポートとコンテナのポートを接続します。
これによって、ホストの80番ポートを通して、外部からコンテナのWWWサーバに接続出来るようになります。

ブラウザでアクセスしてコンテンツが表示されれば成功です。(192.168.0.3がホストOSのIPアドレスです。)

docker03

Dockerの基本的な使い方の説明は以上となります。

まとめ

いかがでしたでしょうか?

実際にDockerを使い始める場合には、やはりテスト環境としての利用からが考えれます。リスクを抑えながらDockerの持ち味を生かせるためです。最初にテストに必要な設定を構築し、Dockerイメージとして保存しておくことで、簡単に元の環境に戻すことが可能です。

そして次のステップとしては、開発環境にDockerを利用をお勧めします。環境によってエラーが発生することがなくなるため、例えば開発チームに外部の企業が加わった際に、開発環境が配布出来る状態(コンテナ)として完成していれば、開発に取り掛かってもらうための時間も大分節約できるはずです。

最終的なステップとしては、本番環境として今回紹介したようにWEBサービスの提供等の利用が考えれらます。動作が軽いという利点を生かせますし、公開期間が終了した際には、コンテナをイメージ化して保存することで、再度必要になった時にも環境ごと復元できます。

こうしたメリットを考えれば、Dockerの導入を検討する価値は十分あるはずですので、この記事を参考にDockerに触れてみてもらえれば幸いです。

それでは。