簡易 Apache Web サーバーをコンテナーに構築する

更新 -

コンテナーがどのように稼動するかを説明する際に、Web サーバーを例にあげる場合がよくあります。このガイドでは以下の手順について説明します。

  • コンテナー内に Apache (httpd) Web サーバーを構築する
  • ホストのポート 80 でサービスを公開する
  • 簡易な index.html ファイルを提供する
  • バックエンドサーバーからデータを表示する (こちらから入手できる追加の MariaDB コンテナーが必要です)

Apache Web サーバーコンテナーを作成して実行する

  1. システムをインストールする。docker パッケージを含む RHEL 7 または RHEL Atomic システムをインストールして、docker サービスを起動します。

  2. イメージを取得する。以下のコマンドを実行して rhel7 イメージを取得します。

    # docker pull rhel7:latest
    
  3. サポートファイルが含まれる tarball を取得する。このガイドに添付されている tarball ファイル (web_cont.tgz) をダウンロードします。新しい mywebcontainer ディレクトリーにダウンロードして、以下のように tar を展開してください。

    # mkdir ~/mywebcontainer
    # cp web_cont*.tgz ~/mywebcontainer
    # cd ~/mywebcontainer
    # tar xvf web_cont*.tgz
    action
    Dockerfile
    
  4. CGI スクリプト action を修正する。必要に応じて action ファイルを編集します。このファイルは、バックエンドデータベースサーバーコンテナーからデータを取得するのに使用します。このスクリプトでは、ホストシステムの docker0 インターフェイスの IP アドレスは 172.17.42.1、ログイン用のユーザーアカウントは dbuser1 、そのパスワードは redhat、そして使用するデータベースの名前は gss であると想定しています。IP アドレスに変更がなく、こちらで説明されているデータベースコンテナーをお使いの場合は、このスクリプトを変更する必要はありません。また、このスクリプトを使用せず、Web サーバーを使用して HTML コンテンツを使用することもできます。

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    import MySQLdb as mdb
    import os
    
    con = mdb.connect(os.getenv('DB_SERVICE_SERVICE_HOST','172.17.42.1'), 'dbuser1', 'redhat', 'gss')
    
    with con:
    
        cur = con.cursor()
        cur.execute("SELECT MESSAGE FROM atomic_training")
    
        rows = cur.fetchall()
    
        print 'Content-type:text/html\r\n\r\n'
        print '<html>'
        print '<head>'
        print '<title>My Application</title>'
        print '</head>'
        print '<body>'
    
        for row in rows:
            print '<h2>' + row[0] + '</h2>'
    
        print '</body>'
        print '</html>'
    
        con.close()
    
  5. Dockerfile を確認する。必要に応じて ~/mywebcontainer ディレクトリーにある Dockerfile ファイルを編集します (変更が必要なのはおそらく Maintainer_Name のみ)。以下は、そのファイルの内容です。

    # Webserver container with CGI python script
    # Using RHEL 7 base image and Apache Web server
    # Version 1
    
    # Pull the rhel image from the local repository
    FROM rhel7:latest
    USER root
    
    MAINTAINER Maintainer_Name
    
    # Fix per https://bugzilla.redhat.com/show_bug.cgi?id=1192200 
    RUN yum -y install deltarpm yum-utils --disablerepo=*-eus-* --disablerepo=*-htb-* \
        --disablerepo=*-ha-* --disablerepo=*-rt-* --disablerepo=*-lb-* --disablerepo=*-rs-* --disablerepo=*-sap-*
    
    RUN yum-config-manager --disable *-eus-* *-htb-* *-ha-* *-rt-* *-lb-* *-rs-* *-sap-* > /dev/null
    
    # Update image
    RUN yum update -y
    RUN yum install httpd procps-ng MySQL-python -y
    
    # Add configuration file
    ADD action /var/www/cgi-bin/action
    RUN echo "PassEnv DB_SERVICE_SERVICE_HOST" >> /etc/httpd/conf/httpd.conf
    RUN chown root:apache /var/www/cgi-bin/action
    RUN chmod 755 /var/www/cgi-bin/action
    RUN echo "The Web Server is Running" > /var/www/html/index.html
    EXPOSE 80
    
    # Start the service
    CMD ["-D", "FOREGROUND"]
    ENTRYPOINT ["/usr/sbin/httpd"]
    
  6. Web サーバーコンテナーを構築する。Dockerfile ファイルとその他のコンテンツを含むディレクトリーで、以下のコマンドを実行します。

    # docker build -t webwithdb .
    Sending build context to Docker daemon 4.096 kB
    Sending build context to Docker daemon
    Step 0 :FROM rhel7:latest
     ---> bef54b8f8a2f
    Step 1 :USER root
     ---> Running in 00c28d347131
     ---> cd7ef0fcaf55
    ...
    
  7. Web サーバーコンテナーを起動する。コンテナーイメージを起動するには、以下のコマンドを実行します。

    # docker run -d -p 80:80 --name=mywebwithdb webwithdb
    
  8. Web サーバーコンテナーをテストする。Web サーバーが動作していることを確認するには、以下に示す最初の curl コマンドを実行します。バックエンドデータベースコンテナーを実行している場合は、2 つ目のコマンドを実行します。

    # curl http://localhost/index.html
    The Web Server is Running
    # curl http://localhost/cgi-bin/action
    <html>
    <head>
    <title>My Application</title>
    </head>
    <body>
    <h2>RedHat rocks</h2>
    <h2>Success</h2>
    </body>
    </html>
    </tt></pre>
    

    ローカルホストに Web ブラウザーをインストールしている場合は、Web ブラウザーを開いて、出力がきちんと表示されていることを確認します。ブラウザーで http://localhost/cgi-bin/action を開きます。

コンテナーを使用するためのヒント

ここでは、Web サーバーコンテナーを使用するためのヒントを紹介します。

  • MariaDB を変更する。(Building a Simple Database Server in a Docker Container で説明されている) MariaDB コンテナーでこのコンテナーを使用するには、action スクリプトを編集し、IP アドレスを 172.17.42.1 から、docker0 インターフェイスのホスト IP に変更します。そのアドレスがホストにあることを確認するには、以下のコマンドを実行します。

    # ip a | grep docker0 | grep inet 
        inet 172.17.42.1/16 scope global docker0
    
  • コンテンツを追加する。docker run コマンドラインに -v オプションを使用すると、ローカルホストからマウントした自作のコンテンツを追加できます。たとえば、次のようになります。

    # docker run -d -p 80:80 -v /var/www/html:/var/www/html \
         --name=mywebwithdb webwithdb
    
  • コンテナーを編成する。その他のコンテナーと一緒にこのコンテナーを管理するには、Kubernetes を使用してポッドに編成することが推奨されます。Kubernetes を使用して、コンテナーを編成する方法については、以下のナレッジベースを参照してください。

Attachments