ここではDockerを立てたときのネットワークの説明をします。Dockerを構築する上でネットワークのイメージは欠かせないものです。【後半】では実際にDockerを立てます。説明がいらないという方は【後半】を読んでください。
Dockerって?
ソフトウェアを「コンテナ」と呼ばれる独立したユニットにパッケージ化するプラットフォームです。下の画像がよくあるやつですね。

Dockerエンジンがソフトウェアとして配布されています。その上にコンテナを起動して動かしていきます。
コンテナを構成するもの
コンテナはアプリを動かすために必要な最小限の環境をパッケージ化したものです。以下のもので構成されています。
- ファイルシステム
- プロセス
- ネットワーク設定
- メタデータ
- ネームスペースと cgroups
ここでネームスペースと cgroupsの説明をします。
ネームスペースと cgroups
ネームスペースとは、他のプロセスやネットワークから隔離するシステムです。これによって他のプロセスから邪魔されたり、ネットワークが混同することがなくなります。
またcgroupsは、CPUやメモリ、I/Oなどのリソースに制限をかけるものです。
つまりこの二つがあることで、コンテナが独立しているように見えるというわけです。
ネットワークモード
コンテナがどのような立ち位置になるかを決めるモードです。ここでは5種類紹介します。
bridgeモード
Dockerコンテナを立てたときのデフォルトの設定です。
[ホスト]
├── eth0 : 192.168.1.10(LAN上のIP)
└── docker0 : 172.17.0.1(仮想ブリッジ)
└── [コンテナ] : 172.17.0.2
厳密ではないですが、イメージ的には下の画像がわかりやすいと思います。

この場合特別に設定(ポートフォワーディングとか)しないとホストデバイスの外からコンテナにアクセスすることはできません。
また図から分かる通り、コンテナ同士は疎通を通すことができます。
hostモード
ホストデバイスと同じネットワークを利用します。ipによる接続はできませんが、5432番のポート指定を行うとアクセスが可能です。
[ホスト]
├── eth0 : 192.168.1.10(LAN上のIP)
└── [コンテナ] : IPなし
コンテナ共有モード
あるコンテナが使用しているネットワークを、そのまま利用するモードです。あるコンテナがすでに使用しているIPやポートも全て共有します。あとから共有したコンテナがdownしても問題ないですが、共有した側のコンテナがdownすると共有したコンテナ全体が落ちます。
macvalnモード
[ホスト]
├── eth0 : 192.168.1.10(LAN上のIP)
└── [コンテナ] : 192.168.2.10

物理層のポートを利用するモードです。外部からのIPによるアクセスが可能になります。やってることとしては
- 新しくネットワークbridgeを作成する
- bridgeを物理ポートと結びつける
- 物理ポートと結びつけたbridgeを、コンテナと繋げる
たったこれだけ。物理NICを仮想的に分割しているから一つの物理ポートで複数のIP addressを管理することも可能。一番直感的で使いやすいと思います。
noneモード
完全に孤立した状態です。ネットワークを持ちません。検証用などに使用します。
おわりに
今回はDockerを立てたときに構築されるネットワークを中心に解説していきました。他にもDockerに関する記事をあげているのでそちらもご覧ください。