このドキュメントで説明されているソフトウェアはサポートされていないか、拡張サポートが提供されています。
現在サポートされているリリースにアップグレードすることをお薦めします。

4.6.1 データベース・コンテナとHTTPサーバー・コンテナとのリンクの作成例

注意

この簡単な例では、コンテナ同士をリンクする方法を示します。 これを本番アプリケーションのベースとして使用することはお薦めしません。

次の例は、MySQLサーバーを実行しているコンテナとHTTPサーバーを実行しているコンテナをリンクする方法を示しています。

最初にMySQLサーバー用にDockerfileを定義し、これを/var/docker_projects/mymod/mysqlディレクトリに配置します。

FROM oraclelinux:6
ENV http_proxy http://proxy.example.com:80
RUN yum install -y mysql-server
ADD my.cnf /etc/my.cnf
ADD run.sh /opt/run.sh
RUN chmod 744 /opt/run.sh
ENTRYPOINT /opt/run.sh

次の命令キーワードで、イメージの作成方法を定義します。

ADD

my.cnfおよびrun.shの各ファイルを/var/docker_projects/mymod/mysqlディレクトリからコンテナ内の/etc/my.cnfおよび/opt/run.shにコピーします。

ENTRYPOINT

コンテナで常に/opt/run.shを実行するように指定します。

ENV

(/etc/yum.confを変更するかわりに)ビルド環境のWebプロキシを定義します。

FROM

oraclelinux:6を新しいイメージのベースとして定義します。

RUN

mysql-serverパッケージをインストールして、/opt/run.shスクリプトを実行可能にします。

/var/docker_projects/mymod/mysqlmy.cnfファイルには、データベース構成が含まれています。

[mysqld]
bind-address=0.0.0.0

console=1
general_log=1
general_log_file=/dev/stdout
log_error=/dev/stderr

collation-server=utf8_unicode_ci
character-set-server=utf8

datadir=/var/lib/mysql

/var/docker_projects/mymod/mysqlrun.shファイルには、データベースを起動するシェル・スクリプトが含まれています。

#!/bin/bash

chown -R mysql:mysql /var/lib/mysql

mysql_install_db --user=mysql > /dev/null

/usr/libexec/mysqld --user mysql --bootstrap << SQL
    FLUSH PRIVILEGES;
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
    CREATE USER dbuser IDENTIFIED BY 'secret';
    CREATE DATABASE MYDB;
    USE MYDB;
    GRANT ALL ON MYDB.* to 'dbuser'@'%';

SQL

/usr/bin/mysqld_safe --user mysql

これで、Dockerfileとmy.cnfおよびrun.shの各ファイルが設定されたので、イメージmymod/mysql:v1をビルドして、このコンテナのインスタンスをdbという名前で作成し、標準のMySQL接続ポート(3306)を使用します。

# docker build --tag="mymod/mysql:v1" /var/docker_projects/mymod/mysql/
Uploading context  5.12 kB
Uploading context
Step 0 : FROM oraclelinux:6
 ---> d56e767abb61
Step 1 : ENV http_proxy  http://proxy.example.com:80
 ---> Running in 2d6ad386263d
 ---> f92df8c449eb
...
Step 6 : ENTRYPOINT /opt/run.sh
 ---> Running in 61e7e5bab9a1
 ---> 54b6e9473375
Removing intermediate container 61e7e5bab9a1
Successfully built 54b6e9473375
# docker run -d --name db -p 3306:3306 mymod/mysql:v1
ba8816c540513a892aa89828b5cf33464a7bb4616b56177266033d3311d0e00d

次に、HTTPサーバー用にDockerfileを定義し、これを/var/docker_projects/mymod/httpd2ディレクトリに配置します。

FROM oraclelinux:6
ENV http_proxy http://proxy.example.com:80
RUN yum install -y httpd perl perl-DBI.x86_64 libdbi-dbd-mysql.x86_64 perl-DBD-MySQL.x86_64
ADD version.pl /var/www/cgi-bin/version.pl
RUN chmod 755 /var/www/cgi-bin/version.pl
ADD initdb.pl /var/www/cgi-bin/initdb.pl
RUN chmod 755 /var/www/cgi-bin/initdb.pl
ADD doquery.pl /var/www/cgi-bin/doquery.pl
RUN chmod 755 /var/www/cgi-bin/doquery.pl
RUN sed -i -e '/<Directory "\/var\/www\/cgi-bin">/,/<\/Directory>/c\\\
<Directory "/var/www/cgi-bin">\n\
    Options +ExecCGI\n\
    AddHandler cgi-script .pl .cgi\n\
</Directory>' /etc/httpd/conf/httpd.conf
EXPOSE 80
ENTRYPOINT /usr/sbin/httpd -D FOREGROUND

このDockerfileでは、コンテナのHTTPサーバーの構成ファイル(/etc/httpd/conf/httpd.conf)を変更してCGIスクリプトの使用を許可し、次のPerlスクリプトを/var/docker_projects/mymod/httpd2ディレクトリからインストールします。

version.pl

データベースに接続してそのバージョンを返します。

#!/usr/bin/perl
use DBI;

print "Content-type: text/html\n\n";
my $dbh = DBI->connect(          
    "dbi:mysql:dbname=MYDB:host=db",
    "dbuser",                          
    "secret",                          
    { RaiseError => 1 },         
) or die $DBI::errstr;

my $sth = $dbh->prepare("SELECT VERSION()");
$sth->execute();

my $ver = $sth->fetch();
print "Version = ", @$ver, "\n";

$sth->finish();
$dbh->disconnect();
initdb.pl

データベースを設定して、表にいくつかのエントリを移入します。

#!/usr/bin/perl
use strict;
use DBI;

print "Content-type: text/html\n\n";
my $dbh = DBI->connect(
    "dbi:mysql:dbname=MYDB:host=db",
    "dbuser",
    "secret",
    { RaiseError => 1}
) or die $DBI::errstr;

$dbh->do("DROP TABLE IF EXISTS PEOPLE");
$dbh->do("CREATE TABLE People(Id INT PRIMARY KEY, Name TEXT, Age INT) ENGINE=InnoDB");
$dbh->do("INSERT INTO People VALUES(1,'Alice',42)");
$dbh->do("INSERT INTO People VALUES(2,'Bobby',27)");
$dbh->do("INSERT INTO People VALUES(3,'Carol',29)");
$dbh->do("INSERT INTO People VALUES(4,'Daisy',20)");
$dbh->do("INSERT INTO People VALUES(5,'Eddie',35)");
$dbh->do("INSERT INTO People VALUES(6,'Frank',21)");

my @noerr = ('Rows inserted in People table');
print @noerr;
print "\n";

my $sth = $dbh->prepare( "SELECT * FROM People" );
$sth->execute();
 
for ( 1 .. $sth->rows() ) {
    my ($id, $name, $age) = $sth->fetchrow();
    print "$id $name $age\n";
}

$sth->finish();
$dbh->disconnect();
doquery.pl

コマンド引数を問合せのデータとして使用し、データベースに対して簡単な問合せを実行します。

#!/usr/bin/perl
use strict;
use DBI;

print "Content-type: text/html\n\n";
my $dbh = DBI->connect(          
    "dbi:mysql:dbname=MYDB;host=db",
    "dbuser",                         
    "secret",                          
    { RaiseError => 1 },
) or die $DBI::errstr;

my $sth = $dbh->prepare( "SELECT * FROM People WHERE Age > $ARGV[0]" );
$sth->execute();

my $fields = $sth->{NUM_OF_FIELDS};
my $rows = $sth->rows();
print "Selected $rows row(s) with $fields field(s)\n";

for ( 1 .. $rows ) {
  my ($id, $name, $age) = $sth->fetchrow();
  print "$id $name $age\n";
}

$sth->finish();
$dbh->disconnect();

これで、DockerfileとPerlスクリプトが設定されたので、イメージmymod/httpd:v3をビルドして、このコンテナのインスタンスをwebという名前で作成し、ホストの標準のHTTP接続ポート(80)を使用してdbコンテナにリンクします。

# docker build --tag="mymod/httpd:v3" /var/docker_projects/mymod/httpd2/
Uploading context 142.8 kB
Uploading context 
Step 0 : FROM oraclelinux:6
 ---> d56e767abb61
Step 1 : ENV http_proxy  http://proxy.example.com:80
 ---> Using cache
 ---> f92df8c449eb
...
Step 11 : ENTRYPOINT /usr/sbin/httpd -D FOREGROUND
 ---> Running in 3203c57a7204
 ---> 10dc2d7624d3
Removing intermediate container 3203c57a7204
Successfully built 10dc2d7624d3
# docker run -d --name web -p 80:80 --link db:db mymod/httpd:v3
ba8816c540513a892aa89828b5cf33464a7bb4616b56177266033d3311d0e00d

最後に、curlを使用して、データベースでのCGIスクリプトの動作をテストします。

$ curl http://10.0.0.2/cgi-bin/version.pl
Version = 5.1.73-log
$ curl http://10.0.0.2/cgi-bin/initdb.pl
Rows inserted in People table
1 Alice 42
2 Bobby 27
3 Carol 29
4 Daisy 20
5 Eddie 35
6 Frank 21
$ curl http://10.0.0.2/cgi-bin/doquery.pl?30
Selected 2 row(s) with 3 field(s)
1 Alice 42
5 Eddie 35
$ curl http://10.0.0.2/cgi-bin/doquery.pl?21
Selected 4 row(s) with 3 field(s)
1 Alice 42
2 Bobby 27
3 Carol 29
5 Eddie 35