手動(Dockerfileを使わない)でのDockerイメージの作成(CE対応)


 今回は、ApacheがインストールされているDockerイメージを作成したいと思います。PHPもインストールして、アプリケーションサーバとしても利用できるようにします。

 Dockerイメージを作成する際は、DockerfileというDockerイメージを作成するための作業手順を記載したテキストファイルを作成し、そのファイルをdockerコマンドで読み込ませてDockerイメージを作成する、という手順で通常は行います。

 本記事ではDockerfileを利用しない手順を説明します。そのほうがDockerfile、さらにはDockerについても理解を深める早道になると思うからです。

 最後までお付き合いいただければ幸いです。

 本記事の内容はDocker CE ver17.12.1で確認しております。

 

Dockerイメージの作成(手動編)

Dockerイメージの構成概要

 今回作成するDockerイメージから起動されたDockerコンテナは、以下の構成になります。

docker-imege5

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

名称 内容 備考
ベースイメージ CentOSの公式Dockerイメージ  
Webサーバ Apache 2.x

実施時期によりバージョンは
異なる 

PHP PHP 5.x 実施時期によりバージョンは
異なる 
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 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を起動しましょう。

# /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のバージョン情報が表示されたかと思います。

PHP 5.4.16 (cli) (built: Aug 11 2016 21:24:59)
 Copyright (c) 1997-2013 The PHP Group
 Zend Engine v2.4.0, Copyright (c) 1998-2013 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->80/tcp  loving_williams

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

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

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

 

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

 PHPをインストールしましたので、サンプルプログラムを使って「Apache+PHPコンテナ」の動作確認を行いたいと思います。PHP言語で超簡単なIPアドレスとホスト名を表示させるアプリケーションを作成します。

 まず、Dockerホスト内の任意の場所に以下の内容のファイルを作成してください。ファイル名は「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>

 出来ましたら、それを以下のコマンドで「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/

 

8.動作確認

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

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

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

 

 いかがですか?

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

 以上で終わります。

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

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

■ 本記事の目次に戻る ■


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です