Colimaを使ってMacでDockerを動かしてみた

# 背景・目的
Colimaは、Docker CLI互換のコンテナランタイムを提供し、Docker CLIでの操作が可能です。
今回は、こちらをMacにセットアップし、触ってみます。

https://github.com/abiosoft/colima#installation

# まとめ
下記に特徴を整理します。

|特徴|説明|
|:--|:--|
|Colimaとは| macOS (および Linux) 上のコンテナ ランタイム。|
|特徴|・シンプルなCLIインターフェース<BR>・自動ポート転送<BR>・ボリュームマウント<BR>・複数のインスタンス<BR>・複数のコンテナランタイムのサポート<BR>　・Docker（オプションでKubernetesを使用）<BR>　・Containerd（オプションでKubernetesを使用）<BR>　・Incus|
|License|MIT License|

# 概要
下記のページを基に整理します。

https://github.com/abiosoft/colima#installation

- macOS (および Linux) 上のコンテナ ランタイム
- 特徴は下記の通り
    - シンプルなCLIインターフェース
    - 自動ポート転送
    - ボリュームマウント
    - 複数のインスタンス
    - 複数のコンテナランタイムのサポート
        - Docker（オプションでKubernetesを使用）
        - Containerd（オプションでKubernetesを使用）
        - Incus


# 実践
## 事前準備
1. dockerをインストールします
    ```bash
    % brew install docker
    % docker --version
    Docker version 27.3.1, build ce1223035a
    % 
    ```

1. docker-composeをインストールします
    ```bash
    % brew install docker-compose
    % docker-compose --version
    Docker Compose version 2.30.3
    % 
    ```
## Colimaをインストール
1. colimaをインストールします
    ```bash
    % brew install colima
    % colima --version   
    colima version 0.8.0
    % 
    ```
## Colimaの起動
1. Colimaを起動します
    ```bash
    % colima start
    INFO[0001] starting colima                              
    INFO[0001] runtime: docker                              
    INFO[0002] creating and starting ...                     context=vm
    INFO[0002] downloading disk image ...                    context=vm
    INFO[0064] provisioning ...                              context=docker
    INFO[0066] starting ...                                  context=docker
    INFO[0094] done                                         
    % docker context ls
    NAME       DESCRIPTION                               DOCKER ENDPOINT                                       ERROR
    colima *   colima                                    unix:///Users/XXXXX/.colima/default/docker.sock   
    default    Current DOCKER_HOST based configuration   unix:///var/run/docker.sock                           
    % 
    ```

## dockerコンテナの操作
1. nginxを起動します
    ```
    % docker run -d -p 8080:80 nginx
    % 
    ```
1. ブラウザで、`localhost:8080`にアクセスします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/3ef256a2-adee-9d0d-e8af-70a638300707.png)


1. イメージを確認します
    ```
    ~ % docker image ls 
    REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
    nginx        latest    XXXXXX   5 weeks ago   192MB
    % 
    ```

1. コンテナを確認します
    ```bash
    % docker ps 
    CONTAINER ID   IMAGE     COMMAND                   CREATED         STATUS         PORTS                                     NAMES
    XXXXX   nginx     "/docker-entrypoint.…"   4 minutes ago   Up 4 minutes   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   elated_mestorf
    % docker ps 
    ```

1. コンテナを停止します
    ```bash
    % docker stop XXXX
    XXXXX
    % docker ps               
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
    % 
    ```

## Dockerビルド
1. プロジェクトを作成します
    ```bash
    % mkdir my_flask_app
    % cd my_flask_app
    ```

1. 簡単なアプリケーションを作成します
    ```python
    % cat app.py 
    # app.py
    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route('/')
    def hello():
        return "Hello, World!"
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0')
    % 
    ```
1. `requirements.txt `を作成します
    ```bash
    % cat requirements.txt 
    flask
    % 
    ```

1. Dockerfileを作成します
    ```docker
    % cat Dockerfile 
    # ベースイメージとしてPythonを使用
    FROM python:3.13-slim
    
    # 作業ディレクトリの設定
    WORKDIR /app
    
    # 必要なファイルをコンテナにコピー
    COPY requirements.txt requirements.txt
    COPY app.py app.py
    
    # 依存関係のインストール
    RUN pip install -r requirements.txt
    
    # アプリケーションの起動
    CMD ["python", "app.py"]
    
    % 
    ```
1. ビルドします
    ```bash
    docker build -t my_flask_app .
    ```
1. イメージを確認します。できていました
    ```bash
    % docker image ls
    REPOSITORY     TAG         IMAGE ID       CREATED          SIZE
    my_flask_app   latest      XXXX   44 seconds ago   134MB
    python         3.13-slim   XXXX   3 weeks ago      121MB
    nginx          latest      XXXX   5 weeks ago      192MB
    % 
    ```

1. コンテナをバックグラウンドで起動します
    ```bash
    % docker run -d -p 5000:5000 my_flask_app
    ```
1. コンテナを確認します
    ```bash
    % docker ps   
    CONTAINER ID   IMAGE          COMMAND           CREATED              STATUS              PORTS                                       NAMES
    XXXXX   my_flask_app   "python app.py"   About a minute ago   Up About a minute   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   charming_noyce
    % 
    ```

1. `localhost:5000`をブラウザに入力します。表示されました
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/17eb6926-f3ff-13fe-820a-98b6ed323666.png)


1. コンテナを停止します
    ```bash
    % docker stop X
    XXX
    % docker ps               
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
    % 
    ```

# 考察
今回は、Colimaを使用してみました。今までは、Docker Desktopを使用していましたが代替できそうです。

# 参考

https://github.com/abiosoft/colima#installation