Honai's Blog

DockerでLAMP環境構築(ローカル開発用)

2019/04/13

Docker で LAMP (ローカル開発用)

環境:Ubuntu 18.04 LTS

ローカルの LAMP 環境がほしくなったので、Docker に初挑戦しました。 他サイトから引っ張ってきた手順とハマったところだけをつらつらと書いております。 Docker とは何か?みたいなことは書いていないのでお許しを。

なぜ今さら LAMP? そうねぇ。

Docker インストール

docker-ce

このサイトに全て書いてあります。 Get Docker CE for Ubuntu | Docker Documentation

$ sudo apt-get update
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

fingerprint の確認

$ sudo apt-key fingerprint 0EBFCD88

pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]

stable ビルドをインストール 公式ドキュメントでは docker-ce-clicontainerd.io もインストールしているようだが、今回は docker-compose のために入れるだけなので省略できるみたい。

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
$ sudo apt update
$ sudo apt install docker-ce
$ docker --version

参考にした公式サイトの下の方に記述があるが、一般ユーザー( sudo なし) で docker を扱えたほうが便利なので、その設定をする。docker というグループに Ubuntu ユーザーが属するようにすればいい。

$ sudo usermod -aG docker <your-username>

docker-compose

続いて docker-compose をインストール。 Install Docker Compose | Docker Documentation

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version

各種ファイルを作成

Docker で LAMP 環境 - Qiita

↑ とてもシンプルにまとまっており、そのまま使えたので解説も省きます。 @fkymnbkz さんに感謝。PHP や MySQL のバージョン等は適宜変更してください。

重要と思われるポイントが 2 点あり、データベースの永続化・pdo mysql を有効化する Dockerfile の記述、に注意してください。

PDO で No such file or directory エラー

私は MySQL データベースの GUI での管理に Adminer を使いますが、普通に

項目
サーバ localhost (空欄)
ユーザ名 root
パスワード docker-compose.yml で設定した値

でログインしようとすると、 SQLSTATE[HY000] [2002] No such file or directory とのエラーが出ます (内部的には Adminer は PDO を使っているので、PDO のインスタンスを立てるときのエラー)。

2019-04-13 追記

以下に IP アドレスを使用した解決方法を記していますが、普通に docker-compose.yml で設定した MySQL のサービス名を使うとアクセスできました。 私の環境ではサービス名を mysql にしたので、「サーバ」欄を localhost ではなく mysql とすればログインできます。

ありがとうございます。以下は記録のために残しておきます。

docker で CakePHP の環境構築をした時に、データベースに接続できない - Qiita

このサイトを参考に解決できました。 docker-composer up -d でコンテナが起動した状態で、コンテナにシェルでログインします。

$ docker-compose exec mysql /bin/bash
# cat /etc/hosts
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.20.0.3	73b379ef7de9

一番下の行が DB コンテナを表しているようです (IP や ID は環境によって変わります)。この IP アドレス (上記では 172.20.0.3 ) を控え、Adminer のログインや PDO の初期化のときに host (サーバ)としてこの IP を渡すと、接続できました。

コンテナ内の MySQL に外部から接続する

Docker の MySQL コンテナに外部のサーバーから接続する - Qiita

外部と言ってもホスト OS となる Ubuntu からアクセスするという意味です。 phpMyAdmin や Adminer を使わず、普通に mysql でコマンドを叩きたいときの手順になります。

$ sudo apt install mysql-client-core-5.7
$ mysql -u root -p -h localhost -P 3306 --protocol=tcp

ポートは docker-compose.yml で定義されたものに合わせます。パスワードを尋ねられるので入力すると、mysql をコマンドで操作できます。

Docker 初挑戦でしたが、意外と手軽にできました。いろんな環境を Docker でつくれるようになっておきたいです。

コメント・ご指摘等は 筆者の Twitter アカウント にお願いします。