概要
Alpine Linux の Docker イメージのファイルサイズが Ubuntu や Debian よりもはるかに小さいので、ダウンロード時間やビルド時間の短縮が期待されます。一方で、2016年4月時点では主要な公式イメージの Alpine Linux 対応が進行中なので、すべてを置き換えることはできません。
Debian を対象とした docker-compose.yml の例はこちらの記事 (「Docker Compose で PHP 7.0 の開発環境を構築する」) をご参照ください。Vagrant Box で PHP の開発環境の構築に関して、こちらの記事をご参照ください。
Alpine Linux に Docker をインストールする
Alpine Linux をホスト OS として Docker をインストールしてみましょう。apk リポジトリを追加します。
http://dl-3.alpinelinux.org/alpine/edge/community
sudo apk update
sudo apk add docker
自動起動するサービスとして追加します。
sudo rc-update add docker boot
サービスを起動させます。
sudo service docker start
2016年4月時点で試したところ、Docker のデーモンがクラッシュするので、バイナリを直接インストールすることにしました。
まず前提要件となるパッケージ群をインストールします。
sudo apk add iptables git xz busybox musl
バイナリをダウンロードして展開した後でインストールします。
curl -O https://get.docker.com/builds/Linux/x86_64/docker-latest.tgz
tar -xvzf docker-latest.tgz
sudo mv docker/* /usr/bin/
デーモンを起動させます。
sudo docker daemon &
デーモンが起動しているか確認してみましょう。
sudo docker version
sudo を使わなくても実行できるように usermod を実行します。shadow パッケージを導入します。
sudo apk add shadow
パスワードは vagrant
です。
sudo usermod -aG docker vagrant
Alpine Linux に Docker Compose をインストールする
配布されているバイナリが動かなかったので、Python のパッケージマネジャーの pip でインストールしました。
sudo apk add py-pip
sudo pip install docker-compose
バージョンを確認してみましょう。
docker-compose version
Debian の Docker イメージをダウンロードする際に次のようなエラーに遭遇しました。
Docker pull issue (ApplyLayer exit status 1 stdout: stderr: chmod /bin/mount: permission denied)
対策として、次のコマンドを実行することで解決しました。
# http://forum.alpinelinux.org/forum/general-discussion/docker-pull-issue-applylayer-exit-status-1-stdout-stderr-chmod-binmount
sudo sysctl -w kernel.grsecurity.chroot_deny_chmod=0
Hello World を表示させる
Alpine Linux の公式イメージを動かしてみましょう。
docker run alpine /bin/echo 'Hello world'
タグでバージョンを指定することができます。
docker run alpine:3.3 /bin/echo 'Hello world'
ターミナルからコマンドを実行する
PHP のバージョンを表示させてみましょう。
docker run php:7.0-alpine php -v
今度はターミナルに入って php -v を実行してみます。
docker run -it php:7.0-alpine /bin/sh
# php -v
# exit
PHP のビルトインサーバーを起動させてみましょう。
docker run -it -p 80:80 php:7.0-alpine /bin/sh
cd home
echo test > index.html
echo "<?php phpinfo();" > index.php
php -S 0.0.0.0:80
PHP のビルトインサーバー
最初の Docker Compose の練習として PHP のビルトインサーバーに取り組んでみましょう。
version: '2'
services:
app:
image: alpine:3.3
volumes:
- ./www:/home
command: /bin/true
php:
image: php:7.0-alpine
expose:
- '80'
ports:
- '80:80'
volumes_from:
- app
working_dir: /home
command: php -S 0.0.0.0:80
www docker-compose.yml と同じディレクトリに www フォルダーを用意して PHP スクリプトを設置します。
サービスを起動させてみましょう。
docker-compose up -d
サービスの停止は次のとおりです。
docker-compose stop
Apache Httpd
まずは Httpd だけを動かしてみましょう。
version: '2'
services:
app:
image: alpine:3.4
volumes:
- ./www:/usr/local/apache2/htdocs/
command: /bin/true
httpd:
image: httpd:2.4-alpine
ports:
- '80:80'
volumes_from:
- app
今度は php-fpm と連携させてみましょう。
app:
image: alpine:3.4
volumes:
- ./www:/usr/local/apache2/htdocs
command: /bin/true
php:
image: php:7.1-fpm-alpine
ports:
- '9000:9000'
volumes_from:
- app
apache:
build: ./
ports:
- '80:80'
volumes_from:
- app
links:
- php
FROM httpd:2.4-alpine
RUN { \
echo 'LoadModule proxy_module modules/mod_proxy.so'; \
echo 'LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so'; \
echo ''; \
echo 'DirectoryIndex index.php index.html'; \
echo '<FilesMatch \.php$>'; \
echo ' CGIPassAuth On'; \
echo ' SetHandler "proxy:fcgi://php:9000"'; \
echo '</FilesMatch>'; \
} >> /usr/local/apache2/conf/httpd.conf
nginx
次に nginx を試してみましょう。最初は HTML ファイルだけを試してみましょう。
version: '2'
services:
app:
image: alpine:3.3
volumes:
- ./www:/usr/share/nginx/html
command: /bin/true
nginx:
image: nginx:1.9-alpine
ports:
- '80:80'
volumes_from:
- app
次に php-fpm と連携させて PHP スクリプトを実行できるようにします。
version: '2'
services:
app:
image: alpine:3.3
volumes:
- ./www:/usr/share/nginx/html
command: /bin/true
php:
image: php:7.0-fpm-alpine
ports:
- '9000:9000'
volumes_from:
- app
nginx:
build: ./
ports:
- '80:80'
links:
- php
volumes_from:
- app
FROM nginx:1.9-alpine
COPY default.conf /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
サービスを起動させる前に Docker イメージをビルドします。
docker-compose build
サービスを起動させるときにビルドを指定することもできます。
docker-compose up --build -d
サービスを起動している間に修正した設定ファイルを反映させるために、コンテナを再生成することもできます。
docker-compose up -d --force-recreate
h2o (HTTP サーバー)
h2o の公式サイトのリンクで示されている lkwg82/h2o-http2-server を試してみましょう (2016年4月時点)。
まずは HTML ファイルだけの場合です。
version: '2'
services:
app:
image: alpine:3.3
volumes:
- ./www:/var/www/html
command: /bin/true
h2o:
image: lkwg82/h2o-http2-server:v1.7.1
ports:
- '80:80'
volumes_from:
- app
今度は php-fpm に対応させてみましょう。
version: '2'
services:
app:
image: alpine:3.3
volumes:
- ./www:/var/www/html
command: /bin/true
php:
image: php:7.0-fpm-alpine
expose:
- '9000'
volumes_from:
- app
h2o:
image: lkwg82/h2o-http2-server:v1.7.1
ports:
- '80:80'
volumes:
- ./conf:/etc/h2o
volumes_from:
- app
file.custom-handler:
extension: .php
fastcgi.connect:
host: php
port: 9000
type: tcp
file.index:
['index.php', 'index.html']
hosts:
default:
listen:
port: 80
paths:
/:
file.dir: /var/www/html
access-log: /dev/stdout
error-log: /dev/stderr
h2o の Dockerfile は次のように用意することができる。
FROM lkwg82/h2o-http2-server:v1.7.1
COPY conf/h2o.conf /etc/h2o/h2o.conf
Dockerfile を使う場合、docker-compose.yml で build
プロパティで指定する。
services:
h2o:
build: ./
ports:
- '80:80'
volumes_from:
- app