Dockerコンテナのネットワークの状態を確認します(ubuntu22.04)

クラウドサービスに設置したCMSにアクセスがあまりないので、自宅サーバーに移行するためDockerを使用することにしました。Drupalのサイトを自宅に移行するために学習する必要がでてきました。

今まではバックアップからのリストアなどの知識で何とかなっていたので、Dockerを見て見ぬふりをしていました。まじめに取り組むことにしました。GitHubのものを不用意に利用するとき、理解してないと動作しない事態に直面する。検証するPCのOSはUbuntu22.04でDockerをインストール済みです。またLAN内にある他のPCからSSH接続をして作業をします。

下記がSSH接続して最初に出た画面表示内容です。

Welcome to Ubuntu 22.04 LTS (GNU/Linux 5.15.0-27-generic x86_64)

  • Documentation: https://help.ubuntu.com
  • Management: https://landscape.canonical.com
  • Support: https://ubuntu.com/advantage System information as of Sun May 1 09:33:09 AM JST 2022 System load: 2.01220703125
    Usage of /: 8.4% of 97.87GB
    Memory usage: 7%
    Swap usage: 0%
    Temperature: 41.0 C
    Processes: 142
    Users logged in: 0
    IPv4 address for docker0: 172.17.0.1
    IPv4 address for enp1s0: 192.168.26.104
    IPv6 address for enp1s0: 2400:2651:c4a1:d500:f276:1cff:fe88:1476
    IPv4 address for wlp2s0: 192.168.26.106
    IPv6 address for wlp2s0: 2400:2651:c4a1:d500:aeb5:7dff:fe87:8e90
  • Super-optimized for small spaces – read how we shrank the memory
    footprint of MicroK8s to make it the smallest full K8s around. https://ubuntu.com/blog/microk8s-memory-optimisation

0 updates can be applied immediately.

Last login: Sat Apr 30 17:05:12 2022 from 192.168.26.105
mamushi@ubuntu22:~$

それでは進めていきましょう。
レジストリからDrupalのイメージを取得してきます。

docker pull drupal

イメージを確認するコマンドを入力します。リポジトリの項目にdrupalという名前でイメージが存在することを確認しました。

docker images

このイメージが使用するポートを確認すると80でした。

docker image inspect drupal

指定したイメージでコンテナを作成して起動するコマンドを入力します。次のオプションを使用します。

docker run 
 --name drupal9 
 -p 80:80 
 -d drupal

正常に起動しました。このPC自体のIPアドレスを確認します。ノートPCなのでイーサネットと無線LANの2つがあり、それぞれに同じセグメントのIPアドレスがルーターから割り振られています。コンテナが起動したのでvethも表示されています。

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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp1s0: mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether f0:76:1c:88:14:76 brd ff:ff:ff:ff:ff:ff
inet 192.168.26.104/24 metric 100 brd 192.168.26.255 scope global dynamic enp1s0
valid_lft 68078sec preferred_lft 68078sec
inet6 2400:2651:c4a1:d500:f276:1cff:fe88:1476/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 282sec preferred_lft 282sec
inet6 fe80::f276:1cff:fe88:1476/64 scope link
valid_lft forever preferred_lft forever
3: wlp2s0: mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether ac:b5:7d:87:8e:90 brd ff:ff:ff:ff:ff:ff
inet 192.168.26.106/24 metric 600 brd 192.168.26.255 scope global dynamic wlp2s0
valid_lft 85711sec preferred_lft 85711sec
inet6 2400:2651:c4a1:d500:aeb5:7dff:fe87:8e90/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 282sec preferred_lft 282sec
inet6 fe80::aeb5:7dff:fe87:8e90/64 scope link
valid_lft forever preferred_lft forever
4: docker0: mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:0d:b8:4b:a9 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
inet6 fe80::42:dff:feb8:4ba9/64 scope link
valid_lft forever preferred_lft forever
12: vethab9b0c0@if11: mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether ee:d2:09:f6:1f:16 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::ecd2:9ff:fef6:1f16/64 scope link
valid_lft forever preferred_lft forever

LAN内の他のPCからブラウザでアクセスします。

http://192.168.26.104
http://192.168.26.106

どちらもDrupalのインストール画面が正常に表示されました。この前、ポート指定を省略したらLAN内のPCからアクセスできませんでした。

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

コンテナを起動する前に確認するべきでしたが、ネットワーク一覧を表示します。Dockerのインストールは、自動的に3つのネットワークを作成すると公式に記載されています。その通り3つ存在していました。先ほど起動したコンテナはオプションでなにも指定していないとbridgeを使用します。

docker network ls

root@ubuntu22:~# docker network ls
NETWORK ID NAME DRIVER SCOPE
482ae2578377 bridge bridge local
077ebd516612 host host local
4ba6f5fdfc08 none null local

メモ
「bridge」はデフォルトのインターフェース。docker0という仮想インターフェースを介して通信する。これは仮想ブリッジである。1つのイーサネット・ネットワークとして振る舞い、パケットの送受信や、別の物理ないし仮想ネットワーク・インターフェースに転送する。


「host」はコンテナのネットワーク・スタックはDockerホストから隔離されません(コンテナはホスト側のネットワーク名前空間を共有します)。また、コンテナは自身に対してIPアドレスを割り当てません。


「none」は文字通りコンテナにネットワーク・インターフェースが無い状態なのでコンテナは内外の通信ができない。

次はコンテナのIPアドレスがどうなっているのか見てみます。コンテナで使用しているインターフェースのbridgeの状態を見ることができるコマンド入力をします。

docker network inspect bridge

使用しているIPアドレスがわかったのでホストPCからPINGコマンドを入力します。

ping 172.17.0.2

通信ができていることを確認しました。先ほどブラウザでアクセス出来た時、ページが見れたのはここで何かしら処理が行われているので可能になった。

次はコンテナに入ってネットワークの状態を確認します。

docker ps
docker exec -it ecce87fae966 bash

コンテナ内でネットワークの状態を確認しようとしたらツールがありませんでした。そこでインストールしようとするとエラー発生。更新(apt update)することでインストール出来ました。

root@ecce87fae966:/opt/drupal# ip a
bash: ip: command not found
root@ecce87fae966:/opt/drupal# apt install iproute2
Reading package lists… Done
Building dependency tree… Done
Reading state information… Done
E: Unable to locate package iproute2

eth0が突如として存在しているのは不明ですが、これにIPアドレスが付与されていることを確認しました。

root@ecce87fae966:/opt/drupal# 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
11: eth0@if12: 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

pingコマンドもなかったのでインストールして確認するとインターネットへアクセスできることを確認しました。

root@ecce87fae966:/opt/drupal# apt install iputils-ping
Reading package lists… Done
Building dependency tree… Done
省略
Setting up iputils-ping (3:20210202-1) …
root@ecce87fae966:/opt/drupal# 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=115 time=11.9 ms
省略
64 bytes from 8.8.8.8: icmp_seq=5 ttl=115 time=11.6 ms
^C
— 8.8.8.8 ping statistics —
5 packets transmitted, 5 received, 0% packet loss, time 4007ms
rtt min/avg/max/mdev = 11.400/11.768/12.093/0.244 ms

docker0に属するセグメントのIPアドレスがコンテナのIPアドレスになっていることを確認しました。調べてみると、ここでNAT変換が行われているとのことです。コンテナにはeth0というインターフェースがあり、vethがコンテナのインターフェースとdocker0の中間に存在しているイメージです。以前、VPNサーバーを設定している時もこのような内容が出てきていました。何気に使用していたが、このようなシステムを開発できるとは驚きです。

コンテナから抜けて、コンテナを停止して削除します。ついでにボリュームも削除します。ネットワークの状態を確認するとvethが表示されなくなりました。連続でコマンド入力しましたがコンテナを停止した時点でvethはなくなります。

docker ps
docker stop ecce87fae966
docker system prune
docker volume prune

今度はホストモードで起動します。ポートの割り当ては無効なので指定はしません。なぜならコンテナはホスト側のネットワーク名前空間を共有すると公式に記載されているからです。

docker run 
 --name drupal9 
 --network host 
 -d drupal
docker network inspect host

共有しているのでIPアドレスの表記はありませんでした。ブリッジモードでドゥルーパルの運用をすることにしました。先にも述べましたがネットワークに何も指定しないとブリッジモードになるので無難そうです。あとはコンテナの中を解析してバックアップしたファイルをもってこれば移行は可能なはずです。

教育

Posted by admin