dockerfileを使わずにDockerイメージを作成する (Ubuntu+Apache+PHP)

Docker公式ロゴ1a
©2023 Docker Inc. All rights reserved

 通常Dockerイメージを作成する場合は、dockerfileというDockerイメージの構成情報が記載されたファイルを使用します。

 dockerfileに、ひな型となるDockerイメージや組み込むソフトウエア、開放するネットワークポートなどを記述しますと、Dockerイメージ作成を自動化することが可能です。

 実際にdockerfileを作られたことのある方はご理解いただけると思いますが、ファイルの中身は定義ファイルのように設定値を定義するイメージではなく、ソフトウエアのセットアップを行うLinuxコマンドを羅列する形式で記述していきます。

 ですので、dockerfileを作成する場合、事前準備としまして、ひな型となるDockerイメージに実際にセットアップを行い、その過程を把握しておく必要があります。

 本記事では、dockerfileを作成する事前準備の過程をご理解いただくため、dockerfileを使用せずにDockerイメージを作成します。

 本記事の内容と同じことをdockerfileを使用して行うことはもちろん可能ですが、それに関しましては別記事「Dockerfileを使用したDockerイメージの作成」を準備しましたので、そちらをご覧ください。

 なお、以下で作成しますのは、ApacheとPHPがインストールされているDockerイメージになります。

本記事は、Apache+PHPを使用した実用できる環境の構築が目的ではなくて、Dockerイメージの作成方法の解説を行うためのものです。

ApacheやPHPは、DockerHub上に公式イメージが公開されておりますが、同じ理由により使用しません。

利用するUbuntuやApache、PHPなどは、最新版ではなくてデフォルトでインストール可能なものになります。

本記事を参考にして構築した環境は、セキュリティ的に問題があることもありますので、本番環境などでご利用にならないでください。

検証目的でのご利用をお願いいたします。

Dockerイメージの構成概要

 本記事で作成しますDockerイメージの構成概要をご紹介します。

 Dockerイメージ内には、WebサービスとしましてApacheをセットアップしました。

 また、PHPもインストールして、Apache内で実行可能となるように設定を行います。

 作成したDockerイメージから起動されたDockerコンテナの構成は、以下のとおりです。

docker-imege5

 作成するDockerイメージの構成一覧を示します。

名称内容備考
ベースイメージUbuntuの公式Dockerイメージバージョンは20.04.2
WebサーバApacheバージョンは2.4.41
PHPPHPバージョンは7.4.3
WebアプリケーションPHP言語にて作成稼働サーバのIPアドレスおよ
びホスト名を出力する機能
ネットワーク

Dockerイメージではポート
設定は行わない

Dockerコンテナ起動時に内部
の80番ポートをDockerホスト
の8080番ポートに接続して使
用する

Dockerイメージ作成作業の流れ

 作業は以下の流れで進めていきます。

  1. ベースイメージの取得
  2. Ubuntuコンテナの起動
  3. UbuntuコンテナにApacheをインストール
  4. UbuntuコンテナにPHPをインストール
  5. Ubuntu+PHPコンテナのイメージの作成
  6. Ubuntu+PHPコンテナの起動
  7. PHPアプリケーションのインストール
  8. 動作確認

Dockerイメージの作成

 以下の作業はroot、もしくはDocker管理ユーザ(Dockerグループに所属しているユーザ)で行ってください。

1.ベースイメージの取得

 まずは、作成するDockerコンテナのベースとなるOSのイメージを入手する必要があります。

 以下のコマンドにてUbuntuの公式Dockerイメージの最新版を取得しましょう。

※既にUbuntuの公式Dockerイメージをお持ちの場合は、本手順は省略可能です。

$ docker pull ubuntu:20.04

※次節で使用していますdocker runコマンドでもUbuntuのDockerイメージを入手可能ですが、docker pullコマンドのご紹介のためこの手順を入れました

 以下のコマンドで、取得したイメージを確認します。

$ docker images

 以下のような内容が出力されます。

REPOSITORY TAG    IMAGE ID       CREATED         SIZE
ubuntu     20.04  a0ce5a295b63   37 hours ago    72.8MB

2.Ubuntuコンテナの起動

 以下のコマンドで、取得したUbuntuイメージを実行します。

$ docker run -dit --init ubuntu:20.04

 これで、UbuntuのDockerコンテナが起動されました。

 以下のコマンドで、起動されているDockerコンテナを確認します。

$ docker ps

 以下のような内容が出力されます。

CONTAINER ID  IMAGE         COMMAND CREATED        STATUS        PORTS NAMES
ecb096b958a5  ubuntu:20.04  "bash"  20 seconds ago Up 19 seconds       distracted_lalande

「IMAGE」の部分に「ubuntu」と表示されているのが確認できると思います。

 UbuntuコンテナにApacheをインストールするためには、起動したCentOSコンテナ内でシェルを起動して、そのシェルでコマンドを実行する必要があります。

 しかし、Ubuntu内にはsshなどのリモートログイン用のサービスは起動されてないですし、ログインサービス自体も起動されてません。

 Dockerコンテナ内でシェルを起動し、そのシェルとコマンドのやりとりを可能にするためには、以下のコマンドを実行します。

$ docker exec -it <コンテナID> bash

 <コンテナID>の部分には、Dockerコンテナ起動時にユニークに割り振られる<コンテナID>を指定します。

<コンテナID>は「docker ps」コマンドにて確認できます。

 少し前に、起動したコンテナの確認を行いましたので、自分のDocker環境でのUbuntuのコンテナIDは既に出力されていると思います。

 私の場合は、「ecb096b958a5」でしたので、以下のコマンドを実行します。各自コンテナIDの部分を変更して実行してください。

$ docker exec -it ecb096b958a5 bash

 実行すると、プロンプトが変わったと思います。

 私の場合は以下の通りです。

[root@ecb096b958a5 /]#

 このプロンプトは、Ubuntuコンテナ内で実行されているシェルのプロンプトです。

 これで、Ubuntuコンテナにログインしたのと同じ状態になりました。

3.UbuntuコンテナにApacheをインストール

 起動したUbuntuコンテナにApacheをインストールします。

 ここからは、LinuxにApacheをインストールされた経験のある方は、いつもどおりのLinux(今回はUbuntu)内のオペレーションを行っていただければと思います。

 以下のコマンドでApacheをインストールします。

# apt update
# apt install apache2
※途中でTime Zone設定を行う場合があります

 これでUbuntuコンテナへのApacheのインストールは終わりです。

 簡単に動作確認を行います。

 以下のコマンドでApacheを起動しましょう。

# apachectl start

 起動時に以下のような名前解決関係のメッセージが出力されるかもしれませんが、Apacheの起動には問題ありませんので、無視で大丈夫です。

AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message

 psコマンドでプロセスが起動されているか確認してください。

# ps -ef

 起動されている場合は以下のように出力されます。

UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 20:33 pts/0    00:00:00 /sbin/docker-init -- bash
root           7       1  0 20:33 pts/0    00:00:00 bash
root          10       0  0 20:34 pts/1    00:00:00 bash
root        3357       1  0 20:36 ?        00:00:00 /usr/sbin/apache2 -k start
www-data    3358    3357  0 20:36 ?        00:00:00 /usr/sbin/apache2 -k start
www-data    3359    3357  0 20:36 ?        00:00:00 /usr/sbin/apache2 -k start

 起動したapacheが複数起動されていることが確認できました。

 httpによる動作確認は、PHPアプリケーションの動作確認と合わせて行いますので、ここでは省略させて下さい。

4.UbuntuコンテナにPHPをインストール

 UbuntuコンテナにApacheをインストールしましたので、次はPHPをインストールします。

# apt install php

 念のため、起動確認します。

# php -v

 以下のようなPHPのバージョン情報が表示されたかと思います。(2022年9月時点)

PHP 7.4.3 (cli) (built: Jun 13 2022 13:43:30) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies

 一旦Dockerホストに戻って、Ubuntuコンテナを停止します。

 次の手順でDockerイメージの作成を行いますので、静的なイメージを取得するという意味での停止になります。

 「exit」コマンドで戻れます。

# exit

 「docker ps」コマンドでUbuntuコンテナのコンテナIDを確認し、続けて「docker stop」コマンドでUbuntuコンテナを停止します。

$ docker ps
$ docker stop <コンテナID>

 これでPHPのインストールまで完了しました。

5.Apache+PHPコンテナのイメージの作成

 これまで、Ubuntuイメージを起動して、そこにApacheとPHPをインストールしました。

 しかし、Ubuntuコンテナの環境設定を変更したり、不測の事態が発生してUbuntuコンテナが壊れてしまったなどの場合、イメージとしてはUbuntuイメージしか残っていないので、また再度ApacheとPHPのインストールを行わなければいけなくなります。

 また、同じコンテナを別のDockerホスト上で起動する場合も、また再度インストール作業を行う必要が出てきます。

 でも、現状のUbuntuコンテナの内容を基に新しいイメージを作成しておきますと、いつでも必要な時に現状の状態のDockerコンテナを作成することが可能になります。

 以下のコマンドを実行すると、指定したDockerコンテナの内容が、イメージとして保存されます。

$ docker commit <保存するDockerコンテナのコンテナID> <イメージ名>

 例えば、私が今回作成したDockerコンテナを、新しいイメージ名「my-httpd-php」として保存する場合は、

$ docker commit c1dc73608166 my-httpd-php

を実行します。

 「docker images」コマンドでDockerイメージの一覧を出力し、保存したDockerイメージが存在するか確認してみてください。

$ docker images
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
my-httpd-php  latest    df2b8a511068   10 seconds ago   243MB

6.Apache+PHPコンテナの起動

 では、今保存したDockerコンテナ(以下、Apache+PHPコンテナ)を起動してみましょう。
 その際、最初に示した構成概要図の通りになるようにオプションを付けて起動します。

$ docker run -d -p 8080:80 my-httpd-php apachectl -D FOREGROUND

 docker psコマンドで起動確認を行います。

$ docker ps
CONTAINER ID  IMAGE         COMMAND                 CREATED        STATUS     
PORTS                                   NAMES
2602d9212863   my-httpd-php "apachectl -D FOREGR…" 5 seconds ago  Up 3 seconds
0.0.0.0:8080->80/tcp, :::8080->80/tcp   gracious_elgamal

 これでDockerホスト外の端末からアクセス可能な状態で「Apache+PHPコンテナ」が起動されました。

 もし可能でしたら、外部のPCからブラウザで「Apache+PHPコンテナ」の8080番ポートにアクセスしてみてください。

http://<DockerホストのIPアドレス>:8080/

※Dockerがインストールされているホストは、外部から8080番ポートにHTTPで接続可能であることが必要です

7.PHPアプリケーションのインストール

 PHPをインストールしましたので、サンプルプログラムを使って「Apache+PHPコンテナ」の動作確認を行いたいと思います。

 PHP言語で超簡単なIPアドレスとホスト名を表示させるアプリケーションを作成します。

 まず、Dockerホスト内の任意の場所に以下の内容のファイルをviエディタなどで作成してください。ファイル名は「myapp.php」としましょう。

<html>
 <head>
 <title>
 myapp.php
 </title>
 </head>
 <body>
 <b>
 <?php
 echo "This machine is ",gethostname(),".";
 echo "<br>";
 echo "This machine's IP-address is ",$_SERVER["SERVER_ADDR"],".";
 echo "<br>";
 echo "<br>";
 echo "Your machine's IP-address is ",$_SERVER["REMOTE_ADDR"],".";
 ?>
 </b>
 </body>
 </html>

 お約束のphpinfoでも良いのですが、ホスト名やIPアドレスを表示する簡単なプログラムにしてみました。

 できましたら、それを以下のコマンドで「Apache+PHPコンテナ」にコピーします。

# docker cp myapp.php <Apache+PHPコンテナのコンテナID>:/var/www/html/

 これは、「myapp.php」を「Apache+PHPコンテナ」内の「/var/www/html/」にコピーするコマンドになります。

 私の環境では以下のコマンドを実行しました。

$ docker cp myapp.php eddd79c47f4b:/var/www/html/

 念のために、以下のコマンドでファイルの存在確認を行いましょう。これはコンテナ「eddd79c47f4b」内で「ls -l /var/www/html/」を実行するコマンドです。

$ docker exec eddd79c47f4b ls -l /var/www/html/
total 4
-rw-rw-r-- 1 1000 1000 323 Sep 17 00:17 myapp.php

8.動作確認

 では最後に動作確認を行います。

 Dockerホスト外のPCのブラウザから以下のURLにアクセスしてみましょう。

http://<DockerホストのIPアドレス>:8080/myapp.php

 いかがですか?

 「Apache+PHPコンテナ」のホスト名とIPアドレスおよび接続元のIPアドレスとが表示されましたでしょうか?

おわりに

 本記事では、ベースとなるDockerイメージでDockerコンテナを起動して、ひとつひとつ手動でセットアップしていきました。

 今回行ったことをdockerfileに記述してdockerコマンドに読み込ませることで、コマンドひとつでDockerイメージの作成を行うことができます。

 冒頭でもふれましたが、別記事「Dockerfileを使用したDockerイメージの作成」で、今回行った作業手順をDockerfileというファイルに記載し、Dockerイメージを作成する方法をご紹介しておりますので、よろしかったご利用ください。

 最後までお読みいただきありがとうございました!

コメント