前回から少し時間が空いてしまいました。ちょっと仕事が忙しくなってしまって。
記事を書くのは慣れないので、日課のようにはまだ書けそうもないです。
それでも続けていきたいと思います。
今回は、下記のことを書いてみます。
- Dockerビルド
- Dockerfile
Dockerのビルド
Dockerを起動するということは、Dockerコンテナを起動するということです。
Dockerコンテナを起動するためには、Dockerイメージが必要です。
Dockerのビルドは、Dockerイメージを作成するということです。
Dockerビルドをすることで、自分のオリジナルのイメージを作成することができます。
まずは、どんなイメージを作成するのかを考えてみましょう。
どんなDockerイメージを作成するか
このブログでは、Laravelを使ってWEBサービスを作成するという目標があります。
Laravelを動作させるためのDockerイメージを作成することを考えてみます。
必要なパッケージは、最低限下記のものが必要になると思います。
- WEBサーバー
- PHP
他にもDBやcomposerが動作できる環境が必要になっていきますが、まずは上記の2つが動作するDockerイメージを作成します。
ベースとなるイメージを選ぶ
Dockerイメージを作成するためには、親となるベースイメージを選択する必要があります。
さまざまな親イメージがありますが、今回はdebianを使ってみたいと思います。
もっとシンプルにscratchというイメージも試してみたかったんですが、本当に最低限のイメージになっていて、この記事が完成するのに一ヶ月かかりそうだと思ったのでやめました。
このdebianイメージを元に、必要なパッケージをインストールして、自分のイメージを作成していくことになります。
Dockerfile
ベースとなるイメージを決めたら、Dockerfileを作成しましょう。
このファイルにパッケージをインストールする命令を書いてDockerイメージを作っていきます。
Dockerfile
FROM debian
まずは、これだけ書いて見てください。
書いたら、このコマンドを実行してビルドしてみましょう。
% docker build -t my-php .
[+] Building 5.0s (5/5) FINISHED docker:desktop-linux
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 86B 0.0s
=> [internal] load metadata for docker.io/library/debian:latest 2.1s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [1/1] FROM docker.io/library/debian:latest@sha256:321341744acb788e251ebd374aecc1a42d60ce65da7bd4ee9207ff6be6686a62 1.4s
=> => resolve docker.io/library/debian:latest@sha256:321341744acb788e251ebd374aecc1a42d60ce65da7bd4ee9207ff6be6686a62 0.0s
=> => sha256:e474a4a4cbbfe5b308416796d99b79605bbfad6cb32ab1d94d61dc0585a907ea 48.31MB / 48.31MB 1.4s
=> exporting to image 2.8s
=> => exporting layers 0.0s
=> => exporting manifest sha256:b4c8611ed6d94e697662202313b519bfb0a386085cf2ea3449d286d531f721f3 0.0s
=> => exporting config sha256:a00c941adf5d95d7bdd66e523e9f58ed1fcbf1d60f34900a16832a119bf81494 0.0s
=> => exporting attestation manifest sha256:a8329860e70afec148f6b07354d434f74663e23d10bb82d311dc6096dbec89d3 0.0s
=> => exporting manifest list sha256:cec0b336726ac08dc98c90eb76fefe472b6e1681d406c3c7d0adcf6c09d8e043 0.0s
=> => naming to docker.io/library/my-php:latest 0.0s
=> => unpacking to docker.io/library/my-php:latest 2.7s
What's next:
View a summary of image vulnerabilities and recommendations → docker scout quickview
こんな感じでビルドが実行されます。
ビルドが完了したら、イメージを確認しましょう。
% docker images
my-php latest cec0b336726a 2 weeks ago 203MB
先ほど-tのオプションで指定したタグのmy-phpでイメージができていることが確認できます。
Dockerイメージが出来たので、Dockerコンテナを起動してみましょうか。
% docker run -it --rm my-php /bin/bash
root@95b3a599a57b:/#
これで、Dockerコンテナが起動して、bashでのログインができました。
bashは、Dockerコンテナの中で起動しているOSを操作するために使用する「ターミナル」です。
ターミナルの扱いにも慣れていきましょう。これは、また別の記事で説明します。
WEBサーバー Apacheのインストール
これでコンテナの中でいろんなことができる状態になったので、まずはWEBサーバーであるApacheをインストールします。
まずは、コンテナの内部のパッケージを最新の状態にします。
root@95b3a599a57b:/# apt update
Get:1 http://deb.debian.org/debian bookworm InRelease [151 kB]
Get:2 http://deb.debian.org/debian bookworm-updates InRelease [55.4 kB]
Get:3 http://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB]
Get:4 http://deb.debian.org/debian bookworm/main arm64 Packages [8693 kB]
Get:5 http://deb.debian.org/debian bookworm-updates/main arm64 Packages [13.3 kB]
Get:6 http://deb.debian.org/debian-security bookworm-security/main arm64 Packages [239 kB]
Fetched 9199 kB in 1s (6975 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.
Apacheのインストールには、aptコマンドを使用します。debianでは、パッケージの操作をするために、aptを使用します。
OSによってパッケージの操作方法が異なる場合があります。
apacheをインストールするために、パッケージ名が必要です。パッケージ名を探してみます。
root@95b3a599a57b:/# apt search apache
Sorting... Done
Full Text Search... Done
ant-contrib/stable 1.0~b3+svn177-12 all
collection of tasks, types and other tools for Apache Ant
apache2/stable,stable-security 2.4.62-1~deb12u2 arm64
Apache HTTP Server
apache2-bin/stable,stable-security 2.4.62-1~deb12u2 arm64
Apache HTTP Server (modules and other binary files)
apache2-data/stable,stable-security 2.4.62-1~deb12u2 all
Apache HTTP Server (common files)
apache2-dev/stable,stable-security 2.4.62-1~deb12u2 arm64
Apache HTTP Server (development headers)
apache2-doc/stable,stable-security 2.4.62-1~deb12u2 all
Apache HTTP Server (on-site documentation)
apache2-ssl-dev/stable,stable-security 2.4.62-1~deb12u2 arm64
Apache HTTP Server (mod_ssl development headers)
apache2-suexec-custom/stable,stable-security 2.4.62-1~deb12u2 arm64
Apache HTTP Server configurable suexec program for mod_suexec
apache2-suexec-pristine/stable,stable-security 2.4.62-1~deb12u2 arm64
…
…
何だか色々出てきますね。この中のどれかがapacheのパッケージです。
おそらくこれがapache本体です。
apache2/stable,stable-security 2.4.62-1~deb12u2 arm64
Apache HTTP Server
早速インストールしてみましょう。インストールはこちらのコマンドを実行します。
root@95b3a599a57b:/# apt-get install -y apache2/stable
…
…
Processing triggers for libc-bin (2.36-9+deb12u9) …
Processing triggers for ca-certificates (20230311) …
Updating certificates in /etc/ssl/certs…
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d…
done.
の表示があれば、インストール成功しています。
次は、PHPのインストールをします。これもパッケージ名が必要なので、同じく検索してみます。
php8.2/stable,stable-security 8.2.26-1~deb12u1 all
server-side, HTML-embedded scripting language (metapackage)
PHPもたくさんのパッケージが検索結果に表示されますが、必要なのはこれです。
root@95b3a599a57b:/# apt-get install -y php8.2/stable
invoke-rc.d: policy-rc.d denied execution of restart.
Setting up php8.2 (8.2.26-1~deb12u1) ...
Processing triggers for libc-bin (2.36-9+deb12u9) ...
Processing triggers for php8.2-cli (8.2.26-1~deb12u1) ...
Processing triggers for libapache2-mod-php8.2 (8.2.26-1~deb12u1) ...
これもインストール成功です。
ここまでの操作をまとめます。実行したのは下記の3つのコマンドです。
root@95b3a599a57b:/# apt update
root@95b3a599a57b:/# apt-get install -y apache2/stable
root@95b3a599a57b:/# apt-get install -y php8.2/stable
実際に実行したコマンドをDockerfileに記述します。
現在のDockerfileがこちらです。
FROM debian
RUN apt update
RUN apt-get install -y apache2/stable
RUN apt-get install -y php8.2/stable
さて、これでapacheからPHPを動作させることができるのか試してみます。
Ctrl + Dでコンテナを抜けてホスト(使用しているPC)に戻ります。
ビルドします。
% docker build -t my-php .
[+] Building 1.8s (5/5) FINISHED docker:desktop-linux
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 86B 0.0s
=> [internal] load metadata for docker.io/library/debian:latest 1.7s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> CACHED [1/1] FROM docker.io/library/debian:latest@sha256:321341744acb788e251ebd374aecc1a42d60ce65da7bd4ee9207ff6be6686a62 0.0s
=> => resolve docker.io/library/debian:latest@sha256:321341744acb788e251ebd374aecc1a42d60ce65da7bd4ee9207ff6be6686a62 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => exporting manifest sha256:b4c8611ed6d94e697662202313b519bfb0a386085cf2ea3449d286d531f721f3 0.0s
=> => exporting config sha256:a00c941adf5d95d7bdd66e523e9f58ed1fcbf1d60f34900a16832a119bf81494 0.0s
=> => exporting attestation manifest sha256:c4e51099e1faa236e703b4703e19b99fea288cf87cec7aa8025666cef6e6e929 0.0s
=> => exporting manifest list sha256:f9a6c7ab5611772c7a80cf65a03f591c3697af57fe14b9c127b17eea8878d583 0.0s
=> => naming to docker.io/library/my-php:latest 0.0s
=> => unpacking to docker.io/library/my-php:latest 0.0s
What's next:
View a summary of image vulnerabilities and recommendations → docker scout quickview
それでは起動させてみましょう。
% docker run my-php
どうですか?起動しましたか?
実はこのままだと起動はしますが、すぐに終了します。Dockerコンテナで何を実行するのかを指定していないことが原因です。
Dockerfileを修正して、Apacheを起動させます。
FROM debian
RUN apt update
RUN apt-get install -y apache2/stable
RUN apt-get install -y php8.2/stable
ENTRYPOINT ["/usr/local/bin/apachectl", "-DFOREGROUND"]
ビルドします。
% docker build -t my-php .
実行します。
% docker run -p 8080:80 my-php
別のターミナルを使って起動しているか確認します。
% docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fa33de421d21 my-php "/usr/sbin/apachectl…" About a minute ago Up About a minute 0.0.0.0:8080->80/tcp elated_raman
起動はしているようです。
ブラウザからアクセスしてみます。

apacheのデフォルトのhtmlが表示されました。
次は、phpが動かせるのか確認したいと思います。
PHPのファイルをコンテナ内に転送してみます。
転送するphpファイルは、この内容にしました。test.phpとして保存しています。
<?php
phpinfo();
?>
コンテナ内へのファイルの転送は、docker cpを使います。
まずは、コンテナのIDが必要です。先ほどのdocker psの内容から「fa33de421d21」がコンテナIDだということが分かります。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fa33de421d21 my-php "/usr/sbin/apachectl…" About a minute ago Up About a minute 0.0.0.0:8080->80/tcp elated_raman
それでは、コピーします。
% docker cp test.php fa33de421d21:/var/www/public_html
Successfully copied 2.05kB to fa33de421d21:/var/www/public_html
成功したようです。
それでは、ブラウザからアクセスしてみます。
http://localhost:8080/test.php

おぉ!動きました!
まさかこんな簡単に表示されるとは思わなかったので、驚きました。
ということで、PHPがApache上で動作するDockerイメージを作成することができました。
しばらくDockerの内容が続くと思います。
まとめ
今回は、Dockerビルドを実際に行ってPHPが動作するWEBサーバーのDockerイメージを作成しました。
何も設定ファイルを変更するなど、細かい操作はしてないですよね。
Dockerを使用すると、こんなに簡単に、短時間でサーバーを構築することができてしまいます。
コンテナの起動も非常に早いですよね。
まずは、一つDockerコンテナを起動させることができました。
実際のWEBアプリケーションでは、他にも必要なものがあります。
そうDBですね。これもDockerを使ってDBサーバーを起動させることができます。
次回は、DBサーバーのDockerコンテナを起動させます。
お楽しみに。