Skip to content
Menu
プログラミング教室 M&Co.
  • はじめに
  • 当スクールの料金
プログラミング教室 M&Co.
2025年2月3日2025年2月3日

Dockerの基礎知識その2

前回から少し時間が空いてしまいました。ちょっと仕事が忙しくなってしまって。

記事を書くのは慣れないので、日課のようにはまだ書けそうもないです。

それでも続けていきたいと思います。

今回は、下記のことを書いてみます。

  • 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

起動はしているようです。

ブラウザからアクセスしてみます。

http://localhost:8080

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コンテナを起動させます。

お楽しみに。

©2025 プログラミング教室 M&Co.