- Docker〜コンテナ型仮想化〜
- ここでは、コンテナ型の仮想化を実装するソフトウェアである「Docker」を紹介します。
- わかりやすいDocker入門
- ここでは、Dockerのインストール、Dockerコンテナの操作等について説明します。
- コンテナ型仮想化に関連したOSS
- ここでは、コンテナ型仮想化に関連したOSSを紹介いたします。
Dockerは、入門するにはハードルが高いと言われています。しかし、導入は極めて簡単です。RedHat Enterprise Linux7/CentOS7に標準で採用されていますが、バージョンが古いため、Dockerの公式サイトから、Docker-CE(Docker Community Edition)を入手して使うことをお勧めします。
ここでは、Docker入門として、初心者向けにDockerの導入方法を分かりやすく解説します。
Dockerとは、コンテナ型の仮想環境を作成、配布、実行するためのソフトウェアです。Docker社が開発し、2013年にオープンソースソフトウェアとして公開されました。コンテナ実装ソフトウェアのデファクトスタンダートになっています。Dockerの仕組みは他の仮想環境に比べ、ハードディスクの使用量が少ない省リソースで済み、起動が速く劣化が少ないといわれています。最近では、いくつかのクラウドベンダーがコンテナ型仮想化のサービスを提供しており、ほとんどのサービスでDockerを利用することができます。
最初に、Dockerの公式なレポジトリを追加します。
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo ⏎
レポジトリが追加できたら、Dockerパッケージをインストールします。
# yum install docker-ce docker-ce-cli containerd.io ⏎
Dockerサービスを起動します。また、自動起動の設定もしておきます。
# systemctl start docker ⏎ # systemctl enable docker ⏎
一般ユーザで、Dockerを利用できるようにするためには、ユーザをDockerグループに登録します。次は、adminというユーザをDockerグループに登録する場合の例です。
# groupmems -a admin -g docker ⏎
以上でDockerのインストールは終わりです。
動作確認として、hello-worldコンテナを動作させてみましょう。
# docker run hello-world ⏎ Unable to find image 'hello-world:latest' locally ← (1) latest: Pulling from library/hello-world ← (2) 1b930d010525: Pull complete Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535 Status: Downloaded newer image for hello-world:latest Hello from Docker! ← (3) This message shows that your installation appears to be working correctly. :
docker runコマンドでは、指定したDockerイメージを取り寄せて、それを起動します。
(1) hello-worldコンテナをローカルで探したけれど見つからなかった
(2) hello-worldのコンテナイメージをDocker-HUBからダウンロード開始
(3) hello-worldコンテナを実行した結果が表示される
つまり、この例のように「Hello from Docker!」が表示されていれば、正常に動作していることが分かります。
なお、(1)では「hello-world:latest」という名前が表示されています。これは、hello-worldコンテナの最新版を示しています。
まず最初に、利用するDockerイメージを探します。Dockerイメージの検索は、docker searchコマンドで行うことができます。次は、ApacheのDockerイメージを探す場合の実行例です。
# docker search apache ⏎ NAME DESCRIPTION STARS OFFICIAL AUTOMATED httpd The Apache HTTP Server Project 2413 [OK] tomcat Apache Tomcat is an open source implementati… 2334 [OK] cassandra Apache Cassandra is an open-source distribut… 952 [OK] maven Apache Maven is a software project managemen… 835 [OK] solr Solr is the popular, blazing-fast, open sour… 646 [OK] eboraas/apache-php PHP on Apache (with SSL/TLS support), built … 141 [OK] :
NAMEはDockerイメージの名称、DESCRIPTIONには解説があります。STARSは、Dockerイメージの評価としてつけられた星(STAR)の数です。OFFICIALに[OK]と表示されているのは、オフィシャルなDockerイメージであることを示しています。また、AUTOMATEDは、自動ビルド機能を利用して作られたDockerイメージです。
オプションを使って、絞り込むことができます。例えば、オフィシャルなイメージだけを検索する場合には、次のようにします。
# docker search apache --filter is-official=true ⏎ NAME DESCRIPTION STARS OFFICIAL AUTOMATED httpd The Apache HTTP Server Project 2424 [OK] tomcat Apache Tomcat is an open source implementati… 2345 [OK] cassandra Apache Cassandra is an open-source distribut… 955 [OK] maven Apache Maven is a software project managemen… 838 [OK] solr Solr is the popular, blazing-fast, open sour… 647 [OK] flink Apache Flink is a powerful open-source dist… 92 [OK] groovy Apache Groovy is a multi-faceted language fo… 67 [OK] tomee Apache TomEE is an all-Apache Java EE certif… 65
また、星(STAR)の最低数を指定することで、信頼できるイメージだけを表示することもできます。
# docker search apache --filter stars=1000 ⏎ NAME DESCRIPTION STARS OFFICIAL AUTOMATED httpd The Apache HTTP Server Project 2424 [OK] tomcat Apache Tomcat is an open source implementati… 2345 [OK]
なお、各コンテナイメージの詳しい情報や使い方は、次のサイトで調べることができます。
検索窓にコンテナ名を入れると、関連するコンテナの一覧が表示されます。このサイトには、コンテナの起動方法など、詳しい情報が記載されています。
docker pullコマンドを使うと、Dockerイメージをあらかじめダウンロードしておくことができます。
# docker pull httpd:latest ⏎ latest: Pulling from library/httpd 27833a3ba0a5: Pull complete 7df2f4a2bf95: Pull complete bbda6f884d14: Pull complete 4d3dcf503f89: Pull complete b2f11da8a23e: Pull complete Digest: sha256:b4096b744d92d1825a36b3ace61ef4caa2ba57d0307b985cace4621139c285f7 Status: Downloaded newer image for httpd:latest
httpd:の後ろにある「latest」は、タグと呼ばれるものでバージョンを示しています。latestは、最新バージョンを意味しています。明示的にバージョンを指定することもできます。
ダウンロード済みのDockerイメージを確認するには、docker image lsコマンドを使います。次は、その実行例です。
# docker image ls ⏎ REPOSITORY TAG IMAGE ID CREATED SIZE httpd latest d4a07e6ce470 12 days ago 132MB hello-world latest fce289e99eb9 3 months ago 1.84kB
Dockerイメージを削除するには、docker rmiコマンドを使います。
# docker rmi httpd ⏎ Untagged: httpd:latest Untagged: httpd@sha256:b4096b744d92d1825a36b3ace61ef4caa2ba57d0307b985cace4621139c285f7 Deleted: sha256:d4a07e6ce470b5888ec230eaa25a9b7ebcc0b2d8722bf0720464770867b8cf32 Deleted: sha256:e78a334873c93bd9798c128983532fcbc9af52cfa56eed7a4e41081b3a9ded2b Deleted: sha256:d733c73e31715eac0bef128330c00c5ba9a4b73b98a4a80a0a112837a03bf6fa Deleted: sha256:d614ecec88e40bd59c67c1e60abfb2fd46f3cc6bb554485f2e9c6d39a183f62a Deleted: sha256:4aa4cb56ecccfbcee4984780124f427e7baded38c5a3586144aff372a72168ce Deleted: sha256:5dacd731af1b0386ead06c8b1feff9f65d9e0bdfec032d2cd0bc03690698feda
Dockerコンテナの起動は、docker runコマンドで行います。先ほどの、hello-worldコンテナのようにDockerコンテナが一回の処理で完了してしまう性質のものの場合には、次のように単純にコンテナ名を引数に指定します。
# docker run hello-world ⏎
この場合、コンテナはフォアグラウンドで動作して、画面にはコンテナ内のプログラムの出力内容が表示されます。一方、Apacheのように常駐型のプログラムを動作させる場合には、コンテナはバックグラウンドで動作させる必要があります。その場合には、次のように「-d」(デタッチ)オプションをつけてコンテナを起動します。
# docker run -d httpd ⏎ 210e2d0c290b7efc2308dfe9425059085e1f8266831c71f7e15112e62659b8db
コンテナを起動すると、コンテナイメージの作成時に指定されたデフォルトのプログラムが自動的に起動されます。
どのコンテナが起動されているのかを調べるには、docker psコマンドを使います。
# docker ps ⏎ CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS sNAMES 210e2d0c290b httpd "httpd-foreground" 7 minutes ago Up 7 minutes 80/tcp keen_mcnulty
この例のように、docker psコマンドは現在起動しているコンテナを表示します。「-a」オプションの指定すると、停止中のコンテナも表示することができます。
# docker ps -a ⏎ CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 210e2d0c290b httpd "httpd-foreground" 9 minutes ago Up 9 minutes 80/tcp keen_mcnulty 9f5d8cf6aa43 hello-world "/hello" 8 days ago Exited (0) 8 days ago nostalgic_franklin
httpdのように、デタッチして常駐しているコンテナを停止するには、docker stopコマンドを使います。引数には、docker psコマンドで表示されたコンテナIDを指定します。
# docker stop 210e2d0c290b ⏎ 210e2d0c290b $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
停止しているコンテナは、docker restartコマンドを使って再起動することができます。
# docker restart 210e2d0c290b ⏎
停止したコンテナは、システムに残りつづけるため、不要になったら明示的に削除する必要があります。コンテナを削除するには、docker rmコマンドを使います。引数には、docker psコマンドで表示されているコンテナのIDを指定します。
# docker rm 9f5d8cf6aa43 ⏎ 9f5d8cf6aa43 # docker ps -a ⏎ CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 210e2d0c290b httpd "httpd-foreground" 10 minutes ago Up 10 minutes 80/tcp keen_mcnulty
先ほど指定したhttpdコンテナは、docker psコマンドの出力でもPORTSの欄に表示されているように、TCPの80番ポートで要求を待ち受ける作りになっています。しかし、このポート番号はあくまでコンテナ内の仮想環境で使われているもので、外部からアクセスすることはできません。ポートに外部からアクセスするには、ホスト側コンピュータとコンテナのポートを紐付ける設定が必要です。ポートの紐付けは、「-p」(--publish)」オプションで行います。
次は、ホスト側の80番ポートと、コンテナの80番ポートを紐付けてコンテナを起動する例です。
# docker run -d -p 80:80 httpd ⏎ 00810d3f6e4145cbcbdb26c1dd084b0800a7db66437529bc9489d6aed2ffac81
これで、ホストの80番ポートにアクセスすれば、コンテナのドキュメントを見ることができます。次は、ホストコンピュータ(10.1.1.4)の80番ポートにブラウザから接続してみた例です。
この例では、コンテナにあらかじめ用意されたテスト用ドキュメントが表示されています。しかし、実際の利用では、このコンテナで扱うコンテンツを指定する必要があります。Dockerでは、ホストコンピュータ上にあるストレージをマウントして、利用することができます。
次の例は、「-v」オプションでストレージボリュームのマウントを指定しています。ホストの/home/admin/www.designet.co.jpを、コンテナの/usr/local/apache2/htdocsにマウントしています。
# docker run -d -p 80:80 -v /home/admin/www.designet.co.jp:/usr/local/apache2/htdocs httpd ⏎ 9269af2af749ebeaf37c80cae90ea1a008aab480b9ec0daad6219e9afa2a0fc3
実際にブラウザから接続してみると、マウントしたドキュメントが表示されます。
httpdコンテナでは、アクセスログとエラーログはコンテナ内で標準出力、エラー出力に出力されるようになっています。コンテナが出力したログは、次のようにdocker logsコマンドで確認することができます。
# docker logs b73bc4a85da4 ⏎ AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message [Thu Apr 18 06:18:15.534608 2019] [mpm_event:notice] [pid 1:tid 140277407854656] AH00489: Apache/2.4.39 (Unix) configured -- resuming normal operations [Thu Apr 18 06:18:15.534822 2019] [core:notice] [pid 1:tid 140277407854656] AH00094: Command line: 'httpd -D FOREGROUND' 192.168.30.67 - - [18/Apr/2019:06:18:22 +0000] "GET / HTTP/1.1" 200 54079 192.168.30.67 - - [18/Apr/2019:06:18:23 +0000] "GET /common/images/global_nav_back.gif HTTP/1.1" 404 231 :
ストレージボリュームをマウントするのではなく、Dockerコンテナ内にコンテンツファイルをコピーすることもできます。その場合には、docker cpコマンドやdocker execコマンドを使います。
まず、コンテナを起動します。
# docker run -d -p 80:80 httpd ⏎ b73bc4a85da4ea376c954db5fd118ddc1175d02f6f0ce7f472d27881fda94547
コンテナのIDを調べます。
# docker ps ⏎ CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b73bc4a85da4 httpd "httpd-foreground" 23 seconds ago Up 22 seconds 0.0.0.0:80->80/tcp zealous_chaplygin
docker cp コマンドを使ってファイルをコピーします。
# docker cp /home/admin/www.designet.co.jp b73bc4a85da4:/usr/local/apache2 ⏎
docker cpでは、「b73bc4a85da4:/usr/local/apache2/htdocs/」のようにコンテナIDを使って、コピー先を指定しています。逆に、コンテナからホスト側にファイルを取り出すこともできます。
ファイルは、ディレクトリ全体がコピーされます。この場合、コンテナ上には、/usr/local/apache2/www.designet.co.jp/というディレクトリができます。これでは不都合ですので、docker execを使って、コンテナ上でコマンドを実行することができますので、ファイル名をhtdocsに修正します。
まず、テスト用ドキュメントをバックアップします。
# docker exec b73bc4a85da4 mv /usr/local/apache2/htdocs /usr/local/apache2/htdocs.old ⏎
次に、www.desiget.co.jpをhtdosに修正します。
# docker exec b73bc4a85da4 mv /usr/local/apache2/www.designet.co.jp /usr/local/apache2/htdocs ⏎
これで、コンテナ上にコンテンツを配置することができました。
コンテナイメージのシェルを対話的に使用することもできます。
# docker exec -it 79143a76b144 /bin/bash ⏎
「-i」オプションは対話型(interactive)、「-t」オプションはTTYを割り当てることを指定しています。このコマンドを実行すると、次のようにコンテナ内のコマンドを使って、直接操作することができます。
root@79143a76b144:/usr/local/apache2# ls ⏎ bin build cgi-bin conf error htdocs icons include logs modules root@79143a76b144:/usr/local/apache2# ls htdocs ⏎ books download.1 itcompany.1 product challenge estimate link robots.txt common faq mailmagazine seminar company images modelplan sitemap consult index.html open_source strong_point contact info ossinfo system contentsprovider internetprovider others contentsprovider.1 internetprovider.1 others.1 download itcompany privacy # vi conf/httpd.conf ⏎ bash: vi: command not found
この機能を使って、直接的にコンテナ内を対話的に変更することもできます。プロンプトからも分かるように、コンテナにはrootユーザとして接続され、ホスト名はコンテナIDになっています。また、コンテナにはアプリケーションの動作に必要な最小の環境しか含まれていませんので、この例のようにviのような編集コマンドが含まれていないこともあります。
編集したコンテナは、保存しておくことができます。コンテナの保存は、docker commitコマンドで行います。
# docker commit -a Admin -m "httpd with www.designet.co.jp" b73bc4a85da4 localrepo:httpd-designet ⏎ sha256:d617d909b85805b678a2d0b803400c13713919f681b2a643443bfa4894c315b9
「-a」オプションでは、コンテナの作者名を指定します。「-m」オプションでは、コンテナにメッセージを付けることができます。b73bc4a85da4は、保存するコンテナのIDです。また、localrepo:httpd-designetは、ローカルレポジトリにhttpd-designetという名前でコンテナを保存することを示しています。
保存したコンテナは、docker image lsコマンドで調べることができます。
# docker image ls localrepo ⏎ REPOSITORY TAG IMAGE ID CREATED SIZE localrepo httpd-designet d617d909b858 2 minutes ago 144MB
さて、docker cpやdocker execを使って、手動でコンテナを編集することもできますが、そのプロセスを自動化することが可能です。次のようなDockerfileを作成します。
Dockerfile
FROM httpd LABEL maintainer="Admin" COPY www.designet.co.jp /usr/local/apache2/htdocs CMD "httpd-foreground"
FROMでは、元になるイメージを指定します。また、LABEL maintainerでは、作成するイメージの作者を指定します。COPYは、Dockerイメージ上に置くファイルを指定します。また、CMDは、作成したDockerイメージ上で実行するコマンドを指定しています。
なお、COPYには、イメージを作成するディレクトリからの相対パスを指定します。また、docker cpコマンドとは少し動きが違っています。この例では、/usr/local/apache2/htdocs/www.designet.co.jpというディレクトリができてしまいそうです。しかし、実際にはwww.designet.co.jpの配下のファイルをすべて/usr/local/apache2/htdocsにコピーします。
ファイルが用意できたら、docker buildコマンドでイメージを作成します。
# docker build -f Dockerfile -t httpd-designet . ⏎ Sending build context to Docker daemon 61MB Step 1/4 : FROM httpd ---> d4a07e6ce470 Step 2/4 : LABEL maintainer="Admin" ---> Running in 235902f8ae12 Removing intermediate container 235902f8ae12 ---> 97ad28f2bca8 Step 3/4 : COPY www.designet.co.jp /usr/local/apache2/htdocs ---> 47f1d9fc50b9 Step 4/4 : CMD httpd-foreground ---> Running in 7e44b7cb7c48 Removing intermediate container 7e44b7cb7c48 ---> 2ced76030e86 Successfully built 2ced76030e86 Successfully tagged httpd-designet:latest
「-f Dockerfile」は、イメージの作成に使用するDockerfileを指定しています。「-t」オプションでは、イメージに付けるタグを指定しています。最後の「.」はイメージを作成する時に使うディレクトリです。
docker imagesコマンドで確認すると、指定したhttpd-designetというイメージが作成できていることが分かります。
# docker images ⏎ REPOSITORY TAG IMAGE ID CREATED SIZE httpd-designet latest b34056b541a9 5 minutes ago 138MB httpd latest d4a07e6ce470 2 weeks ago 132MB hello-world latest fce289e99eb9 3 months ago 1.84kB
Dockerコンテナに、外部から環境変数を使って情報を引き継ぐことができます。例えば、次のようにdocker runの引数に「-e」オプションを指定することで、Dockerコンテナ内に環境変数を渡すことができます。
# docker run -e VALUE="hello" centos:latest env ⏎ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=c7a04fc5689e VALUE=hello ← 環境変数が渡っている。 HOME=/root
この例では、centosコンテナにVALUEという環境変数を渡し、envコマンドで表示しています。出力結果を見ると、正しくVALUEという環境変数が設定されていることが分かります。この環境変数を上手く使うことで、同じコンテナでも動作を変更することができます。
例えば、httpdコンテナの起動ログでは、次のようにServerNameが設定されていないというメッセージが出ていました。
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
このメッセージを消してみましょう。
まず、次のように、httpd.confに環境変数で指定された値を設定してからhttpdを起動するプログラムを用意します。
start-httpd
#! /bin/sh echo "ServerName $SERVERNAME" >> /usr/local/apache2/conf/httpd.conf exec /usr/local/bin/httpd-foreground
次のようなDockerfileを用意します。
Dockerfile2
FROM httpd LABEL maintainer="Admin" COPY www.designet.co.jp /usr/local/apache2/htdocs COPY start-httpd /usr/local/bin ← プログラムをコピー RUN chmod +x /usr/local/bin/start-httpd CMD start-httpd ← コピーしたプログラムを実行
Dockerfile内には、RUNコマンドを記述しました。このコマンドは、コンテナをビルドするときに実行されます。
このファイルを使って、Dockerイメージをビルドします。
# docker build -f Dockerfile2 -t httpd-designet2 . ⏎ Sending build context to Docker daemon 60.99MB Step 1/6 : FROM httpd ---> d4a07e6ce470 Step 2/6 : LABEL maintainer="Admin" ---> Using cache ---> 97ad28f2bca8 Step 3/6 : COPY www.designet.co.jp /usr/local/apache2/htdocs ---> Using cache ---> 47f1d9fc50b9 Step 4/6 : COPY start-httpd /usr/local/bin ---> c65c3d1d8b63 Step 5/6 : RUN chmod +x /usr/local/bin/start-httpd ---> Running in 3c9c08a4c4ec Removing intermediate container 3c9c08a4c4ec ---> 1807d5b407b5 Step 6/6 : CMD start-httpd ---> Running in 10652fa2a2a9 Removing intermediate container 10652fa2a2a9 ---> e1b5f5a65eb3 Successfully built e1b5f5a65eb3 Successfully tagged httpd-designet2:latest
イメージが作成できたら、環境変数を指定してDockerコマンドで起動します。
# docker run -d -p 80:80 -e SERVERNAME=www.designet.co.jp httpd-designet2 ⏎ f073685c0c6a45435c94629477f311f82c704c6ba3e5dc810992f57685c60949
正しく、機能しているかを調べてみましょう。コンテナのIDを調べます。
# docker ps -a ⏎ CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f073685c0c6a httpd-designet2 "/bin/sh -c start-ht…" 10 seconds ago Up 8 seconds 0.0.0.0:80->80/tcp heuristic_colden
コンテナのログを確認してみます。
# docker logs f073685c0c6a ⏎ [Fri Apr 26 01:27:33.475397 2019] [mpm_event:notice] [pid 6:tid 140653166559296] AH00489: Apache/2.4.39 (Unix) configured -- resuming normal operations [Fri Apr 26 01:27:33.475686 2019] [core:notice] [pid 6:tid 140653166559296] AH00094: Command line: 'httpd -D FOREGROUND'
ServerNameに関するエラーがなくなっていることが分かります。
WEB-DBのような環境をコンテナで実現するには、Webサーバのコンテナとデータベースのコンテナ間で通信を行う必要があります。しかし、標準ではDockerのコンテナは、個別にカプセル化され別々のネットワーク空間に存在しています。そのため、コンテナ間で通信するには、次のような手続きを踏む必要があります。
専用のネットワーク空間を作成するには、docker network createコマンドを使います。
# docker network create webnet1 ⏎ ecbb01cee1942fb667e6c5869ab9d95aaf62e0948b781da4464f8c478507bf80
作成されたネットワークは、次のようにしてdocker network lsコマンドで確認することができます。
# docker network ls ⏎ NETWORK ID NAME DRIVER SCOPE b665a0d435ff bridge bridge local bb1bf916e78c host host local 60c807d8e749 none null local ecbb01cee194 webnet1 bridge local
次に、docker runコマンドにコンテナ名、ネットワークを指定して起動します。次のようにコンテナ名は--nameオプション、ネットワーク名は--networkオプションで指定します。
# docker run -d -p 80:80 --name www --network webnet1 httpd-designet ⏎ f9e4044203feac0eefd87edf6077fcb356044a8002119ebfdf3eb10a2ec1896d
試しに、同じネットワークでcentosのコンテナを立ち上げてみましょう。次のように、testという名前で、webnet1のネットワークに参加するようにコンテナを起動します。
# docker run -it --name test --network webnet1 centos:latest /bin/bash ⏎ Unable to find image 'centos:latest' locally latest: Pulling from library/centos 8ba884070f61: Pull complete Digest: sha256:8d487d68857f5bc9595793279b33d082b03713341ddec91054382641d14db861 Status: Downloaded newer image for centos:latest [root@3a0773402aad /]#
docker runには-itオプションを指定しました。これは、対話型(Interactive)でTTYを割り当てるというオプションです。プロンプトが出ていますので、対話的に利用することができます。コンテナには、自動的にDNSが設定され、同じネットワークに所属しているコンテナにはコンテナ名をそのままホスト名にして通信することができます。
例えば、pingをしてみます。
[root@3a0773402aad /]# ping www ⏎ PING www (172.18.0.2) 56(84) bytes of data. 64 bytes from www.webnet1 (172.18.0.2): icmp_seq=1 ttl=64 time=1.79 ms 64 bytes from www.webnet1 (172.18.0.2): icmp_seq=2 ttl=64 time=0.275 ms 64 bytes from www.webnet1 (172.18.0.2): icmp_seq=3 ttl=64 time=0.259 ms ^C --- www ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2001ms rtt min/avg/max/mdev = 0.259/0.777/1.798/0.722 ms
このようにwww.webnet1(ホスト名.ネットワーク名)という名称で通信を行うことがでます。wwwコンテナ上では、Webサーバが動作していますので、curlコマンドを使ってコンテンツを表示することができます。
[root@3a0773402aad /]# curl www ⏎ % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 53658 100 53658 0 0 4611k 0 --:--:-- --:--:-- --:--:-- 5240k <!DOCTYPE html> <html lang="ja"><!-- InstanceBegin template="/Templates/base.dwt" codeOutsideHTMLIsLocked="false" --> <head> <!-- InstanceBeginEditable name="charset" --><!-- InstanceEndEditable --> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width"> <!-- InstanceBeginEditable name="doctitle" --> <title>サーバ構築・ネットワーク構築のデージーネット</title> <!-- InstanceEndEditable --> <!-- InstanceBeginEditable name="keyword" --> :
なお、--nameコマンドで名前をつけると、コンテナIDの代わりに名前を指定してコンテナを操作できて便利です。
# docker ps ⏎ CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f9e4044203fe httpd-designet "/bin/sh -c \"httpd-f…" 14 minutes ago Up 14 minutes 0.0.0.0:80->80/tcp www $ docker stop www ← コンテナを停止 www $ docker rm www ← コンテナを削除 www
Docker composeは、複数のコンテナで構成されるシステムの構成を管理するための仕組みです。Docker composeを使うことで、複数のコンテナで構成されるシステムの運用管理がしやすくなります。Docker composeでは、composeファイルに動作させるコンテナの情報を記載します。composeファイルはYAML形式のファイルで、コンテナのビルド情報、ネットワークの情報、起動方法などを記載することができます。また、一つのファイルに複数のコンテナを記載し、その依存関係も定義することができます。
DockerfileやDocker composeを利用することで、コンテナの管理はやりやすくなります。しかし、これらのツールを使っても、Dockerには次のようないくつかの欠点があります。
Kubernetesは、こうした問題を解決してくれるソフトウェアで、コンテナオーケストレーションツールと呼ばれています。
コンテナ管理ツールとしてKubernetesを使用する場合、少なくとも3~5台のコンテナ実行環境が必要です。しかし、1台のサーバしか利用しないなど、小規模のシステムでコンテナを管理したい場合は、オープンソースソフトウェアのPortainerが便利です。
Portainerは、小さなコンテナ環境の管理にも対応しています。Docker単体、 Kubernetes、Nomadのデプロイが可能で、WebUIで簡単にコンテナの管理や監視を行うことができます。