タグ: WordPress

  • Dockerの使い方入門|基本コマンドとdocker-composeの書き方を実例で解説

    2re funの各プロジェクトでは、インフラ構築に一貫してDockerを使っています。この2re blog自体もWordPress+MySQLをDocker Composeで構築しており、「2re blogの技術構成|WordPress・Docker・MySQLで作る個人ブログ基盤」で紹介した通りです。今回は一歩戻って、Dockerの基本的な使い方を、実際にこのブログで使っているdocker-compose.ymlを例にしながら整理しておきます。

    Dockerとは

    Dockerは、アプリケーションとその実行環境をまとめて「コンテナ」という単位でパッケージ化し、どのマシンでも同じように動かせるようにするツールです。「自分のPCでは動くのに本番サーバーでは動かない」といった環境差異の問題を防げるのが最大のメリットで、個人開発でもチーム開発でも広く使われています。

    基本概念:イメージ・コンテナ・Dockerfile

    Dockerを理解する上でまず押さえておきたいのが、次の3つの用語です。

    • イメージ(Image):アプリケーションの実行に必要なファイルや設定をまとめた、いわば「設計図」。読み取り専用のテンプレート。
    • コンテナ(Container):イメージを元に実際に起動した、動いているプロセスの実体。同じイメージから複数のコンテナを起動できる。
    • Dockerfile:イメージをどう作るかを記述した設計書。ベースイメージの指定やコマンドの実行手順をテキストで書く。

    「Dockerfileからイメージをビルドし、イメージからコンテナを起動する」という流れがDockerの基本サイクルです。

    よく使う基本コマンド

    単体のDockerコマンドとしては、まず次のあたりを覚えておくと一通りの操作ができます。

    • docker build -t 任意の名前 .:カレントディレクトリのDockerfileからイメージをビルド
    • docker run -d -p 8080:80 イメージ名:イメージからコンテナをバックグラウンド起動し、ポートを公開
    • docker ps / docker ps -a:起動中/すべてのコンテナ一覧を確認
    • docker logs -f コンテナ名:コンテナのログをリアルタイムで確認
    • docker exec -it コンテナ名 bash:起動中のコンテナ内でシェルを実行
    • docker stop コンテナ名 / docker rm コンテナ名:コンテナの停止・削除
    • docker images / docker rmi イメージ名:イメージの一覧・削除

    複数コンテナはDocker Composeでまとめて管理する

    WordPress+MySQLのように複数のコンテナを組み合わせて使う場合、docker runをコンテナごとに実行するのは手間がかかります。そこで使うのがDocker Composeです。docker-compose.ymlというファイルに必要なコンテナ(サービス)をまとめて定義しておけば、コマンド1つでまとめて起動・停止できます。

    • docker compose up -d:定義したサービスをまとめてバックグラウンド起動
    • docker compose ps:サービスの起動状況を確認
    • docker compose logs -f サービス名:特定サービスのログを確認
    • docker compose exec サービス名 bash:サービスのコンテナ内に入る
    • docker compose down:サービスをまとめて停止・削除(ボリュームは残る)

    実例:2re blogのdocker-compose.ymlを読み解く

    実際にこの2re blogで使っているdocker-compose.ymlを例に、書き方のポイントを見てみます。

    services:
      mysql:
        image: mysql:8.4
        container_name: blo-2refun-db
        restart: unless-stopped
        environment:
          MYSQL_DATABASE: ${MYSQL_DATABASE:-wordpress}
          MYSQL_USER: ${MYSQL_USER:-wordpress}
          MYSQL_PASSWORD: ${MYSQL_PASSWORD:-wordpress}
          MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root}
        volumes:
          - blo-db-data:/var/lib/mysql
        healthcheck:
          test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD:-root}"]
          interval: 5s
          timeout: 5s
          retries: 20
    
      wordpress:
        image: wordpress:php8.3-apache
        container_name: blo-2refun-wordpress
        restart: unless-stopped
        environment:
          WORDPRESS_DB_HOST: mysql
          WORDPRESS_DB_NAME: ${MYSQL_DATABASE:-wordpress}
          WORDPRESS_DB_USER: ${MYSQL_USER:-wordpress}
          WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD:-wordpress}
        volumes:
          - blo-wp-data:/var/www/html
        ports:
          - "127.0.0.1:8081:80"
        depends_on:
          mysql:
            condition: service_healthy
    
    volumes:
      blo-db-data:
      blo-wp-data:

    ポイントは次の4つです。

    1. 環境変数は.envファイルに切り出す:${MYSQL_PASSWORD:-wordpress}のように書くと、.envで値を上書きしつつ、未設定でも動くデフォルト値を持たせられます。パスワードなどの秘匿情報をコードに直書きせずに済みます。
    2. データは名前付きボリュームに永続化する:blo-db-dataやblo-wp-dataのような名前付きボリュームにデータを保存しておけば、コンテナを削除して作り直してもデータは消えません。
    3. healthcheckとdepends_onで起動順序を制御する:MySQLコンテナにhealthcheckを設定し、WordPress側のdepends_onでcondition: service_healthyを指定することで、DBが実際に接続可能になってからWordPressを起動できます。単なるdepends_onだけだと、コンテナは起動していてもDBの準備が間に合わずエラーになることがあります。
    4. ポートは必要な範囲だけ公開する:127.0.0.1:8081:80のようにホスト側のバインド先をローカルホストに絞ることで、外部から直接コンテナのポートへアクセスされるのを防いでいます。本番公開はCaddyなどのリバースプロキシ経由にしています。

    Dockerを使うときに気をつけていること

    2re funの各プロジェクトでDockerを使う際、次の点を意識しています。

    • 本番運用するコンテナにはrestart: unless-stoppedを設定し、サーバー再起動時に自動で立ち上がるようにする
    • 秘匿情報は.envにまとめ、.gitignoreでリポジトリに含めない
    • コンテナ名やボリューム名にプロジェクト名のプレフィックスを付け、複数プロジェクトを1台のVPS上で動かしても衝突しないようにする
    • まずdocker compose logsでログを確認してから、必要に応じてdocker compose execでコンテナに入って調査する

    まとめ

    Dockerは「イメージからコンテナを起動する」というシンプルな仕組みですが、Docker Composeを使うことで複数コンテナの構成もコード化でき、環境の再現性が大きく上がります。2re funでは、この2re blogに限らず各プロジェクトのインフラをDocker Composeでコード化しており、それぞれの技術構成はこのブログで随時紹介していく予定です。あわせて「2re blogの技術構成」もご覧ください。

  • 2re blogの技術構成|WordPress・Docker・MySQLで作る個人ブログ基盤

    2re blogは、Cloude Codeなどを使いながら人気のある開発構成を調べ、実際に手を動かして作ったサイトやシステムを公開していくブログです。今回は、この2re blog自体がどんな技術構成で動いているのかをまとめておきます。

    インフラ構成:Docker Composeで環境を統一

    2re blogはDocker Composeで構築しており、次の2つのコンテナで動いています。

    • wordpress:php8.3-apache:WordPress本体を動かすアプリケーションサーバー
    • mysql:8.4:投稿データなどを保存するデータベース

    MySQLコンテナにはヘルスチェックを設定し、DBが正常に起動してからWordPressコンテナが立ち上がるようにdepends_onで制御しています。データはそれぞれ名前付きボリュームに永続化しているので、コンテナを作り直してもデータは保持されます。

    WordPress側の設定

    パーマリンクは/%year%/%monthnum%/%day%/%postname%/の形式にし、URLに投稿日とスラッグが入るようにしています。プラグインは最小構成を意識して、次の2つだけを有効化しています。

    • Yoast SEO:タイトルタグ・meta description・OGPの最適化
    • Post Views Counter:記事ごとの閲覧数計測

    SEOで意識していること

    2re blogでは、検索結果やSNSでのシェア時に内容が伝わりやすいよう、次の点を整えています。

    • サイトタイトルを「2re blog」に統一し、titleタグに反映
    • Yoast SEOでページごとにmeta descriptionを設定
    • og:title・og:site_nameなどのOGPを出力し、SNSシェア時の表示を最適化
    • 検索エンジンのインデックスを許可(検索エンジンでの表示をブロックしない設定)
    • パーマリンクに投稿名を含め、URLからも内容が推測できるように調整

    今後の展望

    まだ環境を作ったばかりの段階なので、今後は各記事に画像やコードサンプルを増やしたり、内部リンクを整理したりして、2re blog全体としての情報の見つけやすさを高めていきたいと思っています。作ったサイトやシステムの技術構成についても、引き続きこのブログで公開していく予定です。