Home About Contact
Docker , Colima , Azure

Colima 覚え書き、Ktorアプリをコンテナ実行まで (azure-web-app Part 1)

Silicon マックで amd64 (x86_64) のアーキテクチャの Docker イメージをビルドするには Colimaを使うと良いらしいので試した。 その覚え書きです。

以前に書いたポスト Multipass + Docker を M1 mac で使う、Ktorアプリをコンテナで実行まで では Multipass + Docker を使っていたところを Colima に差しかえて実行してみます。

動かすアプリは最小限の Ktor アプリを用意その2を使います。

バージョンの確認

macOS 15.3 を使用。 homebrew は:

$ brew --version
Homebrew 4.4.20

colima と docker をインストール

$ brew install colima

この状態で colima start すると次のように怒られる。

dependency check failed for docker: docker not found, run 'brew install docker' to install 

そこで、docker を入れます。

$ brew install docker

which して各コマンドにパスが通っていることを確認:

$ which colima
/opt/homebrew/bin/colima
$ which docker
/opt/homebrew/bin/docker

colima start -f するとデフォルトの何かがインストールされるのだが、このマシンは非力なので、 デフォルト設定は荷が重い。CPU や Memory、DISK を明示的に指定してスタートします。

$ colima start --cpu 2 --memory 2 --disk 24 --arch aarch64 \
    --vm-type=vz --vz-rosetta --mount-type virtiofs

--vz-rosetta を指定すれば x86_64 (amd64) のバイナリが作動させられるらしい。 ただし、Rosetta2 がインストールされている必要がある。 Rosetta2 がなければ:

WARN[0000] Unable to enable Rosetta: Rosetta2 is not installed 
WARN[0000] Run 'softwareupdate --install-rosetta' to install Rosetta2

入れろと言われる。

いったん colima を stop:

$ colima stop

rosetta を入れる:

$ softwareupdate --install-rosetta

colima を再度 start:

$ colima start

たぶん、これでいけるのではないか? 必要ならば colima stop したあと、colima delete して全部消してからやり直すべし。

colima ls で 指定した CPU, Memory, Disk サイズで作動しているか確認できます。

$ colima ls
PROFILE    STATUS     ARCH       CPUS    MEMORY    DISK     RUNTIME    ADDRESS
default    Running    aarch64    2       2GiB      24GiB    docker   

もうこれで amd64 アーキテクチャの Docker イメージを動かすことができるらしいです。(詳細は未確認です。)

Ktorアプリ のコンテナイメージを作成

題材としてこれ最小限の Ktor アプリを用意その2を使います。

プロジェクトのルートに Dockerfile を作成:

FROM --platform=linux/amd64 eclipse-temurin:17-jre
WORKDIR /app
COPY app/build/libs/fat.jar fat.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "fat.jar"]

--platformlinux/amd64 を明示的に指定します。

app/build/libs/fat.jar を生成:

$ ./gradlew buildFatJar

このコンテナイメージを生成:

$ docker build -t my-ktor .

DEPRECATED と言われる。とりあえずイメージ作成は成功したので、あとで対処する。

DEPRECATED: The legacy builder is deprecated and will be removed in a future release.
            Install the buildx component to build images with BuildKit:
            https://docs.docker.com/go/buildx/

docker image lsdocker images して生成されたコンテナイメージを確認:

$ docker image ls
REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
my-ktor           latest    13602c28d892   13 seconds ago   281MB
eclipse-temurin   17-jre    af0895d1861a   9 days ago       263MB

動かしてみる。

$ docker run --rm -d -p 8080:8080 my-ktor

architecutre が違うって警告が出る(host は silicon mac なので architecture は linux/arm64/v8 らしい)。

作動を確認してみる。

$ curl -X GET http://localhost:8080/
[
    {
        "id": 1,
        "name": "Pikachu"
    },
    {
        "id": 2,
        "name": "Squirtle"
    },
    {
        "id": 3,
        "name": "Charamander"
    },
    {
        "id": 4,
        "name": "Metapod"
    }
]

動いている。Rosetta2 があるからかな。(わからない。)

docker ps -a してプロセスを見る:

$ docker ps -a
CONTAINER ID   IMAGE     COMMAND               CREATED         STATUS         PORTS                                       NAMES
17f495a31e8f   my-ktor   "java -jar fat.jar"   2 minutes ago   Up 2 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   festive_edison

container id を指定して停止:

$ docker stop 17f495a31e8f

docker image ls で該当コンテナの IMAGE ID を確認して、 それを指定してコンテナイメージを削除する:

$ docker image ls
REPOSITORY        TAG       IMAGE ID       CREATED         SIZE
my-ktor           latest    13602c28d892   6 minutes ago   281MB
eclipse-temurin   17-jre    af0895d1861a   9 days ago      263MB

$ docker rmi 13602c28d892 af0895d1861a

colima を停止:

$ colima stop

Docker を使いたいだけならば Colima がよき。そのために Multipass まで入れる必要はなかったようです。

以上です。