Mayonnaizse
@Mayonnaizse

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

RaspberryPiでDockerコンテナを使用したときにネットワークに繋がらなくなる

解決したいこと

ラズパイ上でDockerコンテナを作成すると、メモリ使用量は殆ど増えていないのにネットワークが不安定になるのですが、ラズパイの性能ではこんなものなのでしょうか?

  • Raspberry Pi 4 4GB

    $ lsb_release -a
    No LSB modules are available.
    Distributor ID: Raspbian
    Description:    Raspbian GNU/Linux 11 (bullseye)
    Release:        11
    Codename:       bullseye
    
  • Dockerコンテナ

    FROM python:3
    USER root
    
    RUN apt-get update
    RUN apt-get -y install locales && \
        localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
    ENV LANG ja_JP.UTF-8
    ENV LANGUAGE ja_JP:ja
    ENV LC_ALL ja_JP.UTF-8
    ENV TZ JST-9
    ENV TERM xterm
    
    RUN pip install --upgrade pip
    RUN pip install --upgrade setuptools
    

発生している問題・エラー

上記のDockerfileの内容で起動した途端にネットワークの調子が悪くなり、ssh接続が出来なくなり、pingも通らなくなりました。
コマンドの実行履歴を見てもらった方が早いと思います。↓

hoge@raspberrypi:~ $ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
hoge@raspberrypi:~ $ free -m
               total        used        free      shared  buff/cache   available
Mem:            3794         599        2248          80         946        3084
Swap:             99           0          99
hoge@raspberrypi:~ $ ping 8.8.8.8 -c 3
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=59 time=8.28 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=59 time=7.90 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=59 time=8.77 ms

--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 7.901/8.317/8.768/0.354 ms
hoge@raspberrypi:~ $ docker start python3
python3
hoge@raspberrypi:~ $ docker ps
CONTAINER ID   IMAGE            COMMAND     CREATED          STATUS         PORTS     NAMES
c847782e5add   docker-python3   "python3"   21 minutes ago   Up 3 seconds             python3
hoge@raspberrypi:~ $ free -m
               total        used        free      shared  buff/cache   available
Mem:            3794         604        2242          80         946        3078
Swap:             99           0          99
hoge@raspberrypi:~ $ ping 8.8.8.8 -c 3
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
From 192.168.3.160 icmp_seq=1 Destination Host Unreachable
From 192.168.3.160 icmp_seq=2 Destination Host Unreachable
From 192.168.3.160 icmp_seq=3 Destination Host Unreachable

--- 8.8.8.8 ping statistics ---
3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 2039ms
pipe 3

追記 2023/7/21

すみません、docker-compose.ymlを上げるのを忘れていました。

version: '3'
services:
  python3:
    restart: always
    build: .
    container_name: 'python3'
    working_dir: '/root/'
    tty: true

また、hello-worldnginxコンテナは問題無く動きましたが、nginxのコンテナの起動中にはネットワークが繋がらなくなる、python3と同じ現象が起きました。もちろんpython3コンテナは起動していないです。実機でしか動かせてないので、ログはないですが、↓に挙げていただいた内容と同じです。

$ curl -s localhost:9090 | grep "Welcome"
<title>Welcome to nginx!</title>
<h1>Welcome to nginx!</h1>

全てのコンテナを停止してdocker system prune -a実行した後に、再度nginxをpullしてコンテナを作成しました。しかし、問題の状況は変わらず、コンテナの起動中はネットワークに繋がらなくなってしまいました。(コンテナ自体は問題無く動作しました。)


解決しました。2023/7/23

解決しましたのでクローズいたします。(解決時用のコメントみたいなものが無いみたいのでここに追加します。)

回答してくださったお二方、ご協力ありがとうございました。
Dockerコンテナを起動した状態で、ネットワークに接続したままにすることが出来ました。

/etc/dhcpcd.confの設定でIPアドレスの固定をしている箇所の設定でinterfaceが抜けているのが原因でした。

  • 元の設定
static ip_address=192.168.3.160/24
static routers=192.168.3.1
static domain_name_servers=192.168.3.1
  • 変更後
interface wlan0
static ip_address=192.168.3.160/24
static routers=192.168.3.1
static domain_name_servers=192.168.3.1

設定はしっかり確認しながらやらないといかんですね。

1

2Answer

RaspberryPi Zero W でも(起動は遅いのですが) docker は動いているので、docker start 時に実行している Python スクリプトが負荷を与えているのではないでしょうか。

というのも、上記の Dockerfile では環境構築だけしており ENTRYPOINT も指定していないため、単純に docker start では動かないと思います。もちろん docker run でも即時終了して同じです。

docker に問題があるのか、イメージに問題があるのか、コンテナの作成・起動に問題があるのか、の切り分けとして以下を試してどうでしょう?

dockerの動作チェック
$ docker pull hello-world
**snip**

$ docker run hello-world | grep "Hello from"
Hello from Docker!
既存イメージでコンテナ起動
$ docker pull nginx
**snip**

$ docker run --detach -p 9090:80 nginx
c3c53fe7eb4deee07bc866e0e934e2c165d651fafac2fe0f6de098761f8513c1

$ docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS          PORTS                  NAMES
c3c53fe7eb4d   nginx     "/docker-entrypoint.…"   21 seconds ago   Up 21 seconds   0.0.0.0:9090->80/tcp   compassionate_spence

$ curl -s localhost:9090 | grep "Welcome"
<title>Welcome to nginx!</title>
<h1>Welcome to nginx!</h1>

$ $ docker container kill c3c53fe7eb4d
c3c53fe7eb4d

ここまで正常に動作するのであれば、docker は正常に動いており、Python3 のイメージ、コンテナもしくはスクリプトに問題がある可能性があります。

色々試したのであれば、docker system prune -a で、イメージ、コンテナやキャッシュも一旦クリアして試すのもアリだと思います。

2Like

Comments

  1. @Mayonnaizse

    Questioner

    ご丁寧にありがとうございます。
    質問の方に「追記 2023/7/21」として追加しましたのでご確認ください。
    コンテナ自体は問題無く動作していて、ネットワークのみ問題になっているという状況です。
    また私の環境では、ラズパイは無線LANで通信していますが、KEINOS様の環境でも同様に無線でしょうか?(ゼロなので大抵そうですよね…)

  2. 質問の方に「追記 2023/7/21」として追加しました
    ...
    また私の環境では、ラズパイは無線LANで通信しています

    確認いたしました。私も Raspberry Pi Zero W Rev 1.1 (v6l) + WiFi 環境 + Raspbian Lite (Debian11, bullseye) です。ただし、以下を特筆すべきかもしれません。

    1. GUI なしの Raspbian Lite です。
      1. 操作は全て SSH 経由です。
      2. スワップサイズを 100 -> 1024 に変更しています。
      3. NTP を ntp.nict.jp に変更しています。
      4. ディスプレイ解像度を 640 x 480 に変更しています。
      5. GPU メモリを 64 -> 16 に変更しています。
    2. ラズパイたち専用の IEEE 802.11n(2.4GHz)のアクセスポイントを近くに用意しています。
      他の大半の機器が IEEE 802.11ac(5GHz)であるため、2.4 GHz と 5 GHz の切り替えタイムラグとノイズ対策のためです。
    3. 純正の電源アダプターを各々に用意しています。
      USB Hub からの電源供給だと不安定だったためです。

    また、hello-worldとnginxコンテナは問題無く動きましたが、nginxのコンテナの起動中にはネットワークが繋がらなくなる、python3と同じ現象が起きました。

    となると、イメージを pull している時や、pip のライブラリをダウンロードしている時のようなタイミングで落ちているように感じます。つまり、ネットワークへのアクセスが多い時に発生しているようです。

    --network host オプションで、Docker ネットワークを経由せず、直接ホスト(ラズパイ)のネットワークに参加させて、若干の負荷を下げてみてはどうでしょう?

    docker build --network host -t test:local .
    docker run --network host test:local
    

    これで安定してダウンロードできる場合は、MTU や WiFi の設定などを疑ってもいいかもしれません。

    逆に、変わらず不安定な(通信が切れる)場合は、WiFi のアクセスポイントの位置や 2.4GHz と 5GHz の切り替えに失敗しているなどの WiFi 環境を疑ってもいいかもしれません。

    手前味噌で長ったらしい記事なのですが、以下も参考にしてみてください。

原因は64ビット未対応にある?

デバイス周りで失うピンがあるかは分かりませんが?サーバ機能を優先するならRaspbian 64bitより、ubuntu,debianでしょうか?
dockerの初期はubuntuのみで稼働、開発されていました。

尚、IoTやるならRaspbian 32bitでしょうか?

0Like

Comments

  1. @Mayonnaizse

    Questioner

    ご回答ありがとうございます。
    OSはRaspberryPi Imagerでインストールした Raspbian 32bitですのでそのあたりは問題無さそうですね…。
    64bit Ubuntuでも入れて試そうかと思っていたので情報提供ありがとうございます。

Your answer might help someone💌