お名前ドットコムVPSへ移行への道11-WordPressのイメージ変更(fpm-alpine)

※ 当サイトではアフィリエイト広告を利用しています。リンクは広告リンクも含みます。

この記事は約35分で読めます。

お名前.com VPS のDockerでWordPressを使っていてます。
メモリ使用量を減らしたくてプロセスを見るとapatch2のプロセスがたくさんある。
これは何か調べました。
最終的にはWordPressのイメージをfpm-alpineに変更しました。
あくまでも私は、こうやってみたということで動作やセキュリティの保証はできません。
まとまってないので完全に個人メモになってます。
環境
パソコン Windows11
VPS OS Ubuntu 20.04.3 LTS、 Dockerを使用

広告

メモリ使用量を見てみると

free
              total        used        free      shared  buff/cache   available
Mem:         987916      607268       76488       19984      304160      200276
Swap:       2097148     1064876     1032272

ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem
PID    PPID CMD                         %MEM %CPU
 417704  417627 /home/user/.vscode-serve  7.0  0.4
 417850  417704 /home/user/.vscode-serve  6.9  0.2
   1618    1595 mysqld                       5.2  0.5
   1855    1700 apache2 -DFOREGROUND         4.2  0.0
   9319    1700 apache2 -DFOREGROUND         4.2  0.0
    930       1 /usr/bin/dockerd -H fd:// -  4.1  0.1
   1858    1700 apache2 -DFOREGROUND         4.0  0.0
   1853    1700 apache2 -DFOREGROUND         3.9  0.0
   1856    1700 apache2 -DFOREGROUND         3.9  0.0
   1854    1700 apache2 -DFOREGROUND         3.9  0.0
 212813    1700 apache2 -DFOREGROUND         3.8  0.0
    352       1 /lib/systemd/systemd-journa  3.7  0.0
略
   1700    1636 apache2 -DFOREGROUND         0.0  0.0

apache2 -DFOREGROUNDが8個動いていて使っているメモリ使用量は 
4.2+4.2+4.0+3.9+3.9+3.9+3.8+0=28%
607268×0.28=170035=170Mb使ってることになる
これを確認するため
systemctl status
を実行するとWordPressのコンテナが使ってる。
   CGroup: /
           ├─379 bpfilter_umh
           ├─docker
        ├─5c80*************WordPressのコンテナ******************** 
             │ │ ├─  1700 apache2 -DFOREGROUND
             │ │ ├─  1853 apache2 -DFOREGROUND
             │ │ ├─  1854 apache2 -DFOREGROUND
             │ │ ├─  1855 apache2 -DFOREGROUND
             │ │ ├─  1856 apache2 -DFOREGROUND
             │ │ ├─  1858 apache2 -DFOREGROUND
             │ │ ├─  9319 apache2 -DFOREGROUND
             │ │ └─212813 apache2 -DFOREGROUND

調べるとMPMという仕組みが関係してそう。
参考:http://www.momobro.com/rasbro/tips-rp-apache2-tuning-mpm-prefork/
参考:https://qiita.com/rryu/items/5e02ea60e36d7fd956b8

「Apache HTTP Server(httpd)では、マルチプロセスモジュール(MPM)が使用され、これによってクライアントからのリクエストを処理するためのサーバーの動作が制御されます。代表的なMPMには、mpm_event、mpm_worker、mpm_prefork があります。」(ChatGpt3.5談)
mpm_event、mpm_worker、mpm_preforkのうち、どれが採用されているか確認
コンテナの中に入って
apachectl -V
でApacheのビルド時の設定オプションを確認
Server version: Apache/2.4.57 (Debian)
略
Server MPM:     prefork
があったので設定値を確認
cat /etc/apache2/mods-available/mpm_prefork.conf
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxRequestWorkers: maximum number of server processes allowed to start
# MaxConnectionsPerChild: maximum number of requests a server process serves

StartServers            5
MinSpareServers         5
MaxSpareServers         10
MaxRequestWorkers       150
MaxConnectionsPerChild  0

この設定を変えてみる。
コンテナにテキストエディタ(vim、nano)がないのでexitで出て
vim /etc/apache2/mods-available/mpm_prefork.conf
StartServers            5→2
MinSpareServers         5→2
MaxSpareServers         10→4
sudo docker restart コンテナ名をしたが状況変わらず
コンテナの中に入ってmpm_prefork.confを確認するとデフォルトに戻っていた。
ymlを見たら/etc/apache2/mods-availableはバインドマウントされていなかった。
つまりホストのapatch2設定を変えてしまったので戻した。

ホスト側でmpm_prefork.confを新規作成して中身をコピーし修正し
コンテナにコピー。
sudo docker cp mpm_prefork.conf コンテナ名:/etc/apache2/mods-available/mpm_prefork.conf
コンテナ再起動
sudo docker restart コンテナ名
MaxSpareServersは2にしても4個できるので4にした。
結果
free
              total        used        free      shared  buff/cache   available
Mem:         987916      519320       78068       31864      390528      273836
Swap:       2097148     1109344      987804

systemctl status
           │ ├─5c80*************WordPressのコンテナ********************  
           │ │ ├─459606 apache2 -DFOREGROUND
           │ │ ├─459649 apache2 -DFOREGROUND
           │ │ ├─459650 apache2 -DFOREGROUND
           │ │ └─459824 apache2 -DFOREGROUND

ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem 
    PID    PPID CMD                         %MEM %CPU
 459650  459606 apache2 -DFOREGROUND         7.1  0.2
 417704  417627 /home/user/.vscode-serve  6.2  0.2
   1618    1595 mysqld                       5.9  0.5
 443048  417704 /home/user/.vscode-serve  5.8  0.3
 459649  459606 apache2 -DFOREGROUND         5.8  0.2
 459824  459606 apache2 -DFOREGROUND         5.5  0.0
    930       1 /usr/bin/dockerd -H fd:// -  4.6  0.1
 417821  417704 /home/user/.vscode-serve  3.7  0.2
 459606  459581 apache2 -DFOREGROUND         3.6  0.0
    352       1 /lib/systemd/systemd-journa  2.8  0.0
7.1+5.8+5.5+3.6=22
519320×0.22=114250=114Mbやる前が170Mb。
あまり減らないし、5個になることもあった。
でも減ってはいるのでコントロールできることは分かった。
目次へ

WordPressのコンテナはapatch2だけでいいのか

WordPressを動かすためにはphpが必要だけど、
コンテナのプロセスをみるとphpはなくapatch2しかないのはなぜか調べた。

コンテナの中に入ってphpという言葉が記述されているファイルを抽出。

grep -r -i "php" /etc/apache2/
/etc/apache2/conf-available/docker-php.conf:<FilesMatch \.php$>
/etc/apache2/conf-available/docker-php.conf:  SetHandler application/x-httpd-php
/etc/apache2/conf-available/docker-php.conf:DirectoryIndex index.php index.html
/etc/apache2/sites-available/default-ssl.conf: <FilesMatch "\.(?:cgi|shtml|phtml|php)$">
/etc/apache2/mods-available/dir.conf:DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm
/etc/apache2/mods-available/php.load:LoadModule php_module     /usr/lib/apache2/modules/libphp.so

状況におけるPHPの動作

提供された情報に基づくと、PHPは以下の方法で動かされています。

1. ApacheモジュールとしてのPHP

  • etc/apache2/mods-available/php.load ファイルは、php_module モジュールを /usr/lib/apache2/modules/libphp.so からロードするように指示しています。
  • これにより、PHPはApacheのモジュールとして動作し、.php 拡張子のファイルを処理できるようになります。

2. .php ファイルの処理

  • etc/apache2/conf-available/docker-php.conf ファイルは、.php ファイルに以下の設定を適用します。
    • SetHandler application/x-httpd-php: .php ファイルがリクエストされた場合、PHPモジュールが処理を担当することを指示します。
    • DirectoryIndex index.php index.html: デフォルトのインデックスファイルとして index.phpindex.html を設定します。
  • これらの設定により、.php ファイルがブラウザからリクエストされた場合、以下の処理が行われます。
    1. Apacheは.php ファイルをPHPモジュールに渡します。
    2. PHPモジュールはファイルを読み込み、PHPコードを実行します。
    3. 実行結果がHTML形式で生成されます。
    4. Apacheは生成されたHTMLをブラウザに送信します。

3. その他の関連設定

  • etc/apache2/sites-available/default-ssl.conf ファイルは、HTTPS接続でアクセスされた場合にも .php ファイルを処理するように設定しています。
  • etc/apache2/mods-available/dir.conf ファイルは、デフォルトのインデックスファイルとして index.php を含めています。

まとめ

上記の構成により、ApacheはPHPモジュールを介して.php ファイルを処理し、動的なWebページを提供することができます。

PHPはApacheのモジュールとして動作しているといことなのでさらに調べ、たどりついたのがここ。
こちら↓でいろいろ疑問に思っていたことの答えがありそう。あとでじっくり読ませてもらいます。
参考:https://zenn.dev/bs_kansai/articles/3706c12408160c
特にモジュール方式の説明を読むとapache2だけ起動してればよさそうです。
目次へ

WordPressのDocker image

WordPressのイメージってWordPressとphpのバージョンだけ気にすればいいと思っていたが
上のように調べるとapatch2やnginxとの組み合わせなどいろいろあるみたいです。
また一般的に軽量なalpineもあるのでimageを見直そうと思いました。
今までimage: wordpress:latestとしていたが、
wordpress – Official Image | Docker Hubを見るといろいろある。
タグの意味がよくわからなかったが多分latestっていうのは、
image: wordpress:の後ろの、この部分は以下の何を書いても同じものなんだろうなと思った。
以下はみんな同じDockerfileにリンクされている。

6.4.3-apache, 6.4-apache, 6-apache, apache, 6.4.3, 6.4, 6, latest, 6.4.3-php8.2-apache, 6.4-php8.2-apache, 6-php8.2-apache, php8.2-apache, 6.4.3-php8.2, 6.4-php8.2, 6-php8.2, php8.2

ということでWordPressとphpのバージョンがlatestと同じものでfpmでalpineの以下にしてみる。

6.4.3-fpm-alpine, 6.4-fpm-alpine, 6-fpm-alpine, fpm-alpine, 6.4.3-php8.2-fpm-alpine, 6.4-php8.2-fpm-alpine, 6-php8.2-fpm-alpine, php8.2-fpm-alpine

心配なのは、ただymlのimageを変えるだけで、yml内の他は変えなくていいのかです。
取り合えずimageだけ変えてやってみます。

sudo docker-compose up -d
これだけだとダメだった。内部エラー500発生。
再起不能になったのでWordPressとデータベースのコンテナとVolumeを削除
目次へ

fpm-alpine

ymlなどを変えないとダメなことが分かった。
こちら↓を参考に修正します。

docker×nginx×php-fpmでwordpress複数台を負荷分散させつつ動かしてみました。 - Qiita
特別Wordpressでブログを出しているような身ではないのですが、少し変わった環境を構築してみたいかもという興味本位でやってみました。Wordpressサイト運用でプラグイン入れたりバージョン上…
私の環境で修正するポイントは2点 ・Nginxのコンテナが新たに必要。前段のWAF付きのNginxを、ここのportにつなげる。 ・WordPressとNginxの接続は以下のバインドマウントされたディレクトリ  volumes: - ./html:/var/www/html docker-compose.yml Nginxのimageはnginx:1.25-alpine WordPressはimage: wordpress:fpm-alpine 追加したNginxはsharedネットワークに入れて80番とつなげるため expose: - "80" wp_first:1個だけ使う。 追加したNginxのconfは参考サイトと同じもの(wp_first:1個だけ使う) sudo docker-compose up -d
version: "3.9"

services:
  nginx:
    image: nginx:1.25-alpine
    expose:
      - "80"
    volumes:
      - ./.docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
      - ./html:/var/www/html
    depends_on:
      - wp_first

  wp_first:
    image: wordpress:fpm-alpine
    volumes:
      - ./html:/var/www/html
    depends_on:
      - db
    restart: always
    environment:
     WORDPRESS_DB_HOST: db:3306
     WORDPRESS_DB_USER: ${DB_USER}
     WORDPRESS_DB_PASSWORD: ${DB_PASSWD}
     WORDPRESS_DB_NAME: ${DB_NAME}

  db:
    image: mysql:latest
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
     MYSQL_ROOT_PASSWORD: ${DB_ROOT}
     MYSQL_DATABASE: ${DB_NAME}
     MYSQL_USER: ${DB_USER}
     MYSQL_PASSWORD: ${DB_PASSWD}
volumes:
    db_data:
networks:
  default:
      name: shared
      external: true

結果

free
              total        used        free      shared  buff/cache   available
Mem:         987916      544908      107000       26060      336008      254084
Swap:       2097148     1060116     1037032

ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem
    PID    PPID CMD                         %MEM %CPU
 720698  720673 mysqld                      13.9  0.7
 707742  707664 /home/user/.vscode-serve  5.2  0.5
    930       1 /usr/bin/dockerd -H fd:// -  3.7  0.1
 707838  707742 /home/user/.vscode-serve  3.5  0.2
 722805  722628 nginx: worker process        3.3  0.0
 722806  722628 nginx: worker process        3.3  0.0
 721165  720785 php-fpm: pool www            3.3  0.0
    352       1 /lib/systemd/systemd-journa  3.2  0.0
 721164  720785 php-fpm: pool www            3.2  0.0
 722628  722606 nginx: master process nginx  3.0  0.0
 712614  707742 /home/user/.vscode-serve  2.9  0.2
    590       1 /sbin/multipathd -d -s       1.8  0.0
    784       1 /usr/bin/containerd          1.6  0.0
 712620  707742 /home/user/.vscode-serve  1.2  0.0
    752       1 /usr/lib/snapd/snapd         0.8  0.0
    747       1 /usr/bin/python3 /usr/bin/n  0.8  0.0
      1       0 /sbin/init                   0.8  0.0
多分赤字が前のapatch2がやっていたプロセスの代わりになる部分だと思います。
軽くなったような気はしますが劇的に減っているわけでもないです。
これでしばらく使ってみます。
その後cocoonのテーマをいれるときに気づいたこと

テーマをアップロードなど容量の大きいファイルをアップロードするときは
今回Nginxは2つになるのでWordPressのほうのNginxも
client_max_body_size 任意のサイズ(例32)m;
を追加してサイズを広げないとエラーになります。
詳細は↓

waf-nginx+Nginx+fpm-alpineの動作解説

1年間、以下の構成で動かしていました。

  1. HTTPリクエストの受信 (waf-Nginx コンテナ):
    ユーザーがブラウザに https://kikuichige.com/30298/ と入力してアクセスすると、まずリクエストはwaf-nginx コンテナの443番ポートに届きます。
    そのままWordpress-nginxの80番ポートに送られます。
  2. Nginx コンテナ処理:
    受け取ったリクエストはwp_first コンテナの9000番ポート(PHP-FPM の/usr/local/etc/php-fpm.d/www.confの設定はlisten = 127.0.0.1:9000)に送信されます。
    注)Wordpress-nginxコンテナはwp_first コンテナのsharedネットワーク内でのIPアドレス宛に送信します。127.0.0.1宛てではありません。Claude(生成AI)に0.0.0.0:9000でlistenしろと言われたけど127.0.0.1:9000のままで大丈夫です。listen=127.0.0.1は、自分宛てのリクエストを受け付けるというふうに私は解釈しています。つまり自分から見たら自分は127.0.0.1だけど他の人から見ると別のIPアドレスになっているわけです。

    .docker/nginx/default.confの設定により処理します。
    fastcgi_index index.php;により 、処理する PHP ファイルは /index.php となります。
    また、 include fastcgi_params; により、必要な FastCGI パラメータ(REQUEST_URI には https://kikuichige.com/30298/ の情報を含む)が PHP-FPM に渡されます。
  3. wp_first コンテナ処理:
    wp_first コンテナ内で動作している PHP-FPM は、Nginx から受け取ったリクエストに基づき /var/www/html/index.php を実行します。
    WordPress の index.php が起動し、リクエストされた URI /30298/ を解析します。
    WordPress は、この URI に対応する投稿のデータをデータベースから取得する必要があるため、db コンテナの MySQL サーバーに接続します。
    /30298/ に対応する投稿のタイトル、本文、メタデータなどの情報がデータベースから読み込まれます。
  4. HTMLの生成 (wp_first コンテナ):
    読み込まれた投稿データと、現在アクティブな WordPress テーマのテンプレートファイル (/var/www/html/wp-content/themes/...) を使用して、WordPress はリクエストされたページの HTML を動的に生成します。
  5. レスポンスの送信 (Nginx コンテナ):
    生成された HTML は、wp_first コンテナから Nginx コンテナに FastCGI プロトコルを通じて返送されます。
    Nginx コンテナ、waf-Nginx コンテナを経由して、この HTML を HTTP レスポンスとしてユーザーのブラウザに送信します。
  6. ブラウザでの表示:
    ユーザーのブラウザは、受信した HTML を解析し、ウェブページとして表示します。このページには、投稿のタイトル、本文。画像、CSS などはリンクなので、そのリンクの情報をもとにサーバーへ取りに行きます。

共有ボリューム (./html:/var/www/html) の役割:

この一連の動作において、共有ボリューム(Nginx と wp_first で共有されている)は以下の点で重要です。

  • WordPress のコードの実行: wp_first コンテナ内の PHP-FPM が /var/www/html/index.php やその他の WordPress のコアファイル、テーマファイル、プラグインファイルにアクセスするために必要です。
  • 静的ファイルの提供: 生成された HTML 内で参照される画像、CSS、JavaScript ファイルなどは、Nginx が /var/www/html/ 以下から直接提供するために使用されます(ユーザーのブラウザが HTML を解析した後、画像や CSS のリクエストがくるので、Nginx が ./html:/var/www/html から出力します)。

サービス名、コンテナ名、ホスト名を理解する

この辺を整理しておかないとNginxのconfファイルでリクエストを送る先をどのように指定したらいいか困ります。Geminiにいろいろ聞きました。不思議だったのが2番目の疑問でしたがスッキリしました。
基本的にはコンテナ名をしっかり指定していくのがいいと思いました。

1,docker-compose.ymlでservices:に定義しているname:はコンテナの名前になるのか。container_name:との関係やコンテナの名前の付け方を教えて。

はい、ご質問ありがとうございます。docker-compose.ymlservices: に定義する name: は、直接的にはコンテナの名前にはなりません

services: で定義する名前は、Docker Compose における サービスの名前 を指します。これは、複数のコンテナをまとめて管理するための論理的な単位です。

コンテナの名前を直接指定するために使用するオプションは、container_name: です。

以下に、それぞれの役割と関係性、コンテナの名前の付け方について詳しく説明します。

services:name: (サービス名)

  • docker-compose.ymlservices: セクションで定義する名前は、そのサービス全体を指す論理名です。
  • この名前は、Docker Compose のコマンド (docker-compose up, docker-compose scale, docker-compose logs など) でサービスを指定する際に使用します。
  • また、Docker Compose が自動的に作成するコンテナ名、ネットワーク名、ボリューム名などの一部に、このサービス名がプレフィックスとして使用されます(デフォルト設定の場合)。
  • サービス名自体は、実行中のコンテナの内部や、同じネットワーク内の他のコンテナから直接ホスト名として参照できるわけではありません(特別な設定を除く)。

container_name:

  • services: の各サービス定義の中で、container_name: オプションを使用すると、そのサービスに属するコンテナの具体的な名前を明示的に指定できます。
  • container_name: を指定した場合、Docker Compose は指定された名前でコンテナを作成します。
  • container_name: を指定しない場合、Docker Compose はデフォルトで <プロジェクト名>_<サービス名>_<連番> という形式でコンテナ名を自動的に生成します。<プロジェクト名>docker-compose.yml が置かれているディレクトリ名がデフォルトで使用されます。

コンテナの名前の付け方

コンテナに名前を付ける方法は主に以下の2つです。

  1. container_name: オプションで明示的に指定する:
    • 特定のコンテナに固定の名前を付けたい場合に便利です。
    • 例えば、データベースのコンテナに db、Webアプリケーションのコンテナに web のように、役割が明確な場合に分かりやすい名前を付けることができます。
    • ただし、スケールアップ(同じサービスを複数起動する)を行う場合は、コンテナ名が重複するため、container_name: を直接指定するとエラーになります。スケールアップを考慮する場合は、自動生成の名前を使用するか、後述する環境変数などを利用した命名規則を検討する必要があります。
  2. Docker Compose による自動生成に任せる:
    • container_name: を指定しない場合、Docker Compose が自動的に一意なコンテナ名を生成します。
    • デフォルトの命名規則は <プロジェクト名>_<サービス名>_<連番> です。
    • 例えば、プロジェクト名が myproject、サービス名が web の場合、1つ目のコンテナは myproject_web_1、2つ目のコンテナは myproject_web_2 のようになります。
    • スケールアップを容易に行えるため、一般的な利用方法です。

container_name: 使用時の注意点

  • container_name: で指定する名前は、Docker ホスト内で一意である必要があります。既に同じ名前のコンテナが存在する場合は、コンテナの作成に失敗します。
  • スケールアップを行うサービスに対して container_name: を指定すると、複数のコンテナが同じ名前になろうとして競合し、エラーが発生します。

まとめ

  • services:name: は Docker Compose におけるサービスの名前(論理名)です。
  • コンテナの名前を明示的に指定するには、サービス定義内で container_name: オプションを使用します。
  • container_name: を省略した場合、Docker Compose は自動的にコンテナ名を生成します。
  • コンテナ名の付け方は、固定名が必要か、スケールアップを考慮するかによって選択すると良いでしょう。

より具体的な例を示します。

YAML

version: '3.8'
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    container_name: my-web-app  # コンテナ名を明示的に指定
  db:
    image: postgres:13
    environment:
      POSTGRES_PASSWORD: mysecretpassword
    # container_name: my-db  # こちらもコンテナ名を明示的に指定することも可能

この例では、web サービスに属するコンテナの名前は my-web-app となり、db サービスに属するコンテナの名前は my-db となります(container_name: のコメントアウトを外した場合)。

もし container_name: を指定しない場合、例えばこの docker-compose.ymlmyproject ディレクトリにあるとすると、web サービスのコンテナ名は myproject_web_1db サービスのコンテナ名は myproject_db_1 のように自動的に生成されます。

ご不明な点があれば、お気軽にご質問ください。

2,以下のNginxの設定で、docker psで調べたコンテナの名前はwordpress-wp_first-1です。これでもちゃんと動いているのはなぜ?

.docker/nginx/default.conf

upstream wp_fastcgi_passes {
    least_conn;
    server wp_first:9000;
}

はい、ご質問ありがとうございます。docker ps で確認されたコンテナ名が wordpress-wp_first-1 であるにも関わらず、Nginx の設定で wp_first というホスト名で WordPress コンテナにアクセスできているのは、Docker Compose がサービス名を DNS ホスト名として内部的に解決しているからです。

詳しくご説明します。

Docker Compose の内部 DNS

Docker Compose は、定義された各サービスに対して、サービス名を DNS ホスト名として自動的に登録します。同じ Docker Compose ネットワーク内に存在するコンテナであれば、サービス名を使って互いに名前解決ができるようになっています。

今回のケースでは、docker-compose.ymlwp_first というサービス名で WordPress コンテナが定義されていると考えられます。Docker Compose は、この wp_first というサービス名を、そのサービスに属するコンテナ(通常は複数ありえますが、スケールが 1 の場合は zakword-wp_first-1 のような名前になります)の IP アドレスに内部的に関連付けます。

したがって、Nginx コンテナ内の default.confupstream wp_fastcgi_passes のサーバーとして wp_first:9000 を指定することで、Nginx は Docker の内部 DNS を通じて wp_first という名前を WordPress コンテナの IP アドレスとポート番号に解決し、通信を行うことができるのです。

container_name: とサービス名の関係

docker ps で表示される wordpress-wp_first-1 は、Docker Compose が自動的に生成したコンテナ名である可能性が高いです。これは、docker-compose.ymlwp_first サービス定義で container_name: が明示的に指定されていない場合に起こります。

デフォルトでは、Docker Compose は <プロジェクト名>_<サービス名>_<連番> という形式でコンテナ名を生成します。wordpress-wp がプロジェクト名、first がサービス名の一部(またはサービス名全体)、1 が連番であると推測できます。

重要なのは、Nginx の設定で参照しているのは コンテナ名 ではなく、docker-compose.yml で定義された サービス名 (wp_first) であるという点です。Docker Compose はこのサービス名を内部的に管理し、対応するコンテナの IP アドレスを紐付けているため、コンテナ名が wordpress-wp_first-1 であっても問題なく通信できるのです。

まとめ

  • Docker Compose は、サービス名を内部 DNS のホスト名として自動的に登録します。
  • 同じ Docker Compose ネットワーク内のコンテナは、サービス名を使って互いに名前解決が可能です。
  • Nginx の設定で wp_first を指定することで、Docker の内部 DNS が WordPress コンテナの IP アドレスに解決し、通信が行われます。
  • docker ps で表示されるコンテナ名は自動生成されたものであっても、サービス名による名前解決が機能するため、設定は正しく動作します。

このように、Docker Compose を利用する大きなメリットの一つは、コンテナの具体的な IP アドレスや個々のコンテナ名を意識せずに、サービス名という抽象的な名前で連携できる点です。これにより、システムの構成変更やスケールアップなどがより柔軟に行えるようになります。

個人的意見

サービス名だと今回のように、今回の件を忘れたときに、なぜ一致するのか疑問がわいてくると思うので、コンテナ名で記述していく方が分かりやすいと思った。
また、Docker psで見るとコンテナ名が出てきてサービス名は出てこないので、この点でもコンテナ名のほうが扱いやすい。
ただし、他のGeminiの答えではサービス名を使うことを推奨している。
ということで私は、基本コンテナ名を使っていき、問題が発生したら、サービス名に変えてみる方法をとろうと思う。

3,docker-compose.ymlで    container_name: と    hostname: の違いは

docker-compose.yml における container_name:hostname: は、どちらもコンテナに関連する名前を設定しますが、その目的とスコープが異なります。

container_name:

  • 目的: Docker Compose によって作成されるコンテナに、ホストマシン上 で認識される名前を明示的に指定します。
  • スコープ: ホストマシンの Docker クライアント(docker ps, docker logs など)や Docker ネットワーク内でコンテナを識別するために使用されます。
  • 特性:
    • 指定しない場合は、Docker Compose がデフォルトで <プロジェクト名>_<サービス名>_<連番> という形式で自動的に生成します。
    • 明示的に指定することで、コンテナの管理や参照が容易になります。
    • Docker ネットワーク内での名前解決には直接的な影響を与えません (サービス名が DNS ホスト名として機能します)。
    • スケールアップ (同じサービスを複数起動する) を行う場合は、コンテナ名が重複するため、通常は container_name: を指定しません。指定するとエラーになります。

hostname:

  • 目的: コンテナ内部で認識されるホスト名を指定します。
  • スコープ: コンテナ内で hostname コマンドを実行した際や、コンテナ内で動作するアプリケーションが自身のホスト名を参照する際に使用されます。
  • 特性:
    • 指定しない場合は、Docker がコンテナ ID をデフォルトのホスト名として設定します。
    • コンテナ内で特定のホスト名が必要なアプリケーションや、設定ファイルなどで自身のホスト名を参照する場合に役立ちます。
    • Docker ネットワーク内の名前解決における主要な役割は、一般的にはサービス名が担います。 hostname: で設定した名前も、同じネットワーク内の他のコンテナから名前解決できる場合がありますが、サービス名の方がより一般的で推奨される方法です。

まとめ

項目container_name:hostname:
目的ホストマシン上でのコンテナの識別名を指定コンテナ内部で認識されるホスト名を指定
スコープホストマシン、Docker ネットワークでのコンテナ管理コンテナ内部
デフォルト<プロジェクト名>_<サービス名>_<連番>コンテナ ID
ネットワーク直接的な名前解決への影響は少ない (サービス名が主)同じネットワーク内で名前解決できる場合がある
スケール通常は指定しない (重複エラーの可能性)スケールアップ時も個々のコンテナに設定可能

例:

YAML

version: '3.8'
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    container_name: my-web-app  # ホストマシン上でのコンテナ名
    hostname: webserver        # コンテナ内部でのホスト名
  db:
    image: postgres:13
    environment:
      POSTGRES_PASSWORD: mysecretpassword
    container_name: my-database  # ホストマシン上でのコンテナ名
    hostname: dbserver         # コンテナ内部でのホスト名

この例では、web サービスに対応するコンテナは、ホストマシン上では my-web-app という名前で認識され、コンテナ内部では webserver というホスト名を持ちます。同様に、db サービスに対応するコンテナは、ホストマシン上では my-database、内部では dbserver という名前になります。

通常、コンテナ間の連携にはサービス名 (web, db) が Docker の内部 DNS によって利用されるため、hostname: を明示的に設定する必要性は低いことが多いです。hostname: は、コンテナ内で動作する特定のアプリケーションの要件に合わせて設定することがあります。

Nginxは1個でいいなと思い、1個にしたものを試験運用中(2025/5/9~)

.htaccessは使えない

.htaccessはapatch用なのでNginxでは関係ないようです。
.htaccessでアクセス制限したつもりでいたら、ログを見るとアクセスされていたので気づきました。
ということでwafの入っているほうのNginxではじくようにした。
念のため最初から作り直した。(ログ見たら100回ぐらいアッタックしてきたのがあったので)
WordPress関連のコンテナ3つとボリュームを削除して

suでrootユーザになって
ホストにバインドしてあるhtmlディレクトリを削除
rm -r html
sudo docker-compose up -d
Nginxのconfで追加したコード
# /wp-admin へのアクセスを許可
    location /wp-admin {
        allow ***.***.***.***;
        deny all;
        proxy_pass http://WordPressのNginxのコンテナ;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-For $remote_addr;
        modsecurity_rules '
            SecRule REMOTE_ADDR "@ipMatch ***.***.***.***" "phase:1,id:777,nolog,allow,ctl:ruleEngine=Off,ctl:auditEngine=Off"
        ';
    }

上と同じコードで/wp-adminを
それぞれ/wp-login.php 、/wp-cron.php、/wp-json に変えて合計4つ作った。
これは自分のIPだけ通すようにした。

こちらは自分も含めアクセス不可にした。
    location ~ /(xmlrpc\.php|wp-config\.php|wlwmanifest\.xml|license\.txt|readme\.html|wp-config-sample\.php) {
        deny all;
        return 403;
    }

Nginxのlocationの設定は書き方が難しいのであっているか分からないです。
4つにわかれているのも1つにしようとしたけどあきらめました。
目次へ

所感

メモリ使用量も減った感じはする。freeで見て700M超えることが少なくなった。
またWordPressの表示動作も管理画面の動作も速いような気がする。
PageSpeed Insightsで見るとそうでもないのだが。
レンタルサーバーのブログをそろそろ移行するので
移行してみて、このまま使うか判断したい。
(2024/4/15移行完了)
イチゲをOFUSEで応援する(御質問でもOKです)Vプリカでのお支払いがおすすめです。
MENTAやってます(ichige)
目次へ

コメント

タイトルとURLをコピーしました