Multipass on macOS 徹底活用 (4) – Docker環境をMultipassで構築・運用する

前の記事では、macOS開発者がMultipassとVS Code Remote – SSH拡張機能を連携させ、快適なリモート開発環境を構築する方法を解説しました。

Docker Desktopの「重さ」に悩んでいませんか?

macOSでコンテナ開発を行う際、多くの開発者がまず導入するのがDocker Desktopでしょう。しかし、その便利さの裏で、こんな悩みを抱えていませんか?

  • 「Macの動作が重くなる…」: Docker Desktopが消費するCPUやメモリリソースに、開発中のアプリケーションが圧迫される。
  • 「バッテリーの減りが早い気がする」: 仮想化によるオーバーヘッドが、モバイル環境での作業効率を低下させる。
  • 「ライセンス利用料の節約」: 大規模なチームや企業での利用において、ライセンスコストが懸念材料となる。

もしあなたがこれらの課題に共感するなら、ぜひこの記事を役に立ててください。

この記事では、macOS上で軽量なUbuntu仮想環境を提供するMultipassを活用し、その上にDocker環境を構築・運用する方法を徹底解説します。
Docker Desktopの代替として、よりリソース効率が良く、柔軟性の高いコンテナ開発環境を手に入れることで、開発ワークフローを改善してみてください。


対象読者

  • Docker Desktopのリソース消費に不満を感じているmacOS開発者
  • より軽量で柔軟なコンテナ開発環境を求めているエンジニア
  • Multipassを導入済みで、その上でDockerを動かしたいと考えている方
  • macOS上でUbuntu環境でのコンテナ開発を効率化したい初級〜中級エンジニア

動作検証環境

この記事で紹介するcurlコマンドの動作は、以下の環境で検証しています。

  • OS : macOS Tahoe Version 26.0
  • ハードウェア : MacBook Air 2024 M3 24GB
  • Multipass : Multipass version 1.16.1

目次

  1. なぜMultipass上でDockerを使うのか?
  2. MultipassインスタンスへのDockerインストール
  3. MultipassでDockerコンテナを動かす
  4. FAQ:MultipassとDockerに関するよくある疑問
  5. まとめ:コンテナ開発の新たな選択肢

なぜMultipass上でDockerを使うのか?

Docker Desktopは非常に便利ですが、その内部ではmacOS上に仮想マシンを構築し、その上でDocker Engineを動かしています。この仮想マシンが、時にMacのリソースを大きく消費する原因となります。

Multipassは、macOSに最適化された軽量なUbuntu仮想マシンを簡単に起動できるツールです。このMultipassインスタンス上にDocker Engineをインストールすることで、Docker Desktopが抱えるリソース問題やライセンス問題を回避し、より快適なコンテナ開発環境を構築できます。

Docker Desktopの代替としてのメリット

  • リソース消費の抑制: Docker Desktopの仮想マシンよりも軽量なMultipassインスタンスを利用することで、Mac全体のシステムリソース消費を抑えられます。特に、複数の開発環境を同時に動かす必要がある場合や、メモリが限られたMacBook Airのような環境では大きなメリットとなります。
  • 柔軟なリソース割り当て: Multipassインスタンスは、CPU、メモリ、ディスクサイズをコマンド一つで簡単に設定できます。プロジェクトの要件に合わせて、必要なリソースを柔軟に割り当てることが可能です。
  • ライセンスの心配不要: Multipass上でオープンソースのDocker Engineを直接利用することで、Docker Desktopの商用利用におけるライセンスの制約を気にせず利用可能です。
  • 純粋なLinux環境: Docker DesktopはmacOSのファイルシステムとの連携など、独自の機能を提供しますが、Multipass上のDockerはより純粋なLinux環境での動作に近いため、本番環境との差異を小さくできます。

リソース管理の柔軟性

Multipassでは、インスタンス起動時にCPUコア数、メモリ量、ディスクサイズを細かく指定できます。これにより、開発中のプロジェクトに合わせて最適なリソースを割り当て、無駄なリソース消費を防ぐことができます。

# 2CPU、4GBメモリ、50GBディスクのインスタンスを起動
multipass launch --name my-docker-vm --cpus 2 --memory 4G --disk 50G
[!TIP]プロジェクトごとに異なるリソース要件がある場合、複数のMultipassインスタンスを立ち上げ、それぞれに最適なリソースを割り当てることで、効率的な開発環境を構築できます。

MultipassインスタンスへのDockerインストール

それでは、実際にMultipassインスタンス上にDocker Engineをインストールしていきましょう。ここでは、Ubuntu環境での標準的なインストール手順を解説します。

Ubuntu環境でのDocker Engineのセットアップ

まず、Multipassインスタンスを起動し、シェルに接続します。

multipass launch --name docker-host --cpus 2 --memory 4G --disk 50G
multipass shell docker-host

インスタンスのシェルに入ったら、以下のコマンドでDocker Engineをインストールします。

# パッケージリストを更新
sudo apt update

# 必要なパッケージをインストール
sudo apt install -y ca-certificates curl

# Dockerの公式GPGキーを追加
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Dockerリポジトリをaptソースに追加
bash
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# パッケージリストを再度更新し、Docker Engineをインストール
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
インストールが完了したら、Dockerサービスが正しく動作しているか確認します。
sudo systemctl status docker
`active (running)` と表示されていれば成功です。

コマンド実行例(dockerの動作確認):
ubuntu@my-ubuntu-vm:~$ sudo systemctl status docker
 docker.service - Docker Application Container Engine
     Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: enabled)
     Active: active (running) since Wed 2025-10-01 18:46:39 JST; 2min 55s ago
TriggeredBy:  docker.socket
       Docs: https://docs.docker.com
   Main PID: 3550 (dockerd)
      Tasks: 8
     Memory: 91.4M (peak: 93.0M)
        CPU: 115ms
     CGroup: /system.slice/docker.service
             └─3550 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Dockerコマンドが実行できるか確認します。

sudo docker run hello-world

“Hello from Docker!” のメッセージが表示されれば、設定は完了です。


非rootユーザーでのDocker利用設定

デフォルトでは、`docker` コマンドを実行するには `sudo` が必要です。開発ワークフローをスムーズにするため、現在のユーザーを `docker` グループに追加し、`sudo` なしでDockerコマンドを実行できるように設定しましょう。

sudo usermod -aG docker $USER

この変更を反映させるには、一度Multipassインスタンスからログアウトし、再度ログインする必要があります。

exit<br>multipass shell docker-host

再度ログイン後、`sudo` なしでDockerコマンドが実行できるか確認します。

docker run hello-world

“Hello from Docker!” のメッセージが表示されれば、設定は完了です。


MultipassでDockerコンテナを動かす

Docker Engineのインストールが完了したので、実際にコンテナを動かしてみましょう。

基本的なDockerコマンドの実行

まずは、簡単なNginxコンテナを起動してみます。

docker run -d -p 80:80 --name my-nginx nginx

コマンド実行例(nginxコンテナの起動):

ubuntu@my-ubuntu-vm:~$ docker run -d -p 80:80 --name my-nginx nginx<br>Unable to find image 'nginx:latest' locally<br>latest: Pulling from library/nginx<br>f4e51325a7cb: Pull complete <br>e2a2ff429ed9: Pull complete <br>4c5dff34614b: Pull complete <br>f0838cc8bade: Pull complete <br>bb2e7b5dc9bc: Pull complete <br>08b278be6f74: Pull complete <br>5f648e62e9ca: Pull complete <br>Digest: sha256:8adbdcb969e2676478ee2c7ad333956f0c8e0e4c5a7463f4611d7a2e7a7ff5dc<br>Status: Downloaded newer image for nginx:latest<br>5ece1a982894711d537de47f58bcfaa0feecd3f655e42b80ed243305ed1b8be8

`docker ps` でコンテナが起動していることを確認できます。

docker ps

コマンド実行例(nginxコンテナの状態確認):

ubuntu@my-ubuntu-vm:~$ docker ps<br>CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                 NAMES<br>5ece1a982894   nginx     "/docker-entrypoint.…"   14 seconds ago   Up 13 seconds   0.0.0.0:80->80/tcp, [::]:80->80/tcp   my-nginx

ホストOSのブラウザからMultipassインスタンスのIPアドレスにアクセスすると、Nginxのデフォルトページが表示されるはずです。MultipassインスタンスのIPアドレスは `multipass info docker-host` で確認できます。

multipass info docker-host

コマンド実行例(Multipassインスタンスの状態確認):

user-name@your-mac ~ % multipass info my-ubuntu-vm <br>Name:           my-ubuntu-vm<br>State:          Running<br>Snapshots:      0<br>IPv4:           192.168.2.3<br>                172.17.0.1<br>Release:        Ubuntu 24.04.3 LTS<br>Image hash:     6177a7958f01 (Ubuntu 24.04 LTS)<br>CPU(s):         1<br>Load:           0.01 0.02 0.00<br>Disk usage:     2.6GiB out of 4.8GiB<br>Memory usage:   304.6MiB out of 952.9MiB<br>Mounts:         --
[!NOTE]
`multipass info` コマンドで表示される `IPv4` アドレスをブラウザに入力してください。

`docker-compose` を使った複数コンテナ管理

実際の開発では、複数のサービスを連携させるために `docker-compose` を利用することがほとんどです。ここでは、簡単なWebアプリケーション(Nginx + Node.js)を `docker-compose` で起動する例を見てみましょう。

まず、作業ディレクトリを作成し、`docker-compose.yml` ファイルと簡単なNode.jsアプリケーションファイルを作成します。

mkdir my-app<br>cd my-app

`app.js` を作成します。

// app.js
const http = require('http');
const hostname = '0.0.0.0';
const port = 3000;

const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello from Node.js in Docker!\n');
});

server.listen(port, hostname, () => {
console.log(Server running at http://${hostname}:${port}/);
});

`Dockerfile` を作成します。

FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]

`package.json` を作成します。

// package.json
{
  "name": "my-node-app",
  "version": "1.0.0",
  "description": "A simple Node.js app",
  "main": "app.js",
  "scripts": {
    "start": "node app.js"
  },
  "author": "",
  "license": "ISC"
}

`docker-compose.yml` を作成します。

# docker-compose.yml
services:
  web:
    build: .
    ports:
      - "3000:3000"
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - web

`nginx.conf` を作成します。

# nginx.conf
server {
    listen 80;
    server_name localhost;

    location / {
        proxy_pass http://web:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
ファイルが揃ったら、`docker-compose up` でサービスを起動します。
docker compose up -d

`docker ps` で両方のコンテナが起動していることを確認し、MultipassインスタンスのIPアドレスにアクセスすると、Node.jsアプリケーションの “Hello from Node.js in Docker!” というメッセージがNginx経由で表示されるはずです。 動作確認が終わったら、サービスを停止します。

docker compose down

FAQ:MultipassとDockerに関するよくある疑問

Q1: Docker Desktopと比べて、Multipass上でDockerを使うメリットは何ですか?

A1: 主なメリットは、リソース消費の抑制柔軟なリソース割り当てライセンスの心配不要、そしてより純粋なLinux環境での動作です。特に、Macのリソースが限られている場合や、複数の開発環境を同時に動かす必要がある場合に、その効果を実感できるでしょう。

Q2: パフォーマンスはDocker Desktopと比べてどうですか?

A2: 一般的に、MultipassはDocker Desktopよりも軽量に動作するため、システム全体のリソース消費は抑えられます。ただし、ファイルI/Oのパフォーマンスは、multipass mount を使った共有ディレクトリの場合、ネイティブのファイルシステムに比べて若干のオーバーヘッドが発生する可能性があります。パフォーマンスが重要な場合は、Multipassインスタンス内でGitクローンを行うなど、ファイルI/Oをインスタンス内で完結させる工夫も有効です。

Q3: Multipass上でKubernetesを動かすことはできますか?

A3: はい、可能です。Multipassインスタンス上にMinikubeやK3sといった軽量なKubernetesディストリビューションをインストールすることで、ローカルでKubernetes環境を構築できます。これにより、本番環境に近い形でアプリケーションのテストや開発を行うことが可能になります。

Q4: Multipassインスタンスのネットワーク設定はどのようにすれば良いですか?

A4: MultipassインスタンスはデフォルトでNATネットワーク構成となり、ホストOSからインスタンスへのSSH接続や、インスタンスから外部へのアクセスが可能です。特定のポートをホストOSに公開したい場合は、multipass set コマンドやSSHポートフォワーディングを利用します。より複雑なネットワーク構成が必要な場合は、cloud-init を使ってインスタンス起動時にネットワーク設定をカスタマイズすることも可能です。


まとめ:コンテナ開発の新たな選択肢

本記事では、macOS開発者向けにMultipassインスタンス上にDocker環境を構築・運用する方法を解説しました。Docker Desktopの代替としてMultipassを活用することで、リソース効率が良く、柔軟性の高いコンテナ開発環境を手に入れることができます。

  • リソース効率: 軽量なMultipassインスタンスがMacのリソース消費を抑え、快適な開発をサポートします。
  • 柔軟な管理: CPU、メモリ、ディスクサイズを自由に設定し、プロジェクトに最適な環境を構築できます。
  • シームレスな連携: VS Codeのリモート開発機能を活用することで、ホストOSからMultipass上のDockerを快適に操作できます。

これで、あなたはDocker Desktopの制約から解放され、より自由でパワフルなコンテナ開発の世界へ足を踏み入れることができるでしょう。

次の記事

次の記事では、Multipassインスタンス上にNode.js + PostgreSQL、そしてPython + Djangoといった具体的な開発スタックを構築する手順を、ステップバイステップで解説します。
さらに、パフォーマンスを最大限に引き出すための最適化のヒントもご紹介します。

この記事が役に立ったら、ぜひチームに共有したり、X(旧Twitter)で感想をポストしてください!あなたのMultipass活用術もぜひコメントで教えてくださいね。


免責事項

本記事の内容は、執筆時点での情報に基づいています。ソフトウェアのバージョンアップ等により、手順や設定が変更される可能性があります。ご自身の責任において、最新の情報を確認し、適切な対応をお願いいたします。

SNSでもご購読できます。

コメントを残す

*