第15回 1つのDockerコンテナでサービスをたくさん動かすには?(基礎編):古賀政純の「攻めのITのためのDocker塾」(2/2 ページ)
サービスを稼働させる上で、ハイパーバイザ型の仮想化環境とDockerコンテナの環境では大きな違いがあります。まずは基礎知識から解説しましょう。
コンテナでサービスを起動させる方法
Dockerコンテナ内でsystemdなどのOS付属のサービス管理の仕組みを使用せずにサービスを起動させるには、どうすればよいのでしょうか。さまざまな方法が存在しますが、その中でも非常に単純なものが、「サービスのバイナリファイルを直接稼働させる」という方法です。例としてCentOS 7.xで稼働するApache Webサービスを提供するhttpdパッケージを取り上げてみます。
httpdパッケージは、バイナリファイルとして「/usr/sbin/httpd」が用意されています。これを起動することによって、コンテナでWebサービスを稼働させることができますが、連載の第9回でも取り上げたように、Dockerコンテナがすぐに終了しない仕組みが必要です。コンテナ上でのhttpdデーモンが起動後にコンテナがすぐに終了しない仕組みとしては、httpdデーモンをフォアグラウンドで起動するという方法があります。フォアグランドでhttpdが稼働し、コンテナはWebサービスをクライアントに提供し続けることができます。以下は、そのDockerfileの例です。
# mkdir /root/apache # cd /root/apache/ # vi Dockerfile FROM centos:centos7.2.1511 MAINTAINER Masazumi Koga ENV container docker ENV http_proxy http://proxy.yoursite.com:8080 ENV https_proxy http://proxy.yoursite.com:8080 RUN yum update -y && yum clean all RUN yum install -y iproute httpd && yum clean all RUN echo "Hello Apache." > /var/www/html/index.html EXPOSE 80 ENTRYPOINT ["/usr/sbin/httpd","-DFOREGROUND"]
Dockerfileの最下行にあるENTRYPOINTの行を見ると、httpdデーモンをフォアグラウンドで起動するように指定していることが分かります。このDockerfileをビルドし、コンテナweb0001を起動させてみましょう。
# docker build -f ./Dockerfile -t centos:c7apache01 --no-cache=false . # docker run -itd --name web0001 centos:c7apache01
Dockerfile内でENTRYPOINTを記述しておけば、docker run時にENTRYPOINTで指定したコマンドが実行されますので、今回の場合はdocker run時にコンテナ内で「/usr/sbin/httpd -DFOREGROUND」が実行されます。コンテナweb0001が正常に起動したら、コンテナweb0001で起動しているプロセスをホストOSから見てみましょう。
# docker exec -it web0001 ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 11:30 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 6 1 0 11:30 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 7 1 0 11:30 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 8 1 0 11:30 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 9 1 0 11:30 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 10 1 0 11:30 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND root 21 0 0 11:31 ? 00:00:00 ps -ef
httpdデーモンがフォアグラウンドで正常に起動していることが分かります。このように、DockerコンテナではOSが提供するsystemdなどを使用せずに、アプリケーションのバイナリを直接指定し、フォアグラウンドで稼働させることがよくあります。しかし、このDockerfileの記述は一つのコンテナで一つのサービスを稼働させる場合は問題ありませんが、複数のアプリケーションをサービスとして稼働させる場合には対応できません。
次はコンテナで複数のサービスを稼働させる具体的な方法をご紹介します。
(第16回はこちら)
古賀政純(こが・まさずみ)
日本ヒューレット・パッカード株式会社 オープンソース・Linuxテクノロジーエバンジェリスト。兵庫県伊丹市出身。1996年頃からオープンソースに携わる。2000年よりUNIXサーバーのSE及びスーパーコンピューターの並列計算プログラミング講師、SIを経験。2006年、米国ヒューレット・パッカードからLinux技術の伝道師として「OpenSource and Linux Ambassador Hall of Fame」を2年連続受賞。プリセールスMVPを4度受賞。現在は日本ヒューレット・パッカードにて、Linux、FreeBSD、Hadoop、Dockerなどのサーバー基盤のプリセールスSE、文書執筆を担当。Red Hat Certified Virtualization Administrator, Novell Certified Linux Professional, Red Hat Certified System Administrator in Red Hat OpenStack, Cloudera Certified Administrator for Apache Hadoopなどの技術者認定資格を保有。著書に「CentOS 7実践ガイド」「Ubuntu Server実践入門」などがある。趣味はレーシングカートとビリヤード。
関連記事
- 第9回 Dockerfileで“インフラストラクチャ・アズ・コード”を体験
“攻めのIT”を考える情シスリーダーが今後知っておくべき注目の技術「Docker」を基本から応用まで解説します。今回のテーマは「Dockerfileでインフラストラクチャ・アズ・コードを実体験」です。 - 第14回 「延命措置」で旧システムからDocker環境に移行する方法
古いIT資産をDocker環境へ移行するには多面的な検証が必要です。今回は「延命措置」のシナリオから、実際に古い物理サーバからDocker環境へ移行する手順を紹介します。 - 第13回 “根が深い”旧システムからDocker環境への移行をどうするか
いざ古い物理サーバや仮想化基盤からDocker環境に移行しようとすると、実に“根が深い”さまざまな課題に直面することになるでしょう。Dockerへの移行について知っておくべき必要最低限のポイントを解説します。 - 【古賀政純の「攻めのITのためのDocker塾」】バックナンバー
Copyright © ITmedia, Inc. All Rights Reserved.