• Docker
  • 環境構築
  • PHP
  • mysql
  • apache
#10

はじめてのDockerインストール

こんばんは、Shumpei(@seventhseven)です。

PHPとMySQLの学習をするために、こんなツイートをしたところ、

たくさんのアドバイスをいただきました。

今回はかなり長くなってしまいましたが、

Dockerを使ってLAMP(Linux Apache MySQL PHP)環境を構築していきます。

宜しくお願いします。

https://twitter.com/seventhseven/status/1149729098492604416

名前だけ聞いたことのあるXAMPを手がかりにしていたのですが、

MAMPDockerをおすすめいただきました。

MAMP

 https://twitter.com/kikkawapapa/status/1149812734994681856
 https://twitter.com/seltzer/status/1149822157481897984

MAMPはPHPとMySQL、ApacheをGUIで作れるソフトのようで、

公式サイトを見た限り、

ソフトをインストールするだけで仮想環境作って動かせるので

すぐ始めるならとてもお手軽ですね。

WordPressのローカル環境を作った際に、「Local by flywheel」で行ったので、

同じような感じで作れそうです。

Docker

https://twitter.com/smyz1004/status/1149850308303941633
https://twitter.com/shimohara26/status/1149828602541690880
https://twitter.com/i_namespace/status/1149852579402174465
https://twitter.com/rirazou_/status/1149857443742011392

こちらはDockerをオススメしていただいた方たちのツイートです。

仮想環境は今どき必須レベルで覚えておくスキルだと思うのですが、

業務ではVagrantしか動かしたことなかったので、まだDockerは手を出せてないです。

調べた限り、VMはOSの上に別の仮想OSを載せる仮想化とは違い、

同じOSのカーネルを共有するので、別のOSを載せずに必要なファイルだけを動かすため、

VMに比べてオーバーヘッドが少ないので、比較的軽いということがわかりました。

Dockerをインストールしてみる

今回はDockerに挑戦したいと思います。

僕はmac環境なので、Docker for Macをインストールしていきます。

有償と無償があるようですが、無償にて作ります。

Docker for macをインストール

Dockerの公式サイトでアカウントを作り、DockerHubからインストールします。

  • とりあえずアカウントを作成します。

  • Docker Desktop for MacでGet Dockerをクリック

    1. Docker Desktop for Mac
    2. DLしたDocker.dmgを開く
    3. ApplicationsディレクトリにDocker.appをコピー
    4. コピーしたDocker.appをFinderから開く
    5. インストール
    6. 上のツールバーにDockerアイコンが追加されるので、Dockerアカウントでログインする
    7. ターミナルでdocker versionと入力してVersion情報などが返ってきたらインストール成功

Dockerイメージを使ってみる

ホスト側とコンテナ側を結びつける用のファイルを作成する

Dockerイメージで作られたファイルは、簡単に壊すことができ、

また、コンテナの中で作ったファイルも消えてしまいます。

現実世界のホスト側と、仮想世界のコンテナ側で

同じファイルを参照するようにしたいと思います。

まず、自分の好きなディレクトリでindex.phpを作ります。

今回は以下の通り。

/Users/Documents/workspace/docker-test/www/index.php

Dockerイメージをpullする

$ docker run -p 80:80 -v /Users/Documents/workspace/docker-test/www/:/var/www/html --name yakiniku -d php:5.6-apache
  • Mynameの部分はご自分のプロジェクト名など、適宜変えてください。
  • /Users/Documents/workspace/docker-test/www/がホスト側のindex.phpがあるディレクトリ
  • /var/www/htmlとホスト側の上記のディレクトリとをマウント(同期接続)させます

ホスト側とコンテナ側でもちろんディレクトリが違うのですが、

これでホスト側のファイルを更新すれば、コンテナ側にも更新が走ります。

-p 80:80コマンドで、ホスト側の80番ポートと、コンテナ側の80番ポートをつなげるというコマンドですね。

80番ポートなので、http通信なのかな。

その後、ブラウザでlocalhost:80でアクセスすると

phpの情報が記載されたページにアクセスできると思います。

出てきたら成功です。

MySQLも取ってくる

続けて、MySQLも設定しましょう。

$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=pass -d mysql:5.7

-eオプションを使用し、

環境変数MYSQL_ROOT_PASSWORDで、パスワードをpassと設定します。

次に、MySQLのコンテナに入ります。

$ docker exec -ti mysql bash

-tiでターミナルから入るオプションで、その隣のmysqlは、 上記のMySQLイメージを作ったときの--nameで設定した名前です。

$ mysql -ppass

これでMySQLにログインできます。

PHPとMySQLの連携環境を作り直す準備

残念ではありますが、ここまでで作ったコンテナイメージを壊します。

今作ったphp環境ですと、最小限の構成のため、MySQLとの連携が難しいようです。

そこで、Dockerfileという設定ファイルを追加して連携しやすいようにします。

何度でも作り直せるのがDockerの良さですね。

ホスト側のファイルは削除しなくて大丈夫です。

Dockerコンテナの削除コマンド

作ったDockerコンテナを一括で削除するコマンド

$ docker rm -f $(docker ps -a -q)

Dockerイメージの削除コマンド

作ったDockerイメージを削除するコマンド

$ docker images
# imageの一覧を表示

$ docker rmi {イメージID}

$ docker images
# 削除されたか確認

PHPとMySQLの連携環境を作り直す

Dockerfileを作る

ファイルの置き場所は以下のように、/phpディレクトリを作りました。

/Users/Documents/workspace/docker-test/php/

ここにDockerfileを作ります。

Dockerfileには以下を記述してください。

FROM php:5.6-apache
RUN apt-get update && \
  docker-php-ext-install pdo_mysql mysqli mbstring

終えたらビルドし直します。

docker build -t php:custom /Users/Documents/workspace/docker-test/php/

Dockerfileを元にphp:customというイメージを作ります。

ビルド完了後、$ docker imagesで確認できます。

MySQLイメージの設定

Docker HubのMySQLイメージのcharacter setがlatin1なようですので、

設定ファイルを追加します。

以下にcustom.cnfを追加します。

/Users/Documents/workspace/docker-test/mysql/

custom.cnfのcharacterに、UTF-8を設定してください。

[mysqld]
character-set-server=utf8

作り終えたら、custom.cnfを読み込んでMySQLコンテナを起動させます。

$ docker run --name mysql -v /Users/ootsuboshunpei/Documents/workspace/yakiniku/mysql/:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=pass -d mysql:5.7

--nameオプションでコンテナの名前を設定します。

-vオプションでホスト側とコンテナ側のディレクトリを結びつけています。

結びつけたことで、作成したcustom.cnfが読み込まれます。

PHPコンテナとMySQLコンテナを連携させる

Dockerfileを作るでビルドしたコンテナと、

MySQLイメージの設定で作成したMySQLのコンテナを連携させます。

docker run -p 80:80 -v /Users/Documents/workspace/docker-test/www:/var/www/html --link mysql:mysql --name php -d php:custom

ターミナルのユーザ名がroot@...に切り替わり、コンテナにログインできたら、 念のため、hostsファイルも確認し、MySQLが連携されているか確認しましょう。

$ cd /etc/

でetcディレクトリに移動し、$ cat hosts172.17.0.2 mysql ...となっていれば大丈夫です。

IPアドレスは各個人で異なると思いますので、--linkで指定した名前であれば問題ないです。

ちゃんと/etc/apache2/ディレクトリなどもあるので、

Basic認証を掛けたりするセキュリティの練習もできますね。

ホスト側でphpMyAdminを導入する

連携の確認用のため、phpMyAdminをインストールします。

ホスト側で行う作業です。

phpMyAdmin ダウンロードページへアクセス

Downloadタブを開き、phpMyAdmin 4.9.0.1からzipファイルをダウンロードします。

今回はphpMyAdmin-4.9.0.1-all-languages.zipをダウンロードしました。

展開する

zipファイルを開き、展開されたディレクトリを、

ホスト側で作成した/Users/Documents/workspace/docker-test/wwwディレクトリ内に移動させます。

※展開されたディレクトリ名が長いので、phpMyAdminに変更しました

移動しましたら、以下の手順で設定を変更します。

  • phpMyAdminディレクトリ内にある、config.sample.inc.phpを、config.inc.phpに変更します
  • config.inc.phpをエディターで開きます
  • $cfg['Servers'][$i]['host'] = 'localhost';を見つけます
  • localhostを--linkオプションで設定したmysqlに変更します

phpMyAdminにログインする

http://localhost/phpMyAdmin/にアクセスします。

ログインのためのユーザ名とパスを求められますので、ID:rootパスワード:passでログインできれば成功です。

phpMyAdminのテスト

ターミナルから確認のためテストします。

ターミナルからテーブルを作成する

Dockerからログアウトしている場合は、

$ docker exec -ti mysql bashでログインしてください。

$ mysql -ppass

$ CREATE DATABASE test;
$ USE test;
$ CREATE TABLE test(name VARCHAR(100));

http://localhost/phpMyAdmin/server_databases.phpを見てみましょう。

データベースのリストにtestがありますでしょうか。

test.phpを作成

/Users/Documents/workspace/docker-test/wwwディレクトリに、 test.phpを作成し、以下の記述をしてください

<meta charset="UTF-8">
<title>テスト</title>
<?php
$db = new PDO('mysql:host=mysql;dbname=test', 'root', 'pass');
$db->query("INSERT INTO test VALUES('テストさん')");
$st = $db->query("SELECT * FROM test");
var_dump($st->fetchAll());

ブラウザで、http://localhost/test.phpにアクセスしてください。 表示されますでしょうか。

次に、ブラウザでphpMyAdminに移り、testテーブル(http://localhost/phpMyAdmin/db_structure.php?db=test)をチェックしてください。

テーブル名testをクリックすると、 nameカラムにテストさんがいれば成功です。

環境構築完了

お疲れ様でした。

初めてDockerを触ったのですが、Qiitaを見ながら作ることができました。

一度作ってしまえばある程度わかるので、勉強がてらやれたのがよかったです。

ただまだライブラリは探ってないですし、k8sなどもまださわれてないので、

環境構築道はまだまだ続く感じです。

とりあえずPHPとMySQLとApacheを設定できたので次に進みたいと思います。 ありがとうございました。

参考

*

last update: 2023/10/21