第15回 1つのDockerコンテナでサービスをたくさん動かすには?(基礎編)古賀政純の「攻めのITのためのDocker塾」(2/2 ページ)

» 2016年02月03日 08時00分 公開
前のページへ 1|2       

コンテナでサービスを起動させる方法

 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実践入門」などがある。趣味はレーシングカートとビリヤード。


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ