Apple Container を使ってみる

# はじめに

Apple が提供する、Mac（Apple Silicon）向けの新しいコンテナ実行ツール [Container](https://github.com/apple/container/blob/main/README.md) を試してみました。

このツールは、Linux の OCI 準拠コンテナイメージを扱いつつ、Swift 言語で実装されており、各コンテナを 軽量な仮想マシン（VM） として起動します。Docker などの従来のコンテナとは異なり、[Kata Containers](https://katacontainers.io/) を基盤とした分離実行環境が特徴です。

本記事では、Container の導入から、Ubuntu コンテナの起動、ネットワークの調整、簡単な Web サーバーの実行までを試してみます。

    
# Apple Container のインストール

Container はまだ正式リリース段階ではなく、GitHub の [Releases ページ](https://github.com/apple/container/releases/tag/0.1.0) からバイナリを取得してインストールします。（Apple Silicon / macOS 15 以降が前提です）

# Apple Container の実行

Apple Conntainer を動作させていく

## 1. コンテナサービスの起動

最初にコンテナサービスを起動します

```bash:
container system start
```

初回起動時には kata のランタイムなどの構成が必要になるため、以下のようなログが表示されます。

```terminal: container system start のログ
Verifying apiserver is running...
Installing base container filesystem...
No default kernel configured.                                                              
Install the recommended default kernel from [https://github.com/kata-containers/kata-containers/releases/download/3.17.0/kata-static-3.17.0-arm64.tar.xz]? [Y/n]: y
Installing kernel...
```

## 2. Ubuntu コンテナの起動

```bash
container run -ti --rm ubuntu /bin/bash
```

コンテナ内で ifconfig を実行して、ホストとコンテナのネットワーク構成を確認してみます。

```bash
ifconfig 
```

bridge100 インターフェースが 192.168.106.1/24 を使っているのが確認できます。


```terminal:ifconfigのログ
bridge100: flags=8a63<UP,BROADCAST,SMART,RUNNING,ALLMULTI,SIMPLEX,MULTICAST> mtu 1500
	options=63<RXCSUM,TXCSUM,TSO4,TSO6>
	ether 82:a9:97:31:d4:64
	inet 192.168.106.1 netmask 0xffffff00 broadcast 192.168.106.255
	inet6 fe80::80a9:97ff:fe31:d464%bridge100 prefixlen 64 scopeid 0x17 
	inet6 fdbb:e645:f4df:3ab:8fa:61c2:4599:2e76 prefixlen 64 autoconf secured 
	Configuration:
		id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0
		maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200
		root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0
		ipfilter disabled flags 0x0
	member: vmenet0 flags=10803<LEARNING,DISCOVER,PRIVATE,CSUM>
	        ifmaxaddr 0 port 22 priority 0 path cost 0
	nd6 options=201<PERFORMNUD,DAD>
	media: autoselect
	status: active
```



## 3. コンテナのネットワークを合わせる

コンテナに設定されているネットワークを `container ls` コマンドで確認すると `192.168.1.2` となっていました。このままではコンテナ内部からインターネットに接続ができませｎ。

```bash
container ls
```
```terminal: container ls のログ
ID                                    IMAGE                            OS     ARCH   STATE    ADDR
fc65ac22-d996-466d-9300-b611c7d98d13  docker.io/library/ubuntu:latest  linux  arm64  running  192.168.1.2
```

コンテナを終了して、ネットワーク設定を合わせます。

```
container system stop
defaults write com.apple.container.defaults network.subnet 192.168.106.1/24
container system start
```

コンテナを再起動します


```bash
container run -ti --rm ubuntu /bin/bash
```

コンテナのアドレスを再確認します

```bash
container ls
```

これでホストと同一のサブネット内に配置され、インターネットへのアクセスが可能になります。

```terminal
ID                                    IMAGE                            OS     ARCH   STATE    ADDR
f7160b1b-c7e2-49ee-a163-611034619615  docker.io/library/ubuntu:latest  linux  arm64  running  192.168.106.2
```

# コンテナ内でWebサーバーを実行

pythonをインストールします

```bash: コンテナ内部で実行
apt-get update & apt-get install -y python3
```

Webサーバーを起動します

```bash:コンテナ内部で実行
python3 -m http.server 80 --bind 0.0.0.0
```

ホスト側からコンテナ内のWebサーバーにアクセス確認します

```bash: ホストで実行
curl 192.168.106.2
```

```html: curl 192.168.106.2のログ
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Directory listing for /</title>
</head>
<body>
<h1>Directory listing for /</h1>
...
</body>
</html>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017489/a4e62d26-a77c-42e9-8a6f-1c48c5a36e50.png)

# おわりに

Apple Container は、従来の Docker とは一線を画す macOS ネイティブのコンテナランタイムであり、セキュリティや分離性の高い開発環境を求めるユーザーにとって魅力的な選択肢になりそうです。
今後のアップデートにも注目したいと思います

次回の記事では、コンテナへの CPU およびメモリの割り当て方法、そして amd64（x86_64）用コンテナイメージの実行方法について確認します。最終的には、M3 MacBook Pro 上で Chromium のビルドに挑戦します。


https://qiita.com/rairaii/items/f23956df55bd1b77453e

# 参考資料

containerのバイナリを入手してインストールする
https://github.com/apple/container/releases

containerのチュートリアル
https://github.com/apple/container/blob/main/docs/tutorial.md


containerのツール入門ガイド
https://qiita.com/1amageek/items/76a52fddbae6a89b5c5a