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 での開発も捗りそうです。