m1 macでPodmanを使ってamd64コンテナを動かしてみる

# はじめに

本ドキュメントは、m1 macにてPodmanを使いMongoDB amd64コンテナを動作させてみた記録です。MAC環境では、QEMUベースの仮想マシンをPodman machineとして利用しています。同じような仕組みとして、Rancher Desktop、Limaがあげられます。このQEMUのテクノロジーを使うことにより、m1でamd64コンテナイメージを実行することが可能となります。

# 前提条件

- インターネットアクセス環境 (数GB程度のダウンロードが走ります)

# 作業環境

- Apple MacBook Pro 13, M1, 2020
- 16GB Memory
- macOS Ventura

# 準備

## Podmanのインストールとセットアップ

homebrewを使ってpodmanをインストールします。次にpodman machineを4 vCPU、8 GB memory構成でセットアップします。デフォルトでは1 vCPU、2GB memoryで構成されます。`--cpus`、`--memory`オプションは、必要に応じてご指定下さい。

`podman machine init`を実行すると数GBあるfedora-coreosの仮想マシンをダウンロードします。インターネット接続環境に注意が必要です。

```sh
brew install podman
podman machine init --cpus 4 --memory 8192
podman machine start
```

バージョン確認。

```sh
podman -v
podman version 4.4.1
```

podman machineが停止状態だとpodmanの多くのコマンドが下記のようにエラーとなります。起動状態でご利用下さい。

```sh
podman ps -a
Error: failed to connect: dial tcp [::1]:54669: connect: connection refused
```

podman machineの停止方法は `podman machine stop`です。

podman machineの設定を確認します。

```console
podman machine list
NAME                     VM TYPE     CREATED            LAST UP            CPUS        MEMORY      DISK SIZE
podman-machine-default*  qemu        About an hour ago  Currently running  4           8.59GB      107.4GB
```

```console
podman machine info
Host:
  Arch: arm64
  CurrentMachine: podman-machine-default
  DefaultMachine: podman-machine-default
  EventsDir: /var/folders/m3/8c8dm0td3qj7yn_xj16x4x940000gn/T/podman-run--1/podman
  MachineConfigDir: /Users/username/.config/containers/podman/machine/qemu
  MachineImageDir: /Users/username/.local/share/containers/podman/machine/qemu
  MachineState: Running
  NumberOfMachines: 1
  OS: darwin
  VMType: qemu
Version:
  APIVersion: 4.4.1
  Built: 1675882998
  BuiltTime: Thu Feb  9 04:03:18 2023
  GitCommit: 34e8f3933242f2e566bbbbf343cf69b7d506c1cf
  GoVersion: go1.19.5
  Os: darwin
  OsArch: darwin/arm64
  Version: 4.4.1
```

以上でインストールと設定は完了です。


# 動作するcpu archの確認

## alpine arm64イメージを実行

m1 macはarmベースのイメージが動作することを確認します。`uname -a`を実行すると`aarch64 Linux`であることが確認できました。

```sh
podman run --rm docker.io/library/alpine:3.17.2 uname -a
Trying to pull docker.io/library/alpine:3.17.2...
Getting image source signatures
Copying blob sha256:af6eaf76a39c2d3e7e0b8a0420486e3df33c4027d696c076a99a3d0ac09026af
Copying config sha256:d74e625d91152966d38fe8a62c60daadb96d4b94c1a366de01fab5f334806239
Writing manifest to image destination
Storing signatures
Linux 9d77a17f8d28 6.1.11-200.fc37.aarch64 #1 SMP PREEMPT_DYNAMIC Thu Feb  9 19:41:51 UTC 2023 aarch64 Linux
```

```sh
podman image list
REPOSITORY                           TAG               IMAGE ID      CREATED       SIZE
docker.io/library/alpine             3.17.2            d74e625d9115  12 days ago   7.75 MB
```

## alpine amd64イメージを実行

上と同じ`alpine:3.17.2`ですが、Digestを指定しamd64イメージにて`uname -a`を実行してみます。Docker hubにてDigestを確認します。まずOS/ARCHを確認しamd64のDigest部分をクリックします。

![run_amd64_on_m1mac_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1557529/b0938def-01f9-b2a3-f6c3-acf6f989b01c.png)

DIGEST全体が表示されているのでコピーします。

![run_amd64_on_m1mac_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1557529/ab318b0b-7b02-1081-e080-1c92fffd499d.png)

TAGに続けて@とDigestを貼り付けて実行します。WARNING(警告: イメージのプラットフォームが違う)という趣旨のメッセージが表示されますが`uname -a`コマンドは適切に処理され`x86_64 Linux`のコンテナイメージが動作していることが確認できます。

```sh
podman run --rm alpine:3.17.2@sha256:e2e16842c9b54d985bf1ef9242a313f36b856181f188de21313820e177002501 uname -a
Resolved "alpine" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull docker.io/library/alpine@sha256:e2e16842c9b54d985bf1ef9242a313f36b856181f188de21313820e177002501...
Getting image source signatures
Copying blob sha256:63b65145d645c1250c391b2d16ebe53b3747c295ca8ba2fcb6b0cf064a4dc21c
Copying config sha256:b2aa39c304c27b96c1fef0c06bee651ac9241d49c4fe34381cab8453f9a89c7d
Writing manifest to image destination
Storing signatures
WARNING: image platform (linux/amd64) does not match the expected platform (linux/arm64)
Linux 1de721790093 6.1.11-200.fc37.aarch64 #1 SMP PREEMPT_DYNAMIC Thu Feb  9 19:41:51 UTC 2023 x86_64 Linux
```

イメージのリストを表示すると新しいイメージが確認できます。TAGは重複しているので`<none>`となります。

```sh
podman image list
REPOSITORY                           TAG               IMAGE ID      CREATED       SIZE
docker.io/library/alpine             <none>            b2aa39c304c2  12 days ago   7.34 MB
docker.io/library/alpine             3.17.2            d74e625d9115  12 days ago   7.75 MB
```

TAGがnoneの方をinspectするとこのようになります。Digestはrunの際に指定した内容となっていますし、Architectureがamd64となっていることも確認できます。

```sh
podman inspect b2aa39c304c2
[
     {
          "Id": "b2aa39c304c27b96c1fef0c06bee651ac9241d49c4fe34381cab8453f9a89c7d",
          "Digest": "sha256:e2e16842c9b54d985bf1ef9242a313f36b856181f188de21313820e177002501",
          "RepoTags": [],
          "RepoDigests": [
               "docker.io/library/alpine@sha256:e2e16842c9b54d985bf1ef9242a313f36b856181f188de21313820e177002501"
          ],
          "Parent": "",
          "Comment": "",
          "Created": "2023-02-11T04:46:42.558343068Z",
          "Config": {
               "Env": [
                    "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
               ],
               "Cmd": [
                    "/bin/sh"
               ]
          },
          "Version": "20.10.12",
          "Author": "",
          "Architecture": "amd64",
          "Os": "linux",
          "Size": 7340512,
          "VirtualSize": 7340512,
          "GraphDriver": {
               "Name": "overlay",
               "Data": {
                    "UpperDir": "/var/home/core/.local/share/containers/storage/overlay/7cd52847ad775a5ddc4b58326cf884beee34544296402c6292ed76474c686d39/diff",
                    "WorkDir": "/var/home/core/.local/share/containers/storage/overlay/7cd52847ad775a5ddc4b58326cf884beee34544296402c6292ed76474c686d39/work"
               }
          },
          "RootFS": {
               "Type": "layers",
               "Layers": [
                    "sha256:7cd52847ad775a5ddc4b58326cf884beee34544296402c6292ed76474c686d39"
               ]
          },
          "Labels": null,
          "Annotations": {},
          "ManifestType": "application/vnd.docker.distribution.manifest.v2+json",
          "User": "",
          "History": [
               {
                    "created": "2023-02-11T04:46:42.449083344Z",
                    "created_by": "/bin/sh -c #(nop) ADD file:40887ab7c06977737e63c215c9bd297c0c74de8d12d16ebdf1c3d40ac392f62d in / "
               },
               {
                    "created": "2023-02-11T04:46:42.558343068Z",
                    "created_by": "/bin/sh -c #(nop)  CMD [\"/bin/sh\"]",
                    "empty_layer": true
               }
          ],
          "NamesHistory": [
               "docker.io/library/alpine@sha256:e2e16842c9b54d985bf1ef9242a313f36b856181f188de21313820e177002501"
          ]
     }
]
```



# MongoDBのamd64イメージを実行

## イメージを選択

[MongoDBのオフィシャル](https://hub.docker.com/_/mongo)だとarm64もあるようなので[bitnami/mongodb](https://hub.docker.com/r/bitnami/mongodb)を使います。

## bitnami/mongodb:4.2.5を実行

```sh
podman run \
-d --restart=unless-stopped \
-e MONGODB_USERNAME=user1 \
-e MONGODB_PASSWORD=password \
-e MONGODB_DATABASE=master1 \
--name mongo docker.io/bitnami/mongodb:4.2.5

WARNING: image platform (linux/amd64) does not match the expected platform (linux/arm64)
c90431e2273ebade50761d885dc03dd37237135194f415660cbb19428d36c451
```

## 動作状況を確認

Container IDを確認します。

```sh
podman ps -a
CONTAINER ID  IMAGE                            COMMAND               CREATED      STATUS      PORTS       NAMES
c90431e2273e  docker.io/bitnami/mongodb:4.2.5  /opt/bitnami/scri...  2 hours ago  Up 2 hours              mongo
```

コンテナに入り、mongoコマンドを使って動作していることを確認します。

```console
podman exec -it c90431e2273e bash
1001@c90431e2273e:/$ mongo -u user1 -p password --authenticationDatabase master1
MongoDB shell version v4.2.5
connecting to: mongodb://127.0.0.1:27017/?authSource=master1&compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("b52f5f23-9415-4412-b757-04e6d56f9d76") }
MongoDB server version: 4.2.5
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
	http://docs.mongodb.org/
Questions? Try the support group
	http://groups.google.com/group/mongodb-user
2023-02-23T06:52:32.698+0000 I  STORAGE  [main] In File::open(), ::open for '//.mongorc.js' failed with Permission denied
> use master1
switched to db master1
> show collections
> exit
bye
1001@c90431e2273e:/$ 
```

# 参考情報

[podman/Getting Started](https://podman.io/getting-started/)

[podman Installation Instructions](https://podman.io/getting-started/installation)

[Mosquittoの動かし方](https://qiita.com/vfuji/items/6d01e9f613b92d638574)では、podmanでamd64のeclipse-mosquittoを動かしています。