第2章 コンテナーの使用方法

2.1. Apache Web Server コンテナーのインストールおよびデプロイ

2.1.1. 概要

コンテナーがどのように機能するかを説明する際に、Web サーバーを例に挙げることがよくあります。このトピックでは以下の手順について説明します。

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

2.1.2. Apache Web Server コンテナーの作成および実行

  1. システムのインストール: docker パッケージを含む RHEL 7 または RHEL Atomic システムをインストールして、docker サービスを起動します。
  2. イメージの取得: 以下のコマンドを実行して rhel7 イメージを取得します。

    # docker pull rhel7:latest
  3. サポートファイルが含まれる tarball の取得: 本書に添付されている tarball ファイル (web_cont_2.tgz) をダウンロードします。新規の mywebcontainer ディレクトリーにダウンロードして、以下のように untar を実行します。

    # 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 registry
    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-* \n    --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 ブラウザーを開いて、出力内の数行がきちんと表示されていることを確認します。ブラウザーで以下の URL を開きます。 http://localhost/cgi-bin/action

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

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

  • MariaDB の変更: 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 \n     --name=mywebwithdb webwithdb

2.1.4. 添付ファイル

2.2. MariaDB コンテナーのインストールおよびデプロイ

2.2.1. 概要

MariaDB を使用して、他のアプリケーションからアクセスできる基本的なデータベースをコンテナーにセットアップすることができます。本書では以下の手順について説明します。

  • docker フォーマットのコンテナーに MariaDB データベースサーバーを構築する
  • ホストのポート 3306 でサービスを公開する
  • データベースサービスを起動して情報を共有する
  • Web サーバーからデータベースをクエリーするためのスクリプトを実行できるようにする (後述の追加 Web サーバーコンテナーが必要)
  • このコンテナーを使用し、拡張するためのヒント

2.2.2. MariaDB データベースサーバーコンテナーの作成および実行

  1. システムのインストール: docker パッケージを含む Red Hat Enterprise Linux 7 または Red Hat Enterprise Linux Atomic Host システムをインストールし、docker サービスを起動します。
  2. イメージの取得: 以下のコマンドを実行して rhel7 イメージを取得します。

    # docker pull rhel7:latest
  3. サポートファイルが含まれる tarball の取得: 本書に添付されている tarball ファイル (mariadb_cont.tgz) をダウンロードします。新規の mydbcontainer ディレクトリーにダウンロードして、以下のように untar を実行します。

    # mkdir ~/mydbcontainer
    # cp mariadb_cont*.tgz ~/mydbcontainer
    # cd ~/mydbcontainer
    # tar xvf mariadb_cont*.tgz
    gss_db.sql
    Dockerfile
  4. Dockerfile の確認: ~/mydbcontainer ディレクトリーにある Dockerfile ファイルを随時変更します (おそらく変更が必要なのは、名前を追加する際の Maintainer_Name のみ)。以下は、そのファイルの内容です。

    # Database container with simple data for a Web application
    # Using RHEL 7 base image and MariahDB database
    # Version 1
    
    # Pull the rhel image from the local registry
    FROM rhel7:latest
    USER root
    
    MAINTAINER Maintainer_Name
    
    # Update image
    RUN yum update -y
    
    # Add Mariahdb software
    RUN yum -y install mariadb-server
    
    # Set up Mariahdb database
    ADD gss_db.sql /tmp/gss_db.sql
    RUN /usr/libexec/mariadb-prepare-db-dir
    RUN /usr/bin/mysqld_safe --basedir=/usr & \n    sleep 10s && \n /usr/bin/mysqladmin -u root password 'redhat' && \n    mysql --user=root --password=redhat < /tmp/gss_db.sql && \n    mysqladmin shutdown --password=redhat
    
    # Expose Mysql port 3306
    EXPOSE 3306
    
    # Start the service
    CMD ["--basedir=/usr"]
    ENTRYPOINT ["/usr/bin/mysqld_safe"]
  5. データベースサーバーコンテナーの構築: Dockerfile ファイルとその他のコンテンツを含むディレクトリーで、以下のコマンドを実行します。

    # docker build -t dbforweb .
    Sending build context to Docker daemon 528.4 kB
    Sending build context to Docker daemon
    Step 0 : FROM rhel7:latest
     ---> bef54b8f8a2f
    Step 1 : USER root
    ...
  6. データベースサーバーコンテナーの起動: コンテナーイメージを起動するには、以下のコマンドを実行します。

    # docker run -d -p 3306:3306 --name=mydbforweb dbforweb
  7. データベースサーバーコンテナーのテスト: たとえば、ホストの docker0 インターフェースが 172.17.42.1 の場合 (これと異なる場合もある)、以下のように nc コマンド (RHEL 7 の場合は yum install nc と入力する) を実行して、データベースコンテナーが動作することを確認します。

    # nc -v 172.17.42.1 3306
    Ncat: Version 6.40 ( http://nmap.org/ncat )
    Ncat: Connected to 172.17.42.1:3306.
    R
    5.5.40-MariaDB?acL3YF31?X?FWbiiTIO2Kd6mysql_native_password Ctrl-C

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

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

  • 独自のデータベースの追加: お使いのデータベースファイルをビルドディレクトリーにコピーし、データベースファイル名を gss_db.sql からお使いのデータベース名に (Dockerfile ファイル内の複数箇所で) 変更することにより、独自の MariaDB コンテンツを組み込むことができます。
  • コンテナーのオーケストレーション:このコンテナーを他のコンテナーと共に管理する効果的な方法として、Kubernetes を使用して Pod にそれらをオーケストレーションすることができます。

2.2.4. 添付ファイル