👶

【備忘録】初心者がDockerでLAMP環境構築してみた

2024/03/26に公開

こんにちわ👋
サーバ知識ほぼ皆無のマークアップエンジニアです。
勉強がてらDockerでLAMP環境を構築したので、
覚えた事やつまずいた所をまとめてみました。

私と同じような初心者の方に届くと幸いです🙏

はじめに

今回作るのは、静的ページを検証できるシンプルなWebサーバーです。
参考にした記事は👇
https://codeaid.jp/blog/docker-lamp/

✅ 覚えた事

LAMP環境に必要なファイルリスト

【ディレクトリ名】
├── docker-compose.yml
├── htdocs
└── php
├── Dockerfile
└── php.ini

dockercompose.yml

Dockerコンテナを定義して管理ができる。

LAMP環境を作る場合に設定が必要なservicesは

  • mysql → 使用するデータベースシステム
  • phpMyAdmin → データベースをweb上で変更する為のツール
  • php-apache → ローカル検証環境とDockerコンテナのポート接続設定

volumes:はよくわかっていませんが、
このソース上でやっている事としては、
services内で紐づけたdb名で空のデータベースを宣言しているということです。

あまり参考記事とは変わってませんが、
作成したDockercompose.ymlはこちら👇

version: '4.1'

services:
  //ここから▼
  mysql: 
    image: mysql:8.0
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 'password'
  //▲ここまでで1コンテナ
  phpmyadmin:
    depends_on:
      - mysql
    image: phpmyadmin/phpmyadmin
    environment:
      PMA_HOST: mysql
    restart: always
    ports:
      - "8080:80"
  
  php-apache:
    build: ./php
    volumes:
      - ./htdocs:/var/www/html/
    restart: always
    ports:
      - "8001:80"
    depends_on:
      - mysql
  
volumes:
  db_data: {}

Dockerfile

Dockerコンテナを構築する為の手順書。

FROM php:7.3-apache
COPY ./php.ini /usr/local/etc/php/
RUN apt-get update \
  && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev \
  && docker-php-ext-install pdo_mysql mysqli mbstring gd iconv

FROM
phpとapacheをDocker公式イメージからダウンロード

COPY
phpをカスタマイズする為に、Dockerコンテナ内にphp.iniを複製。

RUN apt-get update
起動と同時にパッケージを最新状態にする。

&& apt-get install -y
インストール実行。「-y」は「-yes」の略。
プロンプトの途中で実行確認が入るのをスキップする為につけている。

libfreetype6-dev libjpeg62-turbo-dev libpng-dev
PHPのGD拡張機能に必要なパッケージのインストール(今回はぶっちゃけ要らない)
GD = 画像の生成・編集・合成等ができる拡張機能。
静的ページでは必要なさそうだけど、
Wordpressにする可能性を見越すとインストールしといて損はないはず...たぶん。

docker-php-ext-install pdo_mysql mysqli mbstring gd iconv
PHPの拡張機能のインストール
インストールしている拡張機能リスト

  • pdo_mysql
    mysqlを書く時にある程度機能を抽象化して簡易的に書けるようになる。
    プログラミング言語でいうライブラリやフレームワークの立ち位置。
  • mysqli
    mysqlを書けるようにする拡張機能。
  • mbstring
    日本語のようなマルチバイト文字列を扱う時に使える拡張機能。
  • gd
    画像生成・編集・合成等の拡張機能
  • iconv
    文字エンコードの拡張機能。多言語対応のサイトやアプリで使われる。

🔰 つまずいた事

主にdockercompose.ymlで行われていることがちんぷんかんぷんだったので
その辺りをまとめていきます。

portsってどっちの番号を変更するの?

  php-apache:
    build: ./php
    volumes:
      - ./htdocs:/var/www/html
    restart: always
    ports:
      - "80:80"
    depends_on:
      - mysql

xamppを使ってた私が最初につまずいたのがここです。
他のサイトを同時に動かす時ってどっちを変更したらいいの...?と困惑。

正解は左側の80番を変更です。
左側はホスト(自分のPC)のWebサーバーのポート番号、
右側はDockerコンテナ内のWebサーバーのポート番号です。

xamppでよくみる【http:localhost:8080】の8080の部分が左側です。

restart: alwaysって何?

services内に度々出てくる👇

    restart: always

文言を冷静に見ればわかるのですが、
最初はナニコレ状態でした。
簡単に言うと予期せぬ理由でコンテナが停止してしまった時に、
再起動をかけてくれるおまじないみたいなものです。

environmentって何してるの?

この部分ですね👇

    environment:
      MYSQL_ROOT_PASSWORD: 'password'

環境変数の定義ができますと言われたのですが、
ここはいまだよくわかっていません...
とりあえず私が使いそうなMYSQLのパスワード、
DBシステムの紐づけはここでenvironmentで行うと記憶しています。

初心者におすすめしたい進め方

  1. とにかく参考記事と同じように作っていく
  2. わからないところを調べる
  3. 自分なりに作業の流れを文章化する

とにかく参考記事と同じように作っていく

無心でやってください、とにかく無心で。
パソコンスクールのおじいちゃんとおばあちゃんの気持ちです。
1回も構築に成功しないと本当に萎えます。これはマジです。(´⊙ω⊙`)

LAMP環境を作るために必要な事を一通り体験してみるくらいの感覚でいきましょう。

この時点で分からない所や、
自分の環境の場合はどういう作り方になるのか...等々
疑問に思う部分はピックアップして後で調べることにしましょう。

わからないところを調べる

私は無料版のchatGPTをゴリゴリに使い倒しました。
下手にググるよりも端的にわかりやすく答えてくれます。

Googleに上がってる先人たちの知恵は偉大ですが、
経験値の差が激しすぎて、初心者の頭では完全に理解することは難しかったです。

コードが最初から最後まで読めない場合は、
コードを貼り付けて、以下のような文章をつけています。

  • 以下のコードを素人にもわかるように説明してください
  • サーバー知識のない人にもわかるように説明してください。

自分なりに作業の流れを文章化する

私にとってはこれが文章化みたいなものですが、
chatGPTに質問をしながら認識のすり合わせも並行していました。
認識に齟齬があれば指摘してくれますし、
合っていれば合ってたで補足を追加してくれます。


このやり方で私はLAMP環境の作り方と考え方が
なんとなーくつかめるようになりました。
あとは慣れだと思うので、作りながら覚えていこうと思います!

Discussion