ubuntu22.04にdockerをインストールして、dockerネットワークをちらっと見てみる

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚と申します。
この記事では、題名の通りubuntu22.04にdocker環境を構築してみたいと思います。
また、これだけだと何番煎じだという話になってしまいますので、dockerのネットワークについてかるーーーーーーーく調べてみたので（私の）備忘録としてQiitaに残しておこうと思います。

# dockerのインストール
aptのupdateとupgradeを実行していきます。
ちなみに、updateとupgradeの違いは以下のようです。検証環境であれば両方やっておけばいいんじゃないでしょうか？
| オプション | 意味 |
| --- | --- |
| update | アップデート可能なパッケージ一覧を更新するだけ。 |
| upgrade | アップデートを実際に行う。 |

```
root@docker:~# apt-get update 
root@docker:~# apt-get upgrade 
```

dockerのリポジトリを追加していきます。
そのために、まずリポジトリ追加に必要なコマンドをインストールします。
また、併せてdockerの公式GPGキーをサーバにダウンロードします。

※GPG
Gnu Privacy Guardの略のようです。
公開鍵を使って署名検証したりするときに使用する様子。
署名検証をすることで、これからインストールするもの（今回でいうとdockerのリポジトリ？）が悪意の第三者から改ざんされていないよねってことを確認するためのものだと思われます。
```
root@docker:~# apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
root@docker:~# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
```



dockerの公式リポジトリを追加していきます。
```
root@docker:~# echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```

apt-get updateを再度実行していきます。
```
root@docker:~# apt-get update
```

docker及びその周辺をインストールしていきます。
```
root@docker:~# apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
```

docker --versionを実際に叩いてみて、出力がされればインストールに問題はないと思われます。
```
root@docker:~# docker --version
Docker version 23.0.3, build 3e7cbfd
```

dockerインストール後にipコマンドを叩いてみます。
するとdocker0というものが出力されると思います。
これは内部でLinux Bridgeを使っているようです。
```
root@docker:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> 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
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 36:8b:75:5e:46:a8 brd ff:ff:ff:ff:ff:ff
    altname enp0s18
    inet 192.168.2.187/24 brd 192.168.2.255 scope global ens18
       valid_lft forever preferred_lft forever
    inet6 fe80::348b:75ff:fe5e:46a8/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:41:73:2e:ab brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
```

docker0をイメージ図に起こすと以下のようなイメージでしょうか・・・？
現状はdocker0という仮想ブリッジができているだけなので「だから何？」といった感情しか出てきませんが、たぶんこっから面白くなるはず・・・！
![docker.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/06723362-51db-f25f-65be-b35bdd2d189e.png)




docker0について、以下の記事では次のように書かれています。

>通常Linux OSには、OVSはなく、「Linuxブリッジ」が搭載されています。Dockerは、デフォルトでホストOSのLinuxの標準機能であるLinuxブリッジを利用します。
https://www.itmedia.co.jp/enterprise/articles/1702/01/news011_2.html

※Linux Bridge
>Linux bridgeはLinuxカーネルに組み込まれたスイッチであり、物理スイッチと同様に入出力されるトラフィックを運ぶポートやインタフェースが必要となる。Linux bridgeは物理ポートと仮想ポートのどちらもサポートしていて、ブリッジに追加することができる。
https://hichtakk.hateblo.jp/entry/2016/04/04/062229#:~:text=Linux%20bridge%E3%81%AFLinux%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB,%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%82

直近で私が触ったものだと上でチラッと出ていますが、OVSが近いものかと思います。

https://qiita.com/ohtsuka-shota/items/f5d7c32c7d6443c91f4e

※OVS
>Open VSwitch（Open Virtual Switch、通称「OVS」）は、ソフトウェア定義型ネットワーク（SDN）を実現する仮想スイッチです。複数の物理サーバやハイパーバイザ型の仮想マシン、コンテナ間のトラフィックを細かく制御でき、大規模な仮想化基盤およびクラウド基盤にも対応できるよう設計されています。
https://www.itmedia.co.jp/enterprise/articles/1702/01/news011.html

※OVS公式サイト

https://www.openvswitch.org/

ここで、Linux Bridgeを操作するためのコマンドであるbrctlコマンドをインストールし、docker0がLinux Bridgeであることを確認してみます。
以下のコマンドを叩くことでインストールすることが可能です。
```
root@docker:~# apt install bridge-utils
```

実際にbrctlコマンドを叩きます。
ここでもdocker0という名前のbridgeが出力されることから、やはりこれはLinux Bridgeであることが言えるでしょう。
```
root@docker:~# brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.024241732eab       no
```

念のためOVSも確認しておきます。
以下のコマンドを叩いて、ovs-vsctlコマンドをインストールします。
```
root@docker:~# apt install openvswitch-switch
```

ovs-vsctl showコマンドを叩いてもバージョンしか出力されないことから、docker0はOVSではないことがわかります。
```
root@docker:~# ovs-vsctl show
6338e08e-2a68-4322-8ab6-cf9fe8cde66d
    ovs_version: "2.17.3"
```