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で“インフラストラクチャ・アズ・コード”を体験
第14回 「延命措置」で旧システムからDocker環境に移行する方法
第13回 “根が深い”旧システムからDocker環境への移行をどうするかCopyright © ITmedia, Inc. All Rights Reserved.