通常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イメージの構成一覧を示します。
名称 | 内容 | 備考 |
---|---|---|
ベースイメージ | Ubuntuの公式Dockerイメージ | バージョンは20.04.2 |
Webサーバ | Apache | バージョンは2.4.41 |
PHP | PHP | バージョンは7.4.3 |
Webアプリケーション | PHP言語にて作成 | 稼働サーバのIPアドレスおよ びホスト名を出力する機能 |
ネットワーク |
Dockerイメージではポート | Dockerコンテナ起動時に内部 の80番ポートをDockerホスト の8080番ポートに接続して使 用する |
Dockerイメージ作成作業の流れ
作業は以下の流れで進めていきます。
- ベースイメージの取得
- Ubuntuコンテナの起動
- UbuntuコンテナにApacheをインストール
- UbuntuコンテナにPHPをインストール
- Ubuntu+PHPコンテナのイメージの作成
- Ubuntu+PHPコンテナの起動
- PHPアプリケーションのインストール
- 動作確認
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イメージを作成する方法をご紹介しておりますので、よろしかったご利用ください。
最後までお読みいただきありがとうございました!
コメント