Dockerのネットワーク設定を理解する: 適切なモード選択がもたらす効果

はじめに: Dockerとは何か?

Dockerは、アプリケーションを簡単に実行できる「コンテナ」という技術を使います。コンテナは、ソフトウェアやその依存関係をすべて1つのパッケージにまとめることで、異なる環境でも同じように動作するように設計されています。つまり、開発環境やテスト環境、本番環境など異なる環境間での動作の違いを気にせずにアプリケーションを実行できるのです。

なぜDockerを選んだのか?

今回は、クラウドサービスに設置したCMSサイトへのアクセスが少なかったため、自宅サーバーに移行することにしました。この移行に際して、簡単にアプリケーションを設定・管理できるDockerを利用することにしました。

Dockerを使う理由

これまでバックアップやリストアなどの作業を手動で行っていましたが、Dockerを使うことで手間を大幅に削減できます。Dockerは、アプリケーションの環境をコンテナとして独立させ、簡単に再現可能にする技術です。

例えば、Drupalのウェブサイトを自宅サーバーに移行する場合でも、Dockerを使えば、どんな環境でも簡単に動作させることが可能になります。

使用環境の準備

現在の環境はUbuntu 24.04で構築されています。Dockerはすでにインストールされており、LAN内の他のPCからはSSHで接続して作業を進めます。次に、Dockerを使用して実際にDrupalを動かす手順に進みます。

最新のDrupal 11をDockerで使ってみよう

今回は、最新のDrupal 11を使ってウェブサイトを構築してみましょう。Drupal 11は2024年8月にリリースされ、最新のPHP 8.3をベースにしています。このバージョンは、より柔軟で強力な拡張機能を提供しており、Alpine Linux 3.20をベースにしています。

まずは、Dockerを使ってDrupal 11をセットアップする手順を確認していきましょう。

ステップ1: Drupal 11のイメージを取得

Drupal 11のDockerイメージを取得するには、以下のコマンドを実行します。このコマンドでは、最新のDrupal 11.0.1バージョンがダウンロードされます。

docker pull drupal:11

このコマンドで、公式のDocker Hubから最新のDrupalイメージがダウンロードされます。イメージには、PHP 8.3と必要な拡張機能がすでに含まれており、すぐに使える状態になっています。

ステップ2: イメージの確認

次に、ダウンロードしたイメージが正しく取得されているかを確認します。

docker images

ここで、drupal:11という名前がリストに表示されれば成功です。

ステップ3: Drupalコンテナの作成と起動

取得したDrupalイメージを使ってコンテナを作成し、起動します。このとき、以下のコマンドを使用して、ポート80をマッピングし、外部からアクセスできるように設定します。

docker run \
--name drupal11 \
-p 80:80 \
-d drupal:11

このコマンドでは、以下のオプションを指定しています。

  • --name drupal11: コンテナに「drupal11」という名前をつけます。
  • -p 80:80: コンテナのポート80をホストのポート80にマッピングします。これにより、ブラウザからコンテナにアクセスできるようになります。
  • -d drupal:11: Drupal 11のイメージをデタッチドモードでバックグラウンドで実行します。

ステップ4: コンテナの動作確認

コンテナが正しく起動したかを確認するために、以下のコマンドを実行します。

docker ps

起動中のコンテナリストに「drupal11」が表示されていれば、コンテナは正常に動作しています。

Drupal 11のDockerfileについて

Drupal 11のDockerイメージは、最新のPHP 8.3を使用しており、Alpine Linux 3.20をベースにしています。これにより、軽量かつ効率的に動作します。また、Composerを使って依存関係を簡単に管理できるようになっています。具体的には、次のようなPHP拡張機能がインストールされています。

  • gd(画像処理用)
  • opcache(パフォーマンス最適化用)
  • pdo_mysqlおよびpdo_pgsql(データベース接続用)

Dockerfileには、パフォーマンス向上のために推奨されるopcache設定も含まれており、これによってメモリ使用量やキャッシュが最適化されています。

GitHub - docker-library/drupal: Docker Official Image packaging for Drupal
Docker Official Image packaging for Drupal. Contribute to docker-library/drupal development by creating an account on Gi...
#
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
#
# PLEASE DO NOT EDIT IT DIRECTLY.
#

# https://www.drupal.org/docs/system-requirements/php-requirements
FROM php:8.3-fpm-alpine3.20

# install the PHP extensions we need
RUN set -eux; \
	\
	apk add --no-cache --virtual .build-deps \
		coreutils \
		freetype-dev \
		libjpeg-turbo-dev \
		libpng-dev \
		libwebp-dev \
		libzip-dev \
# postgresql-dev is needed for https://bugs.alpinelinux.org/issues/3642
		postgresql-dev \
	; \
	\
	docker-php-ext-configure gd \
		--with-freetype \
		--with-jpeg=/usr/include \
		--with-webp \
	; \
	\
	docker-php-ext-install -j "$(nproc)" \
		gd \
		opcache \
		pdo_mysql \
		pdo_pgsql \
		zip \
	; \
	\
	runDeps="$( \
		scanelf --needed --nobanner --format '%n#p' --recursive /usr/local \
			| tr ',' '\n' \
			| sort -u \
			| awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \
	)"; \
	apk add --no-network --virtual .drupal-phpexts-rundeps $runDeps; \
	apk del --no-network .build-deps

# set recommended PHP.ini settings
# see https://secure.php.net/manual/en/opcache.installation.php
RUN { \
		echo 'opcache.memory_consumption=128'; \
		echo 'opcache.interned_strings_buffer=8'; \
		echo 'opcache.max_accelerated_files=4000'; \
		echo 'opcache.revalidate_freq=60'; \
	} > /usr/local/etc/php/conf.d/opcache-recommended.ini

COPY --from=composer:2 /usr/bin/composer /usr/local/bin/

# 2024-08-08: https://www.drupal.org/project/drupal/releases/11.0.1
ENV DRUPAL_VERSION 11.0.1

# https://github.com/docker-library/drupal/pull/259
# https://github.com/moby/buildkit/issues/4503
# https://github.com/composer/composer/issues/11839
# https://github.com/composer/composer/issues/11854
# https://github.com/composer/composer/blob/94fe2945456df51e122a492b8d14ac4b54c1d2ce/src/Composer/Console/Application.php#L217-L218
ENV COMPOSER_ALLOW_SUPERUSER 1

WORKDIR /opt/drupal
RUN set -eux; \
	export COMPOSER_HOME="$(mktemp -d)"; \
	composer create-project --no-interaction "drupal/recommended-project:$DRUPAL_VERSION" ./; \
# https://github.com/docker-library/drupal/pull/266#issuecomment-2273985526
	composer check-platform-reqs; \
	chown -R www-data:www-data web/sites web/modules web/themes; \
	rmdir /var/www/html; \
	ln -sf /opt/drupal/web /var/www/html; \
	# delete composer cache
	rm -rf "$COMPOSER_HOME"

ENV PATH=${PATH}:/opt/drupal/vendor/bin

# vim:set ft=dockerfile:

ステップ5: ネットワークの確認

Drupalのコンテナが正常に起動したことを確認したので、次にネットワークの設定を確認しましょう。コンテナがどのIPアドレスを使用しているかを調べるためには、以下のコマンドを実行します。

ip a

このコマンドで、現在のPCのIPアドレスが表示されます。ここでは、192.168.0.10がIPアドレスとして判明しました。

ステップ6: 他のPCからアクセスしてみる

次に、LAN内の他のPCからブラウザを使って、このDrupalコンテナにアクセスしてみましょう。以下のURLをブラウザのアドレスバーに入力します。

http://192.168.0.10

ブラウザでアクセスして、Drupalのインストール画面が表示されます。正常に表示されたら、コンテナが正しく動作していることが確認できます。

データベースの詳細は今回は省略

本来、DrupalはMySQLなどのデータベースを必要としますが、今回はネットワークの動作確認が主な目的なので、データベースの設定については説明を省略します。ここでは、コンテナが正常に起動し、ネットワークが正しく機能していることを確認することに重点を置いています。

下図はホストとコンテナに割り当てるポートの関係。

各ネットワークモードについての説明

ホストとコンテナのポート割り当て

まず、上図はホストとコンテナに割り当てられるポートの関係を示しています。

図の説明: ホストには複数のコンテナが存在し、それぞれのコンテナが異なるポートを使用して外部と通信します。例えば、コンテナ内部のポートが80でも、ホスト側では8080や5000といった異なるポートにマッピングされます。これにより、同じポート番号が重複することなく、複数のコンテナを同時に動作させることができます。

  • コンテナ1: 8080:80 (ホストの8080番ポートをコンテナの80番ポートにマッピング)
  • コンテナ2: 5000:80 (ホストの5000番ポートをコンテナの80番ポートにマッピング)
  • コンテナ3: 80:80 (ホストの80番ポートをコンテナの80番ポートにマッピング)

このポートのマッピングにより、同じホスト上で複数のウェブサーバーやサービスを並行して動作させることが可能です。


Dockerのネットワークモード

次に、Dockerのネットワークモードについて説明します。Dockerをインストールすると、自動的に3つのデフォルトネットワークが作成されます。これらは、それぞれ異なる用途に応じて使用されます。以下のコマンドでネットワーク一覧を確認できます。

docker network ls

表示されたネットワークは以下のようになります。

NETWORK ID NAME DRIVER SCOPE
4776e45bdad4 bridge bridge local
3557a34a50be host host local
16f8888fed53 none null local

ネットワークモードの詳細

  1. bridge(ブリッジ):
    • 概要: Dockerのデフォルトネットワークです。docker0という仮想インターフェースを介して、コンテナがホストや他のコンテナと通信します。新しく作成されるコンテナは特に指定がなければこのモードを使用します。
    • 特長: ホストとコンテナの間でポートフォワーディングを設定することで、外部からコンテナにアクセスできるようにします。例えば、8080:80のようにホストのポートをコンテナにマッピングします。
  2. host(ホスト):
    • 概要: コンテナはホストのネットワークを直接使用します。コンテナが独自のネットワークスタックを持たないため、ネットワークのオーバーヘッドが減り、パフォーマンスが向上します。
    • 特長: このモードでは、ホストと同じIPアドレスを共有するため、ポートマッピングは不要です。ただし、ホストとコンテナのネットワークが完全に共有されるため、セキュリティリスクが高くなります。
  3. none(なし):
    • 概要: このモードを選択すると、コンテナにはネットワークが割り当てられません。ネットワーク接続が不要なアプリケーションや、カスタムネットワークを利用する場合に適しています。
    • 特長: コンテナ間の通信や外部との通信は一切行えません。完全に隔離された状態になります。

このように、各ネットワークモードにはそれぞれの用途があり、目的に応じて使い分けることが重要です。続いて、実際にこれらのネットワークモードを使用して、コンテナ間や外部との通信を確認していきます。

Bridgeネットワークとは?

bridgeは、Dockerでデフォルトで使用されるネットワークモードです。このモードでは、コンテナがホストと他のコンテナとの通信を行うために、仮想的なネットワーク「ブリッジ」を使用します。具体的には、docker0という仮想インターフェースを介して、複数のコンテナが同じネットワーク上で通信することができます。


Bridgeネットワークの役割

Bridgeネットワークは、複数のコンテナを1つのネットワークに接続し、それぞれのコンテナが別々のIPアドレスを持つことができます。このネットワーク内では、各コンテナはお互いに通信することができ、ホストマシンや外部ネットワークと通信する場合には、ポートフォワーディングを使って接続されます。

例えば、以下のような状況を考えてみましょう。

  • コンテナ1がWebサーバーで、コンテナ2がデータベースを動かしている。
  • これらのコンテナが同じBridgeネットワーク内にある場合、コンテナ1はコンテナ2に直接接続してデータベースにアクセスできます。
  • 外部からアクセスする際は、ホストマシンの特定のポート(例えば8080)をコンテナのポート(80)にマッピングして通信します。

Bridgeネットワークの動作イメージ

: 以下の図は、bridgeネットワークの動作を簡単に示しています。

  • 仮想ブリッジ(docker0: これは、コンテナとホストの間にある仮想的なスイッチのような役割を果たし、コンテナ同士やホストとコンテナの間で通信を行います。
  • コンテナのIPアドレス: 各コンテナには、docker0経由で独自の内部IPアドレスが割り当てられ、同じネットワーク内で通信できます。

Bridgeネットワークの特徴

  • 簡単なコンテナ間通信: bridgeモードを使うと、コンテナ同士はIPアドレスを使って簡単に通信できます。
  • 外部ネットワークとの通信: 外部のPCやネットワークからコンテナにアクセスするためには、ホストのポートをコンテナのポートにマッピングする必要があります。これを「ポートフォワーディング」と呼びます。
    • 例: 8080:80と指定すると、ホストのポート8080にアクセスすることで、コンテナのポート80に接続できます。

このように、Bridgeネットワークはコンテナを隔離しつつも、ネットワーク内で柔軟に通信できる便利なモードです。特に、複数のコンテナを同時に使う場合や、ホストからのアクセスを制御したい場合に役立ちます。


Hostネットワークとは?

hostモードは、コンテナがホストPCのネットワークスタックを直接利用するネットワークモードです。このモードでは、コンテナ自身にはIPアドレスが割り当てられず、ホストのIPアドレスやポートをそのまま使用します。そのため、ホストとコンテナが同じネットワーク空間を共有している状態になります。


Hostネットワークの役割

hostモードでは、ホストのネットワークリソースを直接使用するため、コンテナとホストの間にネットワークの隔離がありません。これにより、コンテナがホストと同じIPアドレスを共有するため、以下のような動作になります。

  • コンテナがホストのIPアドレスをそのまま使うため、コンテナには独自のIPアドレスが割り当てられません。
  • コンテナ内のサービスは、ホストPCのポート番号を使ってアクセスされるため、外部からの接続に対してポートフォワーディングの設定が不要です。

Hostネットワークの動作イメージ

: 以下の図は、hostネットワークの動作を示しています。


Hostネットワークの特徴

ポートマッピング不要: コンテナはホストのネットワークポートをそのまま使用するため、ポートフォワーディングの設定が必要ありません。例えば、ホストのポート80で稼働しているサービスは、そのままコンテナ内のサービスにも反映されます。

ホストと同じネットワークを共有: hostモードでは、コンテナとホストが同じIPアドレスを使用し、コンテナに独立したIPアドレスが与えられません。

パフォーマンスの向上: ネットワークの仮想化が行われないため、通信のオーバーヘッドが少なく、パフォーマンスが向上します。ただし、コンテナがホストと同じネットワークスタックを使用するため、セキュリティリスクが高まる可能性があります。

hostネットワークモードを使用すると、コンテナもホストと同じIPアドレスを使用します。つまり、ホストのIPアドレスが10.0.0.5であれば、コンテナもこのIPアドレスを共有することになります。

具体的には、ホストとコンテナが同じネットワーク名前空間を使用するため、コンテナには新しいIPアドレスは割り振られません。したがって、外部ネットワークや他のデバイスからは、ホストとコンテナが同じIPアドレス(この場合、10.0.0.5)を使っているように見えます。

コンテナ内のサービスにはホストのポートをそのまま使用するため、例えばホストのポート80でWebサーバーを動かしている場合、外部から10.0.0.5:80にアクセスするとコンテナ内のWebサーバーに接続できます。

まとめると、hostモードでは以下のような動作になります:

  • ホストのIPアドレス (10.0.0.5) をコンテナも共有
  • ポートマッピング不要(ホストのポートを直接使用)
  • コンテナとホストはネットワーク的に同一の存在として扱われる

hostネットワークモードを使用している場合、複数のコンテナがあってもすべてのコンテナがホストと同じIPアドレスを共有します。つまり、ホストのIPアドレスが10.0.0.5であれば、複数のコンテナが存在していても、それぞれが同じ10.0.0.5のIPアドレスを使用します。

ただし、注意が必要なのはポートの競合です。hostモードでは、コンテナとホストが同じネットワーク名前空間を使用するため、同じポートを複数のコンテナで同時に使うことはできません。例えば、コンテナAがポート80を使用している場合、コンテナBがポート80を使用しようとすると競合が発生し、エラーとなります。

複数のコンテナをhostモードで使用する際は、以下の点を考慮する必要があります:

  • 同じポートを複数のコンテナで使えない: ポートの競合を避けるため、各コンテナで異なるポートを使用する必要があります。
  • ポート管理に注意: どのポートがどのコンテナで使われているかを管理しながら設定することが重要です。

もし異なるポートでサービスを運用する場合は、hostモードでも問題なく複数のコンテナを実行できます。


Noneネットワークとは?

noneネットワークモードは、その名の通り、コンテナにネットワークインターフェースが全く割り当てられない状態を作ります。つまり、このモードではコンテナが外部ネットワークと通信することはできませんし、他のコンテナやホストとの通信もできません。


Noneネットワークの役割

このモードは、外部との通信が必要ない、もしくはネットワーク接続を禁止したい場合に使われます。例えば、セキュリティを最優先にしたいアプリケーションや、ネットワークの影響を受けないようにしたテスト環境などで有効です。


Noneネットワークの動作イメージ

noneモードでは、コンテナが外部との接続を完全に断たれている状態です。通常、コンテナには仮想ネットワークインターフェースが割り当てられますが、noneモードではそのようなインターフェース自体が存在しません。

Noneネットワークの特徴

  • ネットワーク通信が完全に遮断: コンテナはホストや他のコンテナと通信することができません。
  • セキュリティ: 外部からのアクセスを完全に遮断したい場合や、特定のテスト目的で使うことができます。
  • ユースケース: ネットワークの影響を一切受けないテストや、データ処理のために外部アクセスが不要なアプリケーションなどに向いています。

このように、noneモードはネットワーク通信が全く不要な特別な状況で使用されます。通常のアプリケーションではあまり使われませんが、特定の目的には非常に役立つモードです。

コンテナのIPアドレスを確認してみよう

次に、実際にコンテナがどのIPアドレスを使用しているのかを確認してみましょう。このステップでは、コンテナがBridgeモードを使用している場合、どのようにIPアドレスが割り当てられるかを確認する方法を学びます。

  1. Bridgeネットワークの詳細を確認する
    コンテナが使用しているBridgeネットワークの状態を確認するためには、次のコマンドを入力します。
    docker network inspect bridge
    このコマンドは、bridgeネットワークに接続されたコンテナの情報や、各コンテナに割り当てられているIPアドレスを表示します。
    結果の例:
    "Containers": { "a1b2c3d4e5f6": { "Name": "my_container", "IPv4Address": "172.17.0.2/16" } }
    このように、IPv4Addressとして172.17.0.2が割り当てられていることがわかります。これがコンテナの内部IPアドレスです。
  2. コンテナとの通信を確認する(pingコマンド)
    次に、このIPアドレスが正しく機能しているかを確認するため、ホストPCからコンテナに対してpingコマンドを実行してみましょう。
    ping 172.17.0.2
    結果の例:
    PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
    64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.042 ms
    64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.040 ms
    この結果は、ホストPCからコンテナに対して通信が正常に行われていることを示しています。pingコマンドによって、ホストPCとコンテナが同じネットワーク内で通信可能であることが確認できます。
  3. ブラウザからのアクセスが可能な理由
    先ほどブラウザからコンテナにアクセスできた理由は、この通信がうまく設定されているためです。コンテナにWebサーバーが設定されている場合、pingで確認したIPアドレスを使って、ホストや他のPCからアクセスできるようになります。

コンテナに入ってネットワークの状態を確認しよう

次は、コンテナ内に入って、実際のネットワークの状態を確認してみましょう。今回は、コンテナ名を「my_drupal」にしていますが、読者が使用する場合も、自分のコンテナに適切な名前をつけることをおすすめします。

  1. コンテナに入る
    まず、以下のコマンドを使ってコンテナに入ります。
    docker exec -it my_drupal bash
    これでコンテナ内に入り、直接コマンドを実行できるようになります。
  2. ネットワークインターフェースの確認
    コンテナ内に入ったら、ipコマンドを使ってネットワークインターフェースの状態を確認したいところですが、デフォルトではこのコマンドはインストールされていません。
    エラーメッセージの例:
    bash: ip: command not found
    そこで、まず必要なパッケージをインストールします。
    apt-get update
    apt-get install iproute2
    インストールが完了したら、次のコマンドでネットワークの状態を確認できます。
    ip a
    表示の例:
    1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    valid_lft forever preferred_lft forever
    6: eth0@if7: mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
    valid_lft forever preferred_lft forever
    ここで、eth0というインターフェースがコンテナ内で有効になっており、172.17.0.2というIPアドレスが割り当てられていることが確認できます。
  3. pingコマンドを使った通信確認
    コンテナから外部への通信が可能かどうかを確認するためには、pingコマンドを使用します。しかし、デフォルトではpingコマンドもインストールされていないため、こちらもインストールが必要です。
    apt-get install iputils-ping
    その後、GoogleのDNSサーバーにpingを送ることで、インターネットへの接続が確認できます。
    ping 8.8.8.8
    表示の例:
    PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
    64 bytes from 8.8.8.8: icmp_seq=1 ttl=55 time=10.3 ms
    64 bytes from 8.8.8.8: icmp_seq=2 ttl=55 time=11.1 ms
  4. コンテナの停止と削除
    最後に、作業が完了したらコンテナを停止し、不要になったボリュームを削除してネットワーク状態をリセットします。
    docker stop my_drupal
    docker system prune
    docker volume prune
    コンテナを停止すると、仮想インターフェースvethも自動的に削除されます。

ホストモードでコンテナを起動する

次に、ホストモードでDrupalのコンテナを起動してみましょう。このモードでは、コンテナがホストのネットワークを直接利用します。そのため、ポートの割り当てが不要で、ホストとコンテナが同じIPアドレスを共有します。

  1. ホストモードでのコンテナ起動まず、次のコマンドを使ってホストモードでコンテナを起動します。ここでは、コンテナ名を「drupal11」にしています。
    docker run --name drupal11 --network host -d drupal:11
    ポイント:
    • --network host オプションを使うことで、コンテナはホストと同じネットワークを共有し、独自のIPアドレスが割り当てられません。
    • そのため、外部からコンテナにアクセスする場合は、ホストのIPアドレスとポートがそのまま使用されます。
  2. ホストモードの確認
    コンテナがホストモードで起動しているかを確認するために、以下のコマンドを使用します。
    docker network inspect host
    ホストモードでは、docker network inspectで確認しても、特定のコンテナのIPアドレスは表示されません。これは、コンテナがホストと同じネットワーク名前空間を使用しているためです。
  3. ブリッジモードとの比較
    ホストモードは、ホストとコンテナが完全に同じネットワークを共有するため、パフォーマンスが向上する利点があります。ただし、セキュリティの観点から、コンテナをホストから隔離したい場合には、ブリッジモードを使う方が適しています。
    ブリッジモードを選ぶ理由:
    • ブリッジモードでは、各コンテナに独自のIPアドレスが割り当てられ、ホストとコンテナが隔離されます。
    • そのため、セキュリティが高く、コンテナ同士やホストとの通信を管理しやすいです。
  4. コンテナの運用とデータの移行ホストモードでDrupalのコンテナが動作することを確認できたら、コンテナ内のデータをバックアップし、それをホストに移行する手順に進みます。例えば、Drupalサイトのデータベースや設定ファイルをバックアップしておけば、他の環境でも簡単に復元できます。

まとめ: Dockerのネットワークを理解することで差がつく

Dockerは非常に強力なツールですが、ネットワーク設定を正しく理解することで、パフォーマンスやセキュリティに大きな違いが生まれます。ネットワークモードを適切に選択することができれば、効率的にコンテナを管理し、パフォーマンスの向上やセキュリティリスクの回避につながります。ここでは、Dockerがデフォルトで提供している3つの主要なネットワークモードと、それらがどのような場面で役立つかを簡単に振り返りましょう。


1. Bridgeネットワーク: 一般的な用途に最適

特徴:

  • Dockerインストール時にデフォルトで設定され、ほとんどの初心者が最初に触れるネットワークモードです。
  • 各コンテナには独自の内部IPアドレスが与えられ、仮想ブリッジ(docker0)を介して通信します。
  • 初心者がつまずきやすい点: ポートフォワーディングの設定が必要。これを忘れると、外部からアクセスできないことがあります。

どんな場合に使うか?:

  • 一般的なWebアプリケーションのデプロイに最適。ホストとコンテナ、コンテナ同士の通信を適度に隔離しながら、必要な通信は可能にする。
  • 初心者にとっても簡単で、外部アクセスを設定すればほとんどのケースに対応できます。

2. Hostネットワーク: パフォーマンス重視の選択

特徴:

  • コンテナがホストのネットワークスタックを直接使用するため、ネットワークのオーバーヘッドがなく、パフォーマンスが向上します。
  • 初心者がつまずきやすい点: セキュリティが低下するリスクがあります。ホストとコンテナが同じIPアドレスやポートを共有するため、特定のポートが競合することも。

どんな場合に使うか?:

  • 高速なネットワーク処理が求められるアプリケーションや、パフォーマンスが最優先される場面で使用。
  • ただし、セキュリティリスクを考慮し、公開サーバーなどには慎重に使用する必要があります。

3. Noneネットワーク: 完全なネットワーク隔離

特徴:

  • ネットワーク接続を一切持たないモード。コンテナはホストや他のコンテナと通信できません。
  • 初心者がつまずきやすい点: 外部接続が必要ない場合にしか使えないため、用途が限られる。

どんな場合に使うか?:

  • セキュリティが最優先される環境や、ネットワークを使わない単体の処理を行うコンテナで使用。
  • ネットワーク攻撃を受けないよう、完全に隔離された状態で動作させたい場合に最適。

カスタムネットワークの活用

Dockerでは、デフォルトのネットワークモードだけでなく、カスタムネットワークを作成することも可能です。たとえば、複数のコンテナが連携して動作するマイクロサービス環境では、カスタムネットワークを作成することで、各サービス間の通信を最適化できます。


ネットワーク理解の重要性

Dockerを始めたばかりの人にとって、ネットワークの設定は少し難しく感じるかもしれません。しかし、ネットワークモードを適切に選択できるようになると、アプリケーションのパフォーマンスやセキュリティに大きな差が生まれます。ネットワークの理解が深まれば、より複雑な構成にも自信を持って対応できるようになります。

「なんとなく動けばいい」というレベルを超えて、ネットワークを理解することで他のDockerユーザーと差をつけましょう!

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