このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Docker入門】コンテナのネットワーク②

コンテナのネットワークの概要

 Docker Composeを使用すると、デフォルトで専用のネットワークが作成され、サービス間の通信が容易になります。「link」オプションは非推奨であり、代わりにComposeファイル内でネットワークを明示的に定義することが推奨されます。

 外部からコンテナに通信するにはポートフォワーディングが必要であり、これによりホストの特定のポートからコンテナのポートへのトラフィックが転送されます。ポートフォワーディングに関連するエラーには、ポートの競合やネットワーク設定の誤りが含まれます。

 Docker Composeで明示的にネットワークを作成するには、Composeファイル内でネットワークを定義し、サービスに割り当てます。

 ここでは、前半でコンテナのネットワークについて解説し、後半で、コンテナ間の通信、そして、コンテナ外とコンテナ内の通信ができるように実際にDockerのネットワークを構築していきます。

Docker Composeにおける専用のネットワーク

 Docker Composeを使用すると、デフォルトで専用のネットワークが作成されます。これにより、Composeファイル内で定義されたサービス間での通信が容易になります。各サービスは、そのネットワーク内のDNS名で相互にアクセスできます。

linkオプションの非推奨性

 以前は、「link」オプションを使用してコンテナ間の通信を行う方法がありましたが、現在では非推奨とされています。代わりに、各サービスはComposeファイル内で明示的に定義されたネットワーク内で通信することが推奨されます。

外部からコンテナに通信する方法

 コンテナの外部からコンテナ内のアプリケーションに通信する場合、ポートフォワーディングが必要です。これにより、ホストの特定のポートからコンテナ内のポートへのトラフィックが転送されます。例えば、ホストのポート8080をコンテナのポート80に転送する場合、次のようにします。

docker run -p 8080:80 image_name

ポートフォワーディングでよく起きるエラー

 ポートフォワーディングに関連する一般的なエラーには、ポートがすでに他のプロセスに使用されているためにバインドできない場合や、ネットワーク設定が正しくない場合などがあります。

 ポートが既に使用されている場合は、他のポートを使用するか、既存のプロセスを停止する必要があります。ネットワーク設定が正しくない場合は、ホストとコンテナの間で適切な通信ができるように設定を調整する必要があります。

 具体的には、Dockerホストのポート番号を1つずらすなどして、使われていないポート番号に変更して実行します。例えば、「ports」のところで1つ目のコンテナに「8080:80」を2つ目のコンテナに「8081:80」のように指定します。

 よく使用するホスト側のWebサービスのポート番号には、「80」「8080」「10080」などがあります。

Docker Composeで明示的にネットワークを作成する方法

 Docker Composeで明示的にネットワークを作成するには、Composeファイルでネットワークを定義します。以下はその例です。

services:
  web:
    image: nginx
    networks:
      - mynetwork
  db:
    image: mysql
    networks:
      - mynetwork
networks:
  mynetwork:

 このようにして、「mynetwork」という名前のネットワークを定義し、それを各サービスに割り当てます。これにより、Composeファイル内のサービスは同じネットワーク内で通信できます。

Dockerネットワークの構築

 ここから、コンテナ間の通信、そして、コンテナ外とコンテナ内の通信ができるように実際にDockerのネットワークを構築します。

WordPressコンテナの作成

Docker Composeコマンドを使って、WordPressコンテナを構築していきます。

構築するコンテナとネットワークの構成は下図のとおりです。

compose.yaml の作成

ディレクトリの作成と移動

Docker Composeでコンテナを作成するには、「compose.yaml」ファイルが必要になります。

 デフォルトでは、カレントディレクトリにある「compose.yaml」ファイルが読み込まれるため、作業ディレクトリに移動しておきます。

・「cd desktop/docker」コマンドを実行します。

PS C:\Users\joeac> cd desktop/docker
PS C:\Users\joeac\Desktop\docker>

 「compose.yaml」ファイルを保存する「wordpress1」ディレクトリを作成して、作成したディレクトリに移動します。次のコマンドを実行します。

  • 「mkdir wordpress3」コマンド
  • 「cd wordpress3」コマンド
PS C:\Users\joeac\Desktop\docker> mkdir wordpress3

    Directory: C:\Users\joeac\Desktop\docker

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          2024/04/13     1:01                wordpress3

PS C:\Users\joeac\Desktop\docker> cd wordpress3
PS C:\Users\joeac\Desktop\docker\wordpress3>

VSCodeの起動

VSCodeで「compose.yaml」ファイルを作成します。

・「code compose.yaml」コマンドを実行します。

PS C:\Users\joeac\Desktop\docker\wordpress3> code compose.yaml

VSCodeが起動します。

「compose.yaml」ファイルの編集

・「compose.yaml」ファイルを以下のように編集して保存します。

services:
  wpdb:
    image: mariadb:10.8
    environment:
      MARIADB_ROOT_PASSWORD: root-pass
      MARIADB_DATABASE: database
      MARIADB_USER: wp-user
      MARIADB_PASSWORD: wp-pass
    networks:
      - wpnetwork
    volumes:
      - db-data:/var/lib/mysql

  wordpress:
    image: wordpress:6.5
    networks:
      - wpnetwork
    depends_on:
      - wpdb
    environment:
      WORDPRESS_DB_HOST: wpdb
      WORDPRESS_DB_NAME: database
      WORDPRESS_DB_USER: wp-user
      WORDPRESS_DB_PASSWORD: wp-pass
    ports:
      - "8080:80"    
    volumes:
      - wp-data:/var/www/html

networks:
  wpnetwork:
volumes:
  db-data:
  wp-data:

定義内容の解説

「compose.yaml」ファイルの定義を解説します。

 このComposeファイルでは、WordPressのWebアプリケーションとデータベースのサービスが定義されており、それぞれが独自の設定とネットワーク上の位置を持っています。WordPressサービスは「wpdb」データベースサービスに依存しており、wpnetworkネットワークに参加しています。また、WordPressのWebアプリケーションはホストのポート80にマッピングされて公開されています。データ永続化のために、それぞれのサービスがボリュームを使用しています。

サービス名イメージ環境変数ネットワーク依存関係ポートの転送ボリューム
wpdbmariadb:10.8MARIADB_ROOT_PASSWORDwpnetworkなしなしdb-data:/var/lib/mysql
MARIADB_DATABASE
MARIADB_USER
MARIADB_PASSWORD
wordpresswordpress:6.5WORDPRESS_DB_HOSTwpnetworkwpdb80:80wp-data:/var/www/html
WORDPRESS_DB_NAME
WORDPRESS_DB_USER
WORDPRESS_DB_PASSWORD
compose.yaml」ファイルの定義
  • サービス名: コンテナの識別子です。
  • イメージ: 使用されるDockerイメージです。
  • 環境変数: 各コンテナに渡される環境変数です。
  • ネットワーク: コンテナが参加するネットワークの名前です。
  • 依存関係: コンテナが他のコンテナに依存していることを示します。
  • ポートの転送: ホストのポートとコンテナのポートのマッピングです。
  • ボリューム: データ永続化のために使用されるボリュームのマウントポイントです。

依存関係の定義

 このDocker Composeファイルの定義では、WordPressサービスがMariaDBサービスに依存しています。依存関係は以下のように定義しています。

wordpress:
凵凵depends_on:
凵凵凵凵-wpdb

※「凵」は半角スペースを表しています。

 上の部分が依存関係を表しており、WordPressサービスが起動する前に、wpdb(MariaDBサービス)が起動することを要求しています。

WordPressはデータベースに接続しないと使用できません。

コンテナの作成と実行

・「docker compose up -d」コマンドを実行します。

このコマンドは、「compose.yaml」ファイルを配置した場所で実行する必要があります。

PS C:\Users\joeac\Desktop\docker\wordpress3> docker compose up -d
[+] Running 31/2
 ✔ wordpress 21 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                             14.9s
 ✔ wpdb 8 layers [⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                                                 9.3s
[+] Running 2/5
 - Network wordpress3_wpnetwork      Created                                                                       1.2s
 - Volume "wordpress3_wp-data"       Created                                                                       1.1s
 - Volume "wordpress3_db-data"       Created                                                                       1.1s
 ✔ Container wordpress3-wpdb-1       Started                                                                       0.8s
 ✔ Container wordpress3-wordpress-1  Started

 「Network wordpress3_wpnetwork Created」の出力から、「wpnetwork 」が作成されていることが確認できます。

・Docker Desktopでコンテナを確認します。

 MariaDBとWordPressの2つのコンテナが作成されて動作しているため、コンテナを示すアイコンが緑色になっています。

コンテナが、緑色になってない場合は、何らかの問題が発生しています。

「compose.yaml」の定義の間違いが疑わしいので、トラブルシューティングを行ってください。

WordPressにアクセスする

・Webブラウザを起動して、URLに「localhost:8080」と入力します。

WordPressの初期セットアップのページが表示されます。

・「日本語」を選択して「次へ」ボタンをクリックします。

日本語で、WordPressの初期セットアップが進んでいきます。

ここでは、WordPressの初期セットアップの完了まで進めて、サイトの構築までを行いません。

Dockerネットワークの確認

Dockerネットワークを確認します。

・「docker network ls」コマンドを実行します。

PS C:\Users\joeac\Desktop\docker\wordpress3> docker network ls
NETWORK ID     NAME                   DRIVER    SCOPE
78a52a23e094   bridge                 bridge    local
9cb62d828092   host                   host      local
1bafb53e8f6c   none                   null      local
72af286b8e77   wordpress3_wpnetwork   bridge    local

 NAME列に「wordpress3_wpnetwork」があります。「wordpress3」という文字列は、プロジェクト名を表しており、「wpnetwork」が存在することが確認できます。

・「docker network inspect wordpress3_wpnetwork」コマンドを実行します。

PS C:\Users\joeac\Desktop\docker\wordpress3> docker network inspect wordpress3_wpnetwork
[
    {
        "Name": "wordpress3_wpnetwork",
        "Id": "72af286b8e771cdec3d711d4bc3f825c695e840b8a8bdb144a9b71061e6fec8b",
        "Created": "2024-04-13T06:12:04.461530199Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.20.0.0/16",
                    "Gateway": "172.20.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "0943e1dddf1d2d08d040f682fe33f96bfe595eff32e771cc1cba1db7881d91af": {
                "Name": "wordpress3-wpdb-1",
                "EndpointID": "38c9d85b51d5666e5d40cf1af357e5bd01fe71a66e4c55bbe13eef51e215fea4",
                "MacAddress": "02:42:ac:14:00:02",
                "IPv4Address": "172.20.0.2/16",
                "IPv6Address": ""
            },
            "1abb8e1f0557cdbcf5e1b8bc6f5766541bc819ecf78ec6ba126f530e818a7ff7": {
                "Name": "wordpress3-wordpress-1",
                "EndpointID": "0434298000b68291a9f0f05900bda0e4cd4a33e4b70f322ce426ae2399f46aed",
                "MacAddress": "02:42:ac:14:00:03",
                "IPv4Address": "172.20.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {
            "com.docker.compose.network": "wpnetwork",
            "com.docker.compose.project": "wordpress3",
            "com.docker.compose.version": "2.24.6"
        }
    }
]
PS C:\Users\joeac\Desktop\docker\wordpress3>

下図の赤枠に注目します。

 WordPressコンテナとMriaDBコンテナが「wpnetwork」に接続されており、それぞれのMACアドレスとIPアドレスを確認することができます。

ポート番号の紐づけの確認

・「docker container ls」コマンドを実行します。

PS C:\Users\joeac\Desktop\docker\wordpress3> docker container ls
CONTAINER ID   IMAGE           COMMAND                   CREATED          STATUS          PORTS                  NAMES
1abb8e1f0557   wordpress:6.5   "docker-entrypoint.s…"   28 minutes ago   Up 28 minutes   0.0.0.0:8080->80/tcp   wordpress3-wordpress-1
0943e1dddf1d   mariadb:10.8    "docker-entrypoint.s…"   28 minutes ago   Up 28 minutes   3306/tcp               wordpress3-wpdb-1

下図の赤枠に注目します。

 WordPressコンテナがホストのポート番号8080とコンテナのポート番号80を紐づけていること、MariaDBコンテナがポート番号3306を使用していることが確認できます。

関連コンテンツ