1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

DockerでPHP+MySQLの入門作ってみた

Last updated at Posted at 2021-01-04

仕事関連コードのサーバCIをdockerで環境構築したので
自分なりに入門を作りました

簡単な専門用語の説明

コンテナ

・ホストマシンから隔離された環境
・コンテナイメージから作成される
・docker-compose.ymlにコンテナ詳細と依存関係が記載
・docker-compose upでコンテナ構築+起動
・docker psでコンテナ一覧表示
・docker start/stop/restartでコンテナの起動終了再起動

コンテナイメージ

・コンテナを作成する元
・Dockerfileに内容を記載
・docker buildで構築
・docker imagesで一覧表示
・docker rmiで削除
・docker hubで検索するといい感じのやつがある

文字列を表示する簡単な鯖を構築する

バージョンを指定せず構築するなら簡単です
PHP+Apacheのコンテナイメージからコンテナを起動しましょう

docker-compose.yml

services:
  sample_app:
    image: php:5.5-apache
    volumes:
      - ./html:/var/www/html
    ports:
      - 8000:80
    container_name: sample_app

html/index.php

<?php
echo "HelloWolrd!";

php:5.5-apache はdocker公式が提供しているPHP5.5+Apacheのコンテナイメージです
このコンテナイメージを使ってコンテナ構築するだけでサーバが構築できるので簡単ですね
imageのところはdocker hubから検索するといいです。tagsからバージョン指定もできます

あとは docker-compose up -d すれば
docker hubからコンテナイメージをpull→コンテナ構築→コンテナ起動
まで自動でやってくれます
dオプションはバックグラウンド起動オプションです

http://localhost:8000
にアクセスすると「HelloWorld!」と表示されます

docker ps と打つとsample_appコンテナが起動してるのが確認できます

おめでとうございます!

$ docker ps
CONTAINER ID   IMAGE               COMMAND                  CREATED          STATUS          PORTS                  NAMES
211a18290243   php:5.5-apache      "apache2-foreground"     54 seconds ago   Up 54 seconds   0.0.0.0:8000->80/tcp   sample_app

docker imagesと打つとphp:5.5-apacheのコンテナイメージ一覧が確認できます

$ docker images
REPOSITORY                   TAG          IMAGE ID       CREATED       SIZE
php                          5.5-apache   ea0a3d41ce6c   4 years ago   390MB

ただこんなシステム構築しても面白くないですよね
WEBサーバならDBも用意したいところです
DBコンテナも起動しましょう

DBにデータを取得するサーバを構築する

まずはmysqlコンテナを追加して
初期データを投入、
index.phpからアクセスまで行います

docker-compose.yml

services:
  sample_app:
    image: php:5.5-apache
    volumes:
      - ./html:/var/www/html
    ports:
      - 8000:80
    container_name: sample_app
  sample_db:
    image: mysql:5.6
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=test
      - MYSQL_USER=test
      - MYSQL_PASSWORD=test
    volumes:
      - ./sample_db/initdb:/docker-entrypoint-initdb.d # ここに配置するとコンテナ構築時に実行してくれる
    container_name: sample_db

sample_db/initdb/init.sql

-- DB作成時に実行されるファイル
create table test.test (text text);
insert into test.test values ('first'),('second'),('third');

html/index.php

<?php
$dbh = new PDO('mysql:host=sample_db;dbname=test', 'root', 'root');
foreach ($dbh->query('select * from test') as $row) {
  echo $row['text'] . '<br/>';
}

これで設定変更完了。コンテナイメージ・コンテナを再構築します

# コンテナを停止・削除
docker-compose down --remove-orphans
# コンテナを構築・起動
docker-compose up -d

mysql5.6コンテナイメージをpullしてきてdbコンテナを構築・起動してくれます
初期データも構築時に投入してくれます

http://localhost:8000 にアクセスしてみましょう

Fatal error: Uncaught exception 'PDOException' with message 'could not find driver' in /var/www/html/index.php:2 Stack trace: #0 /var/www/html/index.php(2): PDO->__construct('mysql:host=samp...', 'root', 'root') #1 {main} thrown in /var/www/html/index.php on line 2

PDOエラーがでます
実はphpからmysqlにアクセスするにはpdo_mysqlが必要です

しかしphpはphp:5.5-apacheコンテナイメージから提供されているので
docker-compose.ymlでは手を入れれません

sample_appコンテナにpdo_mysqlを入れるには2通りの方法があります

1つ目はpdo_mysql込みのコンテナイメージからコンテナを作る
2つ目は既存コンテナイメージにpdo_mysqlをインストールする

2つ目のほうが融通が効くので、2つ目にお世話になることが多いと思います
今回は2つ目の方法を記載します

sample_app_image/Dockerfile

FROM php:5.5-apache

RUN apt-get -y update && apt-get -y upgrade \
  && docker-php-ext-install pdo_mysql

Dockerfileにインストール手順を記載し、

docker-compose.yml

services:
  sample_app:
    build:
      context: ./sample_app_image
      dockerfile: Dockerfile
    image: sample_app
    volumes:
      - ./html:/var/www/html
    ports:
      - 8000:80
    container_name: sample_app
  sample_db:
    image: mysql:5.6
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=test
      - MYSQL_USER=test
      - MYSQL_PASSWORD=test
    volumes:
      - ./sample_db/initdb:/docker-entrypoint-initdb.d # ここに配置するとコンテナ構築時に実行してくれる
    container_name: sample_db

docker-compose.ymlにビルド先を記述します
あとはコンテナを再起動

# コンテナを停止・削除
docker-compose down --remove-orphans
# コンテナを構築・起動
docker-compose up -d

ビルドに成功すると以下のページで「First Second Thrid」と表示され
DBからデータを取得できているのが確認できます

おつかれさまでした

Q&A

Q. Dockerfileのapt-getとか作るのめんどい。環境削除と再構築に時間かかる
A. コンテナ内にログインして実際に打ってみて成功したらDockerfileに書くのが効率いいです

$ docker exec -it sample_app bash

Q. コンテナ内のログを見たい
A. logs使えば簡単に見れるよ

$ docker logs sample_app

Q. PHP5.5とか糞雑魚wwwセキュリティサポート終了してんぞwww
A. 仕事で使ってんだくそg

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?