このドキュメントで説明されているソフトウェアはサポートされていないか、拡張サポートが提供されています。
現在サポートされているリリースにアップグレードすることをお薦めします。
この簡単な例では、コンテナ同士をリンクする方法を示します。 これを本番アプリケーションのベースとして使用することはお薦めしません。
次の例は、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/mysqlのmy.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/mysqlのrun.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:v1ba8816c540513a892aa89828b5cf33464a7bb4616b56177266033d3311d0e00d
次に、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:v3ba8816c540513a892aa89828b5cf33464a7bb4616b56177266033d3311d0e00d
最後に、curlを使用して、データベースでのCGIスクリプトの動作をテストします。
$curl http://10.0.0.2/cgi-bin/version.plVersion = 5.1.73-log $curl http://10.0.0.2/cgi-bin/initdb.plRows 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?30Selected 2 row(s) with 3 field(s) 1 Alice 42 5 Eddie 35 $curl http://10.0.0.2/cgi-bin/doquery.pl?21Selected 4 row(s) with 3 field(s) 1 Alice 42 2 Bobby 27 3 Carol 29 5 Eddie 35

