このドキュメントで説明されているソフトウェアはサポートされていないか、拡張サポートが提供されています。
現在サポートされているリリースにアップグレードすることをお薦めします。
この簡単な例では、コンテナ同士をリンクする方法を示します。 これを本番アプリケーションのベースとして使用することはお薦めしません。
次の例は、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: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