「ネットワークの勉強をしたいけど、実機のスイッチやルーターを買うのはハードルが高い…」 「CCNAの参考書を読んでも、L2スイッチが実際どう動いているのかイメージが湧かない…」
そんな悩みを持つ方に朗報です。実は、Dockerを使えば、無料かつコマンド数行で「仮想のL2スイッチ」と「そこに繋がるPC」を、あなたの手元のPC上に作ることができます。
物理機器も、難しいネットワーク機器の設定画面も一切不要。今回は、Dockerのdocker network機能を使って、L2ネットワークの基本である「同一セグメント内の通信」を実際に手を動かしながら体験していきます。
エンジニアとしてスキルアップしたい方はもちろん、資格の勉強で得た知識を体に染み込ませたい方にも、必ず役立つ内容になっています。それでは早速始めていきましょう。
この記事で学べること
- Dockerのネットワーク機能を使って仮想L2スイッチを構築する方法
- コンテナ同士がPing(ICMP)で通信できることの確認方法
- Dockerが裏側でMACアドレスやIPアドレスをどう管理しているかの覗き見方法
演習に使うツール:nicolaka/netshoot
今回の演習では nicolaka/netshoot というDockerイメージを使用します。
これは、ping、ip、tcpdumpなど、ネットワークエンジニアが調査や検証で使う定番コマンドがあらかじめ全部入っている「特製の作業用PC」のようなイメージです。
普通のLinuxコンテナだとこれらのコマンドが入っておらず自分でインストールする手間が発生しますが、netshootなら一切不要。ダウンロードしてすぐに検証を始められます。
事前準備として、お使いのPCにDockerがインストールされ、起動していることを確認しておいてください。
Step 1:仮想のL2スイッチを作成する
まずは、192.168.10.0/24 というネットワークアドレスを持つ、仮想のL2スイッチを作成します。
bash
docker network create --subnet=192.168.10.0/24 my_bridge1
コマンド解説
| コマンド・オプション | 役割 |
|---|---|
| docker network create | 新しいネットワーク(仮想スイッチ)を作るコマンド |
| –subnet=192.168.10.0/24 | このスイッチに所属する機器が使うIPアドレスの範囲を指定 |
| my_bridge1 | 作成する仮想スイッチに付ける名前 |
このコマンド一発で、あなたのPCの中に「192.168.10.0/24」という1つのブロードキャストドメイン(同一セグメント)が誕生しました。物理的なハブやスイッチを買わなくても、これだけでL2の土台が完成します。
Step 2:L2スイッチに繋がったPC(コンテナ)を2台立ち上げる
次に、作成した my_bridge1 スイッチに、hostA と hostB という2台のコンテナを、LANケーブルで繋ぐイメージで接続・起動します。
bash
docker run -d --name hostA --net my_bridge1 nicolaka/netshoot sleep infinity
docker run -d --name hostB --net my_bridge1 nicolaka/netshoot sleep infinity
コマンド解説(初心者向けポイント)
| コマンド・オプション | 役割 |
|---|---|
| docker run | コンテナを作って動かすコマンド |
| –name hostA | コンテナにhostAという名前を付ける |
| –net my_bridge1 | どの仮想スイッチ(LAN)に接続するかを指定 |
| nicolaka/netshoot | 使用するコンテナイメージ名(OSや工具が入った金型) |
| sleep infinity | 「何もせずずっと起きていてね」という指示。これを入れないと、コンテナは一瞬で仕事を終えて終了してしまいます |
これで、同じスイッチ(my_bridge1)にLANケーブルで繋がった2台のPCが起動した状態になりました。
Step 3:各コンテナ(PC)に割り当てられたIPアドレスを確認する
Dockerが自動でコンテナに割り振ったIPアドレスを確認してみましょう。
bash
docker exec -it hostA ip -4 addr show eth0
docker exec -it hostB ip -4 addr show eth0
実行結果の見方
192.168.10.2/24 や 192.168.10.3/24 のようなIPアドレスが表示されていれば成功です!
コマンド解説
| コマンド・オプション | 役割 |
|---|---|
| docker exec -it [コンテナ名] [実行したいコマンド] | 起動中のコンテナの中に潜り込んで、直接コマンドを実行させる指示 |
| ip -4 addr show eth0 | Linuxのネットワーク設定確認コマンド。eth0(第1ネットワークカード)のIPv4アドレスを表示する |
DHCPサーバーを自分で立てたわけでもないのに、Dockerがサブネット内から自動でIPアドレスを払い出してくれていることがわかります。
Step 4:コンテナ間で通信してみる(Ping)
いよいよ本番です。hostAからhostBのIPアドレスに向けて、Ping(ICMP Echo Request)を送信してみましょう。
※ここではhostBのIPアドレスが192.168.10.3だと仮定します。Step 3で表示された実際のIPアドレスに置き換えて実行してください。
bash
docker exec -it hostA ping -c 3 192.168.10.3
コマンド解説
| コマンド・オプション | 役割 |
|---|---|
| ping -c 3 | Pingを3回だけ送信する |
以下のように応答が返ってくれば、L2スイッチ経由で無事に通信ができています!
64 bytes from 192.168.10.3: icmp_seq=1 ttl=64 time=0.083 ms
普段何気なく使っている「Ping」ですが、その裏では宛先IPアドレスからMACアドレスを特定するARP(Address Resolution Protocol)が動き、L2スイッチがMACアドレステーブルを参照してフレームを転送しています。
今回はDockerがその処理をすべて肩代わりしてくれているというわけです。
Step 5:裏側の構造(仮想L2スイッチ)を覗いてみる
最後に、Dockerが裏側でどうやってこれらを管理しているのか、ホストOS側から覗いてみましょう。
bash
docker network inspect my_bridge1
注目ポイント
出力されるJSONデータの中に “Containers”: { … } という部分があります。そこにhostAとhostBの名前、MACアドレス、IPアドレスが並んでいるはずです。

これはまさに、L2スイッチが管理しているMACアドレステーブルやポート管理情報そのものです。
物理スイッチの管理画面で確認するような情報が、コマンド一発で手元に表示される。これがDockerで学ぶネットワーク演習の面白さです。
今週のまとめと確認
今回の操作で、あなたは物理機器を一切触らずに「L2スイッチを置き、LANケーブルを2本挿し、2台のPCにIPを振って同一セグメント通信をさせる」というネットワーク構築を、コマンド数行で完了させました。
| ステップ | やったこと | 対応する物理機器の作業 |
|---|---|---|
| Step 1 | docker network create | L2スイッチを新品開封して電源を入れる |
| Step 2 | docker run –net | PC2台をLANケーブルでスイッチに接続 |
| Step 3 | ip addr show | 各PCのIP設定を確認 |
| Step 4 | ping | 実際に通信できるかテスト |
| Step 5 | docker network inspect | スイッチのMACアドレステーブルを確認 |
コマンド操作自体は数分で終わりますが、この一連の流れの中に「同一セグメントとは何か」「L2スイッチはどう機器を管理しているか」というネットワークの基礎がぎゅっと詰まっています。
参考書で読んだだけの知識と、実際に手を動かして確認した知識では、記憶への定着度が大きく変わってきます。
後片付け
演習が終わったら、以下のコマンドで作成したコンテナとネットワークを削除しておきましょう。
bash
docker rm -f hostA hostB
docker network rm my_bridge1

コメント