はじめに
かなり期間が空いてしましましたが、
ローカル環境にVirtualBoxを使用して開発環境を構築する作業の3回目です。
前々回はDBサーバ、
前回はWEBサーバを構築しました。
今回は、DBサーバ+WEBサーバ+PHPアプリの環境を構築します。
イメージとしては、DBの値を取得して、WEBサーバ上にPHPで表示します。
作業環境
- MacOS X Yosemite 10.10.5
1.Docker Compose
今回は「Docker Compose」を使用して、複数のサーバを一度に操作する手順でまとめます。
インストール手順は、公式サイトの手順を参考に実施してください。
2.ディレクトリ構成
今回は以下の構成で各ファイルを用意しました。
docker-php-postgres
┣ docker-compose.yml // Docker Composeの設定ファイル(3.参照)
┣ docker-file
┃ ┣ db
┃ ┃ ┣ Dockerfile // DBサーバ用のDockerfile(4.参照)
┃ ┃ ┣ docker-entrypoint-initdb.d
┃ ┃ ┣ 01_createdb.sql // DB作成用SQL
┃ ┣ web
┃ ┣ Dockerfile // WEBサーバ用のDockerfile(6.参照)
┃ ┣ php.ini // PHP設定ファイル(7.参照)
┣ volumes
┣ web
┣ html
┣ index.php // PHPファイル(8.参照)
3. docker-compose.yml
version: '3'
services:
web:
build: ./docker-file/web/
ports:
- 8080:80
volumes:
- ./volumes/web/html/:/var/www/html:z // :zを忘れないように。
depends_on:
- db
db:
build: ./docker-file/db/
ports:
- 5432:5432
environment:
- POSTGRES_USER=testuser
- POSTGRES_PASSWORD=password
4. DBサーバ用Dockerfile
FROM postgres:9.3
RUN apt-get update
RUN apt-get install -y vim less
COPY ./docker-entrypoint-initdb.d/01_createdb.sql /docker-entrypoint-initdb.d/
EXPOSE 5432
5. DB作成用SQL
DB作成用SQLとテーブル作成SQLファイルをdocker-entrypoint-initdb.d配下に作成します。
今回は「01_createdb.sql」という名称で
testdbというDB、test_tableというテーブルを作成します。
test_tableテーブルには、idカラムとkeywordカラムを用意して、
適当な値を設定しておきます。
6. WEBサーバ用Dockerfile
# Apache モジュールが同梱された PHP コンテナイメージ
FROM php:apache
RUN apt-get update
RUN apt-get install -y vim less
# Postgres関連のPHPエクステンションをインストール
RUN set -ex apk --no-cache add postgresql-dev libpq-dev
RUN apt-get install -y libpq-dev && docker-php-ext-install pdo pdo_pgsql pgsql mbstring
# PHPの設定ファイルをコピー
COPY ./php.ini /usr/local/etc/php/
7. PHP設定ファイル
[Core]
display_errors = On
error_reporting = E_ALL
error_log = /var/log/apache2/error.log
log_errors = On
[Date]
date.timezone = 'Asia/Tokyo'
[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = auto
mbstring.http_input = auto
mbstring.http_output = auto
mbsting.encoding_translation = Off
mbstring.detect_order = auto
8. PHPファイル
DBのテーブル内容を取得して、出力する単純なPHPファイルです。
$conn = "host=docker-php-postgres_db_1 port=5432 dbname=testdb user=testuser password=password";
$link = pg_connect($conn);
if (!$link) {
exit('接続失敗です。'.pg_last_error());
}
pg_set_client_encoding("sjis");
$result = pg_query('SELECT id, keyword FROM test_table');
if (!$result) {
exit('クエリーが失敗しました。'.pg_last_error());
}
for ($i = 0 ; $i < pg_num_rows($result) ; $i++){
$rows = pg_fetch_array($result, NULL, PGSQL_ASSOC);
print('id='.$rows['id']);
print(',keyword='.$rows['keyword'].'<br>');
}
$close_flag = pg_close($link);
if (!$close_flag){
print('切断に失敗しました。<br>');
}
?>
</body>
</html>
9. コンテナ起動
3.〜8. のファイルが準備でき次第、以下のコマンドを実行します。
このコマンドはビルドまで行ってくれます。
$ docker-compose up -d
ビルドのみ行いたい場合は、以下のコマンドを実行します。
$ docker-compose build
コマンドを実行した後、コンテナが起動したかどうかを以下のコマンドで確認します。
$ docker-compose ps
root@localhost docker-php-postgres]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f078f9167ad6 docker-php-postgres_web "docker-php-entryp..." 41 seconds ago Up 36 seconds 0.0.0.0:8080->80/tcp docker-php-postgres_web_1
c51a280c6d44 docker-php-postgres_db "docker-entrypoint..." 45 seconds ago Up 41 seconds 0.0.0.0:5432->5432/tcp docker-php-postgres_db_1
起動ができたら、ブラウザから起動したWEBサーバのindex.phpにアクセスしてみます。
アクセスして、テーブルの内容が表示されていたら、完了です。
http://【VirtualBox IPアドレス】:8080/index.php
10. コンテナの停止
コンテナの停止は以下のコマンドを実行します。
$ docker-compose stop
これでDBサーバ+WEBサーバ+PHPアプリの環境を構築できました。
今回の学習したものをベースに、
dockerを使用した様々な環境構築を実施していきたいと思っています。
参考URL
https://www.key-p.com/blog/staff/archives/106755
https://docs.docker.com/compose/install/
https://qiita.com/uhooi/items/fb14d99d3323bd2eee9d
https://mizominton.hatenablog.jp/entry/docker-cakephp1.3
https://qiita.com/nagi244/items/e5de6fc062fdcc5004e9