ARM64 の Chromebook で Docker 環境を構築して外部からアクセスする


Docker Advent Calendar 2020 17日目の記事です。

以前の記事で Lenovo IdeaPad Duet Chromebook で、ARM64 版 Linux が利用できることをご紹介しましたが、Docker のインストールと外部からのアクセス手段について確認してみました。

Linux 環境(Crostini)のインストール

まずは、Linux 環境をインストールします。

Docker のブログ記事なのでインストール方法は割愛します。下記のヘルプをご確認ください。

aarch64(ARM64)の Debian 10(buster)がインストールされたことを確認します。

$ cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
$ uname -a
Linux penguin 5.4.67-09356-gf3ed4c0c4a31 #1 SMP PREEMPT Sun Sep 27 20:30:52 PDT 2020 aarch64 GNU/Linux

ちなみに、Chrome OS のバージョンは 87.0.4280.109 です。

Docker のインストール

公式サイトの手順に沿ってインストールします。

インストール直後の場合は必要ありませんが、旧バージョンがインストールされている場合のアンインストール手順です。

$ sudo apt-get remove docker docker-engine docker.io containerd runc

apt パッケージのインデックスの更新と、インストールに必要なパッケージをインストールします。

$ sudo apt-get update

$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

GPG キーを追加します。

$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

正常に登録されたか確認します。

$ sudo apt-key fingerprint 0EBFCD88
pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) <[email protected]>
sub   rsa4096 2017-02-22 [S]

Docker のレポジトリを追加します。

$ sudo add-apt-repository \
   "deb [arch=arm64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"

今回は、ARM64 の Chromebook にインストールしますが、Intel の Chromebook なら arch=amd64 になります。

Docker のインストール

 $ sudo apt-get update
 $ sudo apt-get install docker-ce docker-ce-cli containerd.io

Docker インストール後の確認

正常に ARM64 版 Docker 20.10.1 がインストールできたことを確認します。

$ sudo docker version
Client: Docker Engine - Community
 Version:           20.10.1
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        831ebea
 Built:             Tue Dec 15 04:35:39 2020
 OS/Arch:           linux/arm64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
以下略

コンテナの起動と通信確認

Linux 環境のネットワーク設定の確認

コンテナを起動する前に、ip addr show コマンドで、Linux 環境のネットワーク設定を確認します。

$ ip addr show eth0
5: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:16:3e:xx:xx:82 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 100.115.92.198/28 brd 100.115.92.207 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 2405:xxxx:xxxx:xxxx:216:3exx:xxxx:xx82/64 scope global dynamic mngtmpaddr 
       valid_lft 2591953sec preferred_lft 604753sec
    inet6 fe80::216:3exx:xxxx:xx82/64 scope link 
       valid_lft forever preferred_lft forever

また、Chromebook 自体のネットワークの情報は下記です。

  • IPv4 アドレス:自宅の DHCP で配布される 192.168.2.1/24 のアドレス
  • IPv6 アドレス:IPoE 接続の ISP の DHCPv6 で配布される /64 のアドレス(Linux 環境と同セグメントの異なるアドレス)
  • MAC アドレス:5C から始まるもの(ベンダーコード的にはハードウェアメーカー)

このことから Chrome OS 内の Linux 環境については下記のことがいえそうです。

  • IPv4 アドレス:Chrome OS 内で NAT されているので外部から直接アクセス不可
  • IPv6 アドレス:Chromebook など他のデバイスと同じセグメントであり、直接アクセス可能
  • MAC アドレス:Xen(仮想化ソフトウェア)のもの

動作確認用コンテナの起動

わかりやすいように、PHP のコンテナを起動します。

$ echo "<?php phpinfo(); ?>" > ~/index.php
$ docker run -ti --name php -p 80:80 -v ~/index.php:/var/www/html/index.php:ro -d php:8.0-apache

-p 80:80 の左側の部分を書き換えて、異なるポートでコンテナを起動できます。

Linux 環境内での確認

Linux 環境内は実機同様、

  • localhost
  • IPv4 アドレス(100. で始まるもの)
  • IPv6 アドレス

ともにポートに関わらず問題なく接続できました。

Chromebook 上の Chrome ブラウザでの確認

ポート番号が 1024 以上であれば localhost:ポート番号 で接続できました。

「penguin.linux.test」のホスト名であれば、ポートに関わらず接続できます。
内部的には hosts かなにかで 100. で始まる IP アドレスに変換されているようです。

IPv6 アドレスはなぜか接続できませんでした。

個人的には、penguin.linux.test を覚えるよりは、1024 以上のポートを使用して localhost でアクセスするほうが覚えやすいかなと思います。

外部からのアクセス(ポート転送)

IPv6 アドレスであればそのままアクセスできました。

IPv4 アドレスの場合、Chrome OS の設定でポート転送を行い、Chromebook の IP アドレスでアクセスできるように設定する必要があります。

2020年8月にリリースされた Chrome 85 の新機能のようです。

ヘルプには記載がありませんでしたが、1024〜65535 の範囲でないと設定できないようです。

これにより、「Chromebook の IP アドレス:ポート番号」で外部から接続できるようになりました。

まとめ

ARM64 な Chromebook でも通常の Linux 環境と同様の手順で Docker を利用できることが確認できました。

Chromebook 上の Chrome ブラウザについては下記でした。

  • penguin.linux.test であればポートに関わらずアクセス可能
  • localhost でアクセスしたい場合、1024〜65535 ポートを使用

外部からのアクセスについては下記でした。

  • リモートワーク需要で普及が進んでいる IPv6 ならそのままアクセス可能
  • IPv4 なら設定で 1024〜65535 ポートは転送可能

Chromebook での開発も捗りそうです。


Comments

comments

コメントを残す

メールアドレスが公開されることはありません。

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)