HelloDockerFile!!DockerFileからPHP7×MySQL5.7×Apache環境を作る ITかあさん

ITかあさん

HelloDockerFile!!DockerFileからPHP7×MySQL5.7×Apache環境を作る


HelloDockerFile!! 初めてのDockerFileからPHP7×MySQL5.7×Apache環境を作る

docker

Docker Hubにはたくさんの公式リポジトリがあって phpの公式のイメージももちろんあるのですが、試した結果やはりCentOS7をベースに構築した方がなんだかんだ良いということになりました。
ざっくり手順をまとめましたので何かの参考になれば幸いです

docker pullでMySQLの5.7バージョンのイメージをpullする

docker pull mysql:5.7

pullしたmysql:5.7のイメージからMySQLサーバーコンテナを起動する

docker runコマンドでコンテナ名の指定とMySQLのrootユーザーのパスワードとイメージの指定を行って起動します。

起動したMySQLコンテナにSequel Proを使ってアクセスする

スクリーンショット 2017-07-20 17.12.13

クライアントPC(Dockerのコンテナをインストしたマシン)から見ると今起動したMySQL5.7のコンテナはlocalhostになるので127.0.0.1(localhost)の見方になります。
先ほど設定したrootのパスワードを指定してログインします。

起動したMySQLコンテナにログインしてMySQLを直接叩く

ターミナルからコンテナにログインして、クエリを直接叩くことも可能です。
手順としては、docker psコマンドで起動中のMySQLコンテナのCONTAINER IDをコピーしてdocker exec コマンドでコンテナの中に入り、先ほど設定したMySQLのrootパスワードを指定するだけです

CentOS7イメージをベースにPHP7のイメージを作成する

ざっくり構成と手順

  • CentOS7のイメージをベースにPHP7のDockerFileを作成
  • docker imageをビルド
  • docker runでコンテナを作成・起動

参考

Dockerコンテナ内のCentOS7にPHP7をインストールする
今回はPHPについてのみ必要だったので、NPMパッケージ周りのインストールは取り外しました。

ビルド実行

カレントディレクトリにDockerFileがある想定で(DockerFileがあるディレクトリ出ないと buildできません)

docker build -t your-image-name .

ビルドしたらdocker run で起動します

解説

/your-app-source-dir:/var/www/html

apahceのデフォルトのDocumentrootディレクトリと、Dockerを起動しているクライアントマシンのソースコードのディレクトリを指定します。これでDockerのCentOS中のApacheのDocumentRootがリンクしてくれます

privilegedオプション

コンテナのすべてのデバイスへのアクセス許可の設定になります。説明が長くなるので下記リンクを参照してください。
詳しくはこちら。

-p 8000:80

ポート番号8000としました。ポートフォワードしてます。なので、今回 Dockerで起動したコンテナにブラウザからアクセスする場合はhttp://localhost:8000と、なります。

80:80

にしてあげればhttp://localhost/でアクセスができますので、本番環境をDockerで起動したコンテナとする場合は80ポートをそのまま使ってあげれば良いことになります。

your-php-container-name your-php-image

コンテナの名称は何も設定しなくても問題ないですが、よくわからない謎のコンテナ名がランダムでつけられるので管理の都合としても設定した方が良いです。imageの名称は省略できません。何のイメージを使ってそもそもコンテナを立ち上げるか
というコマンドなので必須です。imageが存在しなければ失敗します。

DFOREGROUND

フォアグランドで実行できるようにすることです。画面上で動かすことがフォアグランドですね。あとでDockerのコンテナにログインしてApacheをごにょごにょして再起動するのにこのオプションが必要になります。

そのほか各種設定の為に必要なこと

コンテナへアクセス


DockerのApacheは直後はそもそも起動していません。.htaccessの許可もされていない、 phpはエラーも吐かない設定になっているので、PHPがインストされたCentOS7のDockerコンテナにアクセスして 各種設定をしてからApacheを起動してあげる必要があります。
これらはDockerの説明ではなくあくまでもCentOS7にインストされているApacheの設定とやり方は同等になります。

PHPからMySQLへのアクセス

クライアントマシンからブラウザベースでアクセスするときはlocalhostですが、対コンテナ間ではlocalhostではアクセスすることはできません。
IPアドレスを取得して

それからIPアドレスベースでMySQLに繋げばいいですね

Sequal ProなどMySQLへDockerをインストしているクライアントマシンから直接アクセスする際はlocalhostでアクセスできますね。

まとめ

プロジェクトでちょいちょいDockerを使うことが増えたのでDockerFileを初めて書いてbuildしてみたのですが、PHPからMySQLへコンテナ間の通信をする方法がわからなかったり、
当たり前に使っていたapacheの再起動が使えなかったりとかなり戸惑いました。本当であればdockerをrunしてコンテナの起動のタイミングとapacheを同時に起動したかったのですが、
/usr/sbin/httpd -DFOREGROUND
と、すればApacheがDockerの立ち上げと同時に立ち上がることも分かっているのですが、すると今度はapacheの再起動ができません。CentOS7のサービス(デーモン)が使えないのです。
ちょっと今後の課題とします・・・
なお、PHP7は公式イメージもあるのですが、色々設定を変えようと思った際、Mobyを公式は使っていて、CentOS系の知見に頼りたかったが為にCentOS7ベースで構築しました。
結果、この方が構築には早かった次第です