オープンソース

わかりやすいDocker入門

Dockerは、入門するにはハードルが高いと言われています。しかし、導入は極めて簡単です。RedHat Enterprise Linux7/CentOS7に標準で採用されていますが、バージョンが古いため、Dockerの公式サイトから、Docker-CE(Docker Community Edition)を入手して使うことをお勧めします。
ここでは、Docker入門として、初心者向けにDockerの導入方法を分かりやすく解説します。

Dockerとは

Dockerとは、コンテナ型の仮想環境を作成、配布、実行するためのソフトウェアです。Docker社が開発し、2013年にオープンソースソフトウェアとして公開されました。コンテナ実装ソフトウェアのデファクトスタンダートになっています。Dockerの仕組みは他の仮想環境に比べ、ハードディスクの使用量が少ない省リソースで済み、起動が速く劣化が少ないといわれています。最近では、いくつかのクラウドベンダーがコンテナ型仮想化のサービスを提供しており、ほとんどのサービスで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のインストールは終わりです。

Dockerコンテナの起動(docker run)

動作確認として、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イメージの検索は、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イメージのダウンロード(docker pull)

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イメージを確認するには、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イメージを削除するには、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コンテナの起動は、docker runコマンドで行います。先ほどの、hello-worldコンテナのようにDockerコンテナが一回の処理で完了してしまう性質のものの場合には、次のように単純にコンテナ名を引数に指定します。

# docker run hello-world ⏎

この場合、コンテナはフォアグラウンドで動作して、画面にはコンテナ内のプログラムの出力内容が表示されます。一方、Apacheのように常駐型のプログラムを動作させる場合には、コンテナはバックグラウンドで動作させる必要があります。その場合には、次のように「-d」(デタッチ)オプションをつけてコンテナを起動します。

# docker run -d httpd ⏎
210e2d0c290b7efc2308dfe9425059085e1f8266831c71f7e15112e62659b8db

コンテナを起動すると、コンテナイメージの作成時に指定されたデフォルトのプログラムが自動的に起動されます。

Dockerコンテナの状態確認

どのコンテナが起動されているのかを調べるには、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

Dockerコンテナの停止

httpdのように、デタッチして常駐しているコンテナを停止するには、docker stopコマンドを使います。引数には、docker psコマンドで表示されたコンテナIDを指定します。

# docker stop 210e2d0c290b ⏎
210e2d0c290b
$ docker ps
CONTAINER ID    IMAGE   COMMAND   CREATED   STATUS   PORTS   NAMES

Dockerコンテナの再起動

停止しているコンテナは、docker restartコマンドを使って再起動することができます。

# docker restart 210e2d0c290b ⏎

Dockerコンテナの削除

停止したコンテナは、システムに残りつづけるため、不要になったら明示的に削除する必要があります。コンテナを削除するには、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

Dockerコンテナとの通信

先ほど指定した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コンテナとの通信画像

ストレージの利用

この例では、コンテナにあらかじめ用意されたテスト用ドキュメントが表示されています。しかし、実際の利用では、このコンテナで扱うコンテンツを指定する必要があります。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

実際にブラウザから接続してみると、マウントしたドキュメントが表示されます。

Docker:ストレージの利用画像

コンテナのログ

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

Dockerfileによるイメージの作成

さて、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をより便利に使う

Docker compose

Docker composeは、複数のコンテナで構成されるシステムの構成を管理するための仕組みです。Docker composeを使うことで、複数のコンテナで構成されるシステムの運用管理がしやすくなります。Docker composeでは、composeファイルに動作させるコンテナの情報を記載します。composeファイルはYAML形式のファイルで、コンテナのビルド情報、ネットワークの情報、起動方法などを記載することができます。また、一つのファイルに複数のコンテナを記載し、その依存関係も定義することができます。

Kubernetes

DockerfileやDocker composeを利用することで、コンテナの管理はやりやすくなります。しかし、これらのツールを使っても、Dockerには次のようないくつかの欠点があります。

  • Dockerコンテナが何らかの異常で停止すると、サービスダウンしてしまう
  • 自ホスト上のコンテナの管理しかできない
  • ホストに障害が発生した場合の冗長性確保が難しい
  • 大量のコンテナを全て監視しないといけない

Kubernetesは、こうした問題を解決してくれるソフトウェアで、コンテナオーケストレーションツールと呼ばれています。

Portainer

コンテナ管理ツールとしてKubernetesを使用する場合、少なくとも3~5台のコンテナ実行環境が必要です。しかし、1台のサーバしか利用しないなど、小規模のシステムでコンテナを管理したい場合は、オープンソースソフトウェアのPortainerが便利です。
Portainerは、小さなコンテナ環境の管理にも対応しています。Docker単体、 Kubernetes、Nomadのデプロイが可能で、WebUIで簡単にコンテナの管理や監視を行うことができます。

デモのお申込み

もっと使い方が知りたい方へ
操作方法や操作性をデモにてご確認いただけます。使い方のイメージを把握したい、使えるか判断したい場合にご活用下さい。デモをご希望の方は、下記よりお申込みいただけます。

デモをご希望の方

デモの申し込みイメージ


OSS情報「Docker」

わかりやすいDocker入門の先頭へ