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

Docker
Docker公式ロゴ
©2020 Docker Inc. All rights reserved

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

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

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

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

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

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

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

Dockerイメージの構成概要

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

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

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

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

docker-imege5

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

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

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

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

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

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

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

Dockerイメージの作成

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

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

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

 以下のコマンドにてCentOSの公式Dockerイメージを取得します。

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

$ docker pull centos

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

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

$ docker images

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

REPOSITORY TAG IMAGE ID CREATED SIZE
 centos latest 970633036444 2 weeks ago 196.7 MB

 これがCentOSの公式Dockerイメージになります。

2.CentOSコンテナの起動

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

$ docker run -d centos init

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

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

$ docker ps

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

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c1dc73608166 centos "init" 28 seconds ago Up 27 seconds zen_thompson

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

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

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

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

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

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

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

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

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

$ docker exec -it c1dc73608166 bash

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

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

[root@c1dc73608166 /]#

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

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

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

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

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

 まずはApacheデーモン用のユーザ/グループを作成します。

# groupadd -g 2000 apache
# useradd -u 2000 -g 2000 -s /usr/sbin/nologin apache

 次に「yum」コマンドにてApacheをインストールします。

# yum install -y httpd

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

久しぶりにApacheとPHPのインストールを行ったのですが、仕様が変わったらしく、今回使用しましたCentOSのDockerイメージ(ver8.2)でyumインストールされるApache(2020年9月時点)は、デフォルト設定ではPHP-fpmが必要になります。

ApacheやPHPの構成に関しましては本記事の本筋から外れてしまいますので、ApacheにPHP-fpmを使用しない設定を行います。

手順は以下のとおりです。

Apacheの設定ファイル/etc/httpd/conf.modules.d/00-mpm.confを修正する

(1)コメント(#)を外す
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

(2)コメントアウトする
LoadModule mpm_event_module modules/mod_mpm_event.so

#LoadModule mpm_event_module modules/mod_mpm_event.so

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

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

# /usr/sbin/httpd

 起動時に以下のような名前解決関係のメッセージが出力されるかもしれませんが、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 04:59 ? 00:00:00 init
root 21 0 0 05:05 ? 00:00:00 /usr/sbin/httpd
apache 22 21 0 05:05 ? 00:00:00 /usr/sbin/httpd
apache 23 21 0 05:05 ? 00:00:00 /usr/sbin/httpd
apache 24 21 0 05:05 ? 00:00:00 /usr/sbin/httpd
apache 25 21 0 05:05 ? 00:00:00 /usr/sbin/httpd
apache 26 21 0 05:05 ? 00:00:00 /usr/sbin/httpd
root 28 0 0 05:08 ? 00:00:00 bash
root 41 28 0 05:16 ? 00:00:00 ps -ef

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

 apacheユーザ権限で起動されていますね。

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

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

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

# yum -y install php php-common

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

# php -v

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

PHP 7.2.24 (cli) (built: Oct 22 2019 08:28:36) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

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

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

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

# exit

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

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

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

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

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

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

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

 でも、現状のCentOSコンテナの内容を基に新しいイメージを作成すれば、いつでも必要な時に現状の状態の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 a2f69b374be4 4 seconds ago 343.1 MB

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

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

$ docker run -d -p 8080:80 my-httpd-php /usr/sbin/httpd -DFOREGROUND

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

$ docker ps
CONTAINER ID  IMAGE         COMMAND                 CREATED        STATUS       PORTS                 NAMES
eddd79c47f4b  my-httpd-php  "/usr/sbin/httpd -DF…"  5 minutes ago  Up 5 minutes 0.0.0.0:8080-&gt;80/tcp  loving_williams

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

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

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

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イメージを作成する方法をご紹介しておりますので、よろしかったご利用ください。

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

コメント

タイトルとURLをコピーしました