【Docker】Docker ~ 基本編 / docker network ~

■ はじめに

図書館で借りたDockerの本を借りて勉強。
今回は、docker networkを学んだので、まとめる。

補足1:元ネタとなった図書館で借りた本

目次

【1】Docker Network
 1)何のために使う?
【2】Docker Network の種類
 1)bridge
 2)host
 3)none
 4)overlay
【3】ネットワークの主なコマンド
 1)docker network create
 2)docker network ls
 3)docker network inspect
 4)docker network rm
 5)docker network prune
【4】複数コンテナへの適用
 使用例1:WordPress/MySQL
 使用例2:Redmine/MariaDB

【1】Docker Network

1)何のために使う?

* 例えば、WordPressの場合、以下で構成できる
~~~~~~~
 [1] WordPressコンテナ
 [2] DBコンテナ(今回の場合、「MySQLコンテナ」)
~~~~~~~

* 「[1] WordPressコンテナ」⇒「[2] DBコンテナ」へアクセスする必要があるのだが
 そのためには、仮想的なネットワークを作り、双方のコンテナを所属させることで
 コンテナ間の通信が可能になる
 => そのため、「docker network」が必要。

【2】Docker Network の種類

https://qiita.com/MetricFire/items/b731c84975bd9894748d
https://docs.docker.jp/engine/userguide/networking/dockernetworks.html

# ネットワーク名 概要
1 bridge コンテナ間、コンテナ外と通信できるネットワーク
2 host Dockerホストのネットワークをそのまま使う
3 none コンテナ間、コンテナ外とも通信できない
4 overlay 複数ホストがある場合に使用

docker run コマンド例

docker run --network=host httpd:2.4-alpine

docker compose での例

version: '3'
services:
  web:
    image: httpd:2.4-alpine
    expose:
      - "80"
    network_mode: host

1)bridge

* Dockerホストやコンテナは、
 1つの仮想的なbridgeネットワークで接続され、IPアドレスが割り当てられる
 => その bridgeネットワークにあるコンテナに接続できる
* コンテナに対するネットワークの隔離も提供するが、
 同じbridgeネットワークに接続していないコンテナとは接続できない

https://docs.docker.jp/network/bridge.html

2)host

* 全Dockerコンテナで、
 ホスト側のネットワーク名前空間を共有して使うことができる
* ホストポートを使うので、-p 8080:8080 のようなマッピングができない

https://docs.docker.jp/network/host.html

3)none

* 外部ネットワークインターフェイスがないが、
 ループバックインターフェイスを受信
* バッチ処理など、外部と通信させたくないコンテナを作成できる

4)overlay

* 複数ホスト(Docker Swarm/k8s etc)がある場合に使用

【3】ネットワークの主なコマンド

Command Explanation
docker network create Docker ネットワーク作成
docker network rm Docker ネットワーク削除
docker network ls Docker ネットワーク一覧表示

1)docker network create

# クライアントとデーモン API の両方が、少なくとも 1.21 が必要
docker network create hello-network
# 「33b17...」的な文字列(ネットワークID)が表示されるはず

2)docker network ls

# 確認
docker network ls

<Output>
NETWORK ID     NAME      DRIVER    SCOPE
af5e.....   bridge    bridge    local
964e......   host      host      local
f304.....   none      null      local

3)docker network inspect

* Networkの詳細を確認

https://docs.docker.jp/engine/reference/commandline/network_inspect.html

構文

# docker network inspect <ネットワーク名>
docker network inspect bridge

出力結果例

[
    {
        "Name": "bridge",
        "Id": "af5....",
        "Created": "2024-10-23T21:25:51.299368105+09:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.XXX.XXX.XXX/16",
                    "Gateway": "172.XXX.XXX.XXX"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

4)docker network rm

# 作成失敗して削除したい場合
docker network rm hello-network

5)docker network prune

* 使用していないネットワークを全て削除

https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/network_prune/
https://docs.docker.jp/engine/reference/commandline/network_prune.html

$ docker network prune
WARNING! This will remove all custom networks not used by at least one container.
Are you sure you want to continue? [y/N] y

【4】複数コンテナへの適用

* docker network で、仮想的なネットワークを作成したら、
 次にそれをコンテナに適用する必要がある
 => docker container run の オプション「--net」として指定する

コマンド例

# --net <Network Name>
docker container run --name hello-container --net hello-network ...

使用例1:WordPress/MySQL

* 以下の関連記事を参照のこと

https://dk521123.hatenablog.com/entry/2022/04/29/000000

使用例2:Redmine/MariaDB

Docker ~ Redmine
https://dk521123.hatenablog.com/entry/2023/01/09/000000

関連記事

Docker ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2020/04/24/160044
Docker ~ Windows / 環境構築編 ~
https://dk521123.hatenablog.com/entry/2017/09/23/235818
Docker ~ Linux / 環境構築編 ~
https://dk521123.hatenablog.com/entry/2018/04/10/234030
 Docker ~ 基本編 / Data Volume ~
https://dk521123.hatenablog.com/entry/2018/09/08/222100
Docker ~ GO言語 ~
https://dk521123.hatenablog.com/entry/2022/01/14/102719
Docker ~ Webサーバ ~
https://dk521123.hatenablog.com/entry/2022/02/22/000000
Docker ~ WordPress
https://dk521123.hatenablog.com/entry/2022/04/29/000000
Docker ~ Redmine
https://dk521123.hatenablog.com/entry/2023/01/09/000000
Docker ~ Docker 環境をクリーンにする ~
https://dk521123.hatenablog.com/entry/2024/07/25/230911