Dockerを使ったMacでのコンテナ作成チュートリアル
はじめに
ソフトウェア開発の現場では、プラットフォームごとの依存関係やライブラリの管理が大きな課題になりがちです。
特に、あるプロジェクトではPython 3.9を使い、別のプロジェクトではPython 3.10を使うといった状況になると、環境の整合性をとるのに苦労することが多いでしょう。
そこで注目されているのが、コンテナ技術です。
コンテナを使えば、開発環境を「セット」で用意し、OSやハードウェアの違いを吸収しながら同じ状態を再現できます。
その中でも、近年広く活用されているのがDockerです。
Macを使っている方も、Dockerを導入することで、Linuxベースの環境を気軽に扱えるようになります。
このガイドでは、最初にMacにDockerを導入するところから、コンテナを運用する際のポイント、さらにセキュリティ面や実務での使い方までを一通り解説します。
初心者の方でも理解しやすいように、なるべく専門用語をかみ砕きながら話を進めますので、ぜひ気軽に読み進めてください。
この記事を読むとわかること
- コンテナ技術の概要
- MacでDockerを導入する際の手順
- イメージやコンテナといった基本用語の理解
- Docker Composeを使った複数コンテナの管理
- よくあるトラブルの対処法
- 実務で運用する際に押さえておきたいポイント
ここから始めて、ひととおりの流れを把握しておくと、開発環境を整える作業がずいぶん楽になるはずです。
コンテナ技術とは何か
コンテナ技術とは、アプリケーションとその依存ライブラリ、設定ファイルなどを一まとめにして、どこでも同じように動かせるようにするための仕組みです。
サーバーやPCが異なる環境であっても、コンテナという単位でアプリを動かせば、同じ振る舞いをするわけです。
仮想マシン(VM)との違い
もともと、開発者は「仮想マシン」と呼ばれる手法で環境を整えていました。
仮想マシンはホストOS上で別のOSを丸ごと動かす仕組みです。
しかし仮想マシンは、以下のような特徴があります。
- リソース消費が多い:OSごと立ち上げるためメモリやストレージを大量に使う
- 起動が遅め:システムブートのプロセスがあり、すぐには立ち上がらない
- 環境構築がやや複雑:イメージファイルも大きく、管理が大変
それに対してコンテナ技術では、ホストOSのカーネルを共有しながら各種ライブラリを分離して運用できます。
この点が軽量性と起動速度の速さにつながっています。
Dockerが登場して広がった背景
コンテナそのものは昔からあった考え方ですが、Dockerの登場によって次のようなメリットが広く認識され、普及が進みました。
- 使い方がシンプル:コマンドがわかりやすく、リポジトリからコンテナを取り寄せる流れが簡潔
- コミュニティとエコシステムが充実:世界中で利用され、公式のドキュメントや便利なツールが豊富
- マルチプラットフォーム対応:WindowsやMac、Linuxといった多様な環境で同じアプリを動かせる
Mac上であっても、Dockerを導入すればLinuxベースのコンテナを軽快に扱えるため、多くの開発者から支持を得ています。
MacへのDockerインストール手順
ここからは、実際にMacへDocker Desktopをインストールするまでの流れを解説します。
インストール前に確認すること
- OSバージョン:現在のmacOSがサポート対象かどうか
- ハードウェア要件:メモリやストレージの空き容量が十分か
- 仮想化のサポート:Appleシリコン(M1/M2など)の場合でもDockerは動作しますが、特定のイメージによってはARMアーキテクチャ向けに調整が必要になることがあります
Docker Desktop for Macの導入手順
- 公式サイトからMac向けのインストーラをダウンロード
- ダウンロードしたファイルを開き、アプリケーションフォルダにドラッグ&ドロップ
- アプリケーションフォルダのDockerアイコンをクリックし、起動
- 初回起動時にライセンスや利用規約が表示されるので、確認して同意
- Mac上部のメニューバーにクジラのアイコンが表示されれば起動完了
これでターミナルでも docker
コマンドが使えるようになります。
試しに以下を入力し、バージョン情報が表示されればインストール成功です。
docker version
初めてのコンテナ起動
Dockerの基本的な動作を確かめるために、まずは公式イメージ「hello-world」を実行してみましょう。
docker run hello-world
このコマンドを実行すると、「Hello from Docker!」などのメッセージが表示されるはずです。
表示されれば、コンテナが問題なく動くことを確認できたことになります。
Dockerの基本用語を整理する
ここでは、Dockerを使ううえで頻出する用語をまとめます。
用語が整理できていると、実務でドキュメントを読んだり同僚とやり取りをする際にも混乱しにくくなります。
イメージ (Image)
コンテナを生み出すための「設計図」です。
たとえば、Pythonがプリインストールされたイメージや、Node.js用のイメージなどが用意されており、一度ダウンロードすれば何度でもコンテナを生成できます。
コンテナ (Container)
イメージを実行した「実体」です。
イメージはあくまで静的なファイルの集合であり、そこから実行プロセスを立ち上げた状態がコンテナにあたります。
複数のコンテナを同時に立ち上げることも可能で、それぞれ独立したアプリケーション環境として振る舞います。
Dockerfile
独自のイメージを作りたい場合に作成する設定ファイルです。
FROM python:3.10
COPY . /app
WORKDIR /app
RUN pip install --no-cache-dir -r requirements.txt
CMD ["python", "app.py"]
このように書くと、「python:3.10」イメージをベースにソースコードをコピーし、必要なパッケージをインストールしたあとに「app.py」を実行するイメージが出来上がります。
Docker Compose
複数のコンテナをまとめて管理したいときに使う仕組みです。
docker-compose.yml
というファイルに、立ち上げたいコンテナやネットワーク設定などを定義しておけば、 docker-compose up
のワンコマンドで全部のコンテナを起動できます。
大規模なプロジェクトや、Webサーバーとデータベースを連携させるときなどに特に便利です。
Dockerを使った開発の全体像
実際にDockerを使って開発する流れを大まかに把握しておきましょう。
1. イメージの選択または作成
まずは、「公式イメージをそのまま使うか」「独自のDockerfileを用意してカスタムイメージを作るか」を決めます。
- 公式イメージを使う場合: 既存のリポジトリからイメージをダウンロードして運用
- Dockerfileで独自イメージを作る場合: 必要なツールやライブラリをインストールした状態を一括で定義
2. コンテナの起動
以下のようなコマンドを使い、コンテナを起動します。
docker run -d --name myapp -p 8080:80 myapp-image
-d
はバックグラウンド起動--name
でコンテナ名を指定-p 8080:80
でポートをホストの8080からコンテナの80へマッピング
3. 開発・テスト
アプリケーションのコードを編集しながら、コンテナ内部で動く様子を確かめます。
ホットリロードをしたい場合や、エディタでコードを編集したい場合は、ボリュームマウントやDocker Composeを活用して、ホストディレクトリをコンテナ内と共有するケースが多いです。
4. 停止と削除
コンテナが不要になったら、以下のように停止や削除を行います。
docker stop myapp docker rm myapp
イメージも不要であれば削除しますが、別のプロジェクトで流用することもあるため、状況に応じて判断しましょう。
複数コンテナをまとめて動かすDocker Compose
実務の開発シーンでは、Webサーバーとデータベース、さらにキャッシュサーバーやキーバリューストアなど、複数のコンテナを連携させる場面がよくあります。
そのとき大活躍するのがDocker Composeです。
Docker Composeとは
Compose は、複数のコンテナを一括で管理するためのツールです。
docker-compose.yml
というファイルを使い、各コンテナのビルド手順、起動時の設定、ネットワーク設定などを記述します。
簡単な例
version: "3" services: web: build: ./web ports: - "8080:80" depends_on: - db db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: rootpassword volumes: - db-data:/var/lib/mysql volumes: db-data:
このファイル例では、web と db という2つのコンテナを管理しています。
- webコンテナ:
./web
フォルダのDockerfileからビルドし、ホストの8080番ポートをコンテナの80番ポートにマッピング - dbコンテナ: mysql:8.0 イメージを使い、環境変数でパスワードを設定。永続化のために
db-data
という名前のボリュームを割り当て
こうして構成を定義しておくと、以下のコマンドだけで起動と停止がまとめてできます。
docker-compose up -d docker-compose down
Docker Composeは、複数サービスの起動順序を管理したりネットワークの連携を自動でやってくれたりするため、手動で設定ファイルを切り替える手間を大幅に削減できます。
Mac特有の注意点
MacでDockerを使うときには、いくつか気をつけておきたいポイントがあります。
Appleシリコンへの対応
M1やM2を搭載したMacではARMアーキテクチャが使われており、従来のIntelベースのイメージがそのまま使えないケースがあります。
多くの公式イメージはすでにARMにも対応しており、自動で最適化されたイメージがダウンロードされることが増えてきました。
ただし、イメージによってはplatform
を指定する必要がある、あるいは一部動作が不安定になるといった事例もあるため、必要に応じて設定を見直しましょう。
リソースの割り当て
Docker Desktop for Macでは、Dockerに割り当てるCPUコア数やメモリ、ストレージ領域を設定できます。
初期設定のままだとメモリ割り当てが少なく、コンテナが大量に動いたときにパフォーマンスが落ちる場合があります。
かといってメモリを上げすぎると、Mac自体が重くなる可能性があるので、手持ちのマシンのスペックに合わせて調整しましょう。
ディスクスペースとイメージの管理
コンテナやイメージをたくさんダウンロードすると、その分だけストレージを消費します。
使わないイメージが溜まると無駄な容量を圧迫するため、定期的に以下のコマンドで確認・削除を行うと良いでしょう。
# 使用中でないコンテナやネットワークを一括クリーンアップ docker system prune -f
不要なものはこまめにクリーンアップしておけば、Macのディスクを圧迫しにくくなります。
トラブルシューティング
Dockerを使っていて問題が起きたとき、どう対処すればよいのか、代表的なトラブルと解決策を紹介します。
コンテナが起動しない
- エラーログの確認:
docker logs コンテナ名
でコンテナ内のログを見る - ポートの競合: ホスト上ですでに同じポートを使っているサービスがある場合は競合するので、別のポート番号を割り当てる
- 環境変数の設定ミス: DBのパスワードや接続先URLが正しいか確認
ネットワーク接続の問題
- コンテナ同士の通信: Docker Composeで同じネットワーク内にサービスを定義しているか、
docker-compose.yml
の書き方を見直す - ホストへのポートフォワーディング:
-p
で正しいポートマッピングを設定しているか再度確認 - ファイアウォール設定: Macのセキュリティ設定によってアクセスがブロックされていないかチェック
イメージのビルドが遅い
- キャッシュの活用: Dockerはビルド時にキャッシュを利用するため、変更が少ないステップは再ビルドしなくて済むようにDockerfileの記述順を工夫する
- ネットワーク速度: 大きなイメージをダウンロードする際には回線状況が影響するので、可能な限り安定したネットワーク環境を使用
- マルチステージビルド: 不要な依存関係やビルドツールを最終イメージに含めないようにすることで、サイズとビルド時間を削減
コンテナを起動できない、ビルドが進まないといった問題が起きた場合、まずはエラーメッセージとログをチェックすることが一番の近道です。
実務での活用ポイント
ここでは、個人の学習だけでなく、チーム開発や運用段階での利用を想定したポイントをいくつか挙げます。
バージョン管理システムとの組み合わせ
Dockerfileや docker-compose.yml
はバージョン管理システム(Gitなど)で管理します。
こうすることで、環境構築の履歴をたどりやすくなり、メンバー全員が同じ設定で開発を進めることが可能です。
また、CI/CDパイプラインで自動ビルド・テストを実行するときにも、設定ファイルがバージョン管理下にあるとスムーズです。
テスト環境の再現
コンテナを使えば、テスト用のサーバー環境をほぼ本番と同じ構成で簡単に再現できます。
開発者ごとに微妙に異なるライブラリのバージョンやOS設定がテスト結果に影響しないよう、Dockerで環境を統一すると安心です。
セキュリティと脆弱性対応
コンテナイメージの中にはOSやライブラリが含まれているため、脆弱性が見つかったら更新する必要があります。
定期的にイメージスキャンを行う、脆弱性情報を確認するなどして安全な状態を保つようにしましょう。
チーム開発では、プライベートレジストリを運用し、社内標準のベースイメージをメンテナンスするケースも多いです。
セキュリティの基本対策
コンテナ技術を活用するうえで、セキュリティ面は見落とせません。
特に、パブリックレジストリから直接イメージを取得して使う場合は、悪意のある改変が含まれている可能性もゼロではありません。
安全なイメージソースを選択
- 公式イメージや信頼できるベンダーが提供するイメージを使う
- 不審なイメージをダウンロードしない
不要なサービスやパッケージを入れない
コンテナイメージには必要最低限のものだけを入れるのが望ましいです。
使わないサービスやパッケージが多いと、セキュリティリスクの要因が増えてしまいます。
権限の分離
Docker環境を運用する際には、原則として特権ユーザー(root)で動かさないのが基本です。
USER
命令で一般ユーザーを設定しておき、コンテナが不要な権限を持たないようにします。
チーム開発におけるDockerの利点
チームで開発を進めるとき、Dockerを導入すると以下のメリットが顕著に現れます。
開発環境の統一
メンバーごとに異なるOSを使っていても、コンテナ経由で同じバージョンのプログラミング言語やフレームワークを使えます。
「自分の環境では動くのに、他の人の環境では動かない」という問題を最小限に抑えられます。
セットアップの時間短縮
チームに新しいメンバーが加わったときも、Dockerイメージさえ取得すればすぐに開発を始められます。
設定ファイルやライブラリのインストールなど、環境構築にかける時間を大幅に削減できます。
CI/CDパイプラインでの活用
テストやビルドプロセスをDockerコンテナ上で実行することで、本番環境に近い形での検証が可能になります。
コンテナを使ったテスト基盤であれば、ビルドエラーや環境依存の問題を早期に発見しやすくなります。
開発効率を高めるためのテクニック
Dockerを使いこなすには、いくつかのコツがあります。
ここでは開発効率をさらに向上させるためのテクニックを紹介します。
キャッシュを有効活用する
Dockerイメージのビルド時、Dockerは各ステップをキャッシュに保存します。
下記のように、変更が頻繁に起きるファイルのコピーやパッケージインストール命令をDockerfileの後半に書くことで、キャッシュを無駄に無効化しないように工夫できます。
# 変更が少ないベースOSやライブラリのインストールを先に FROM python:3.10 # 変更の可能性が比較的低いライブラリのインストール RUN pip install --no-cache-dir numpy # 頻繁に更新されるソースコードは最後にコピー COPY . /app WORKDIR /app CMD ["python", "main.py"]
マルチステージビルド
ビルド時に必要なツールや依存ライブラリを最終イメージに含めたくない場合は、マルチステージビルドを利用します。
ビルド用とランタイム用のステージを分割し、最終的には小さなイメージを作ることができます。
ローカルフォルダのボリュームマウント
Macのフォルダをコンテナ内にマウントすることで、コンテナを再ビルドしなくてもソースコードを編集・反映することができます。
docker run -v $(pwd):/app -p 8080:80 myapp-image
このように書くと、現在のディレクトリ($(pwd)
)をコンテナ内の /app
にマウントして利用できます。
さらに応用したい運用管理
Dockerは開発段階で活用するだけでなく、実運用にも対応できる柔軟な仕組みを持っています。
コンテナオーケストレーション
大規模な環境では、Kubernetes や Docker Swarm などのオーケストレーションツールを使い、複数のサーバーやコンテナを一括管理する方法があります。
ただし、これらの運用は学習コストが高めなので、まずは1台のサーバーやMac上でのDocker運用に慣れるところから始めるのが良いでしょう。
CI/CDパイプラインとの連携
GitのリポジトリにプッシュしたタイミングでDockerイメージをビルドしてテストし、その結果が合格ならコンテナを本番環境にデプロイする、といった自動化フローを構築することもできます。
本番サーバー側でもDockerが動いていれば、ローカルとほぼ同じイメージをそのまま持ち込むだけなので、デプロイの手間が大幅に減ります。
プライベートレジストリの利用
機密情報が含まれるイメージや、独自にカスタマイズしたベースイメージがある場合、プライベートレジストリを使うと安全にイメージを共有できます。
チーム内だけでアクセス可能なレジストリを運用することで、セキュリティを確保しつつ効率よくイメージを管理できるでしょう。
学習の進め方と情報収集のコツ
これまでの内容を踏まえ、さらにスキルを深めたい場合、どのように学習を進めればよいのか考えてみます。
小さなプロジェクトを立ち上げる
最初は個人の学習用に、静的サイトのホスティングや、簡単なAPIサーバーとデータベースの連携など、小さなプロジェクトでDocker環境を試してみると良いでしょう。
失敗しても大きな影響がない範囲で、DockerfileやComposeの書き方、ボリューム管理などの基礎を体得することができます。
コミュニティやフォーラムを活用
英語のドキュメントに抵抗がなければ、公式フォーラムや海外の情報源からの知識が得られるでしょう。
もし英語が苦手でも、日本語コミュニティで質問すると同様の疑問を抱えた人が多く、答えが見つかりやすいはずです。
ハンズオンで実務イメージをつかむ
単にDockerのコマンドを覚えるだけでなく、実際に動くアプリケーションをコンテナ上で立ち上げ、そのプロセスをモニタリングしたり、エラーを解析したりすると理解が深まります。
一連の流れを体験することで、コンテナ化のメリットを肌で感じられるようになるでしょう。
まとめ
今回は、Mac上でDockerを導入し、コンテナ技術を活用するための基礎知識から始め、Composeやセキュリティ、実務での運用まで、広範囲にわたって解説しました。
コンテナは、言語やフレームワークが違うプロジェクトを同時に扱う際や、チーム開発で環境がバラバラになりがちな問題を解決する手段の一つです。
Macユーザーにとっても、有用なツールやイメージが豊富にそろっているため、開発効率を高める大きな味方となるでしょう。
もし、途中でトラブルに遭遇したとしても、コンテナのログを調べたり、ファイアウォールやネットワーク設定を見直したりすれば、たいていは解決の糸口が見つかるはずです。
自分だけの使いやすい環境をコンテナとしてまとめ上げておけば、新しい開発案件が始まるたびに面倒なセットアップをする必要も格段に減ります。
気になる部分や疑問があれば、コミュニティや公式ドキュメントを参考にしながら、少しずつ使い方を洗練させていくと良いでしょう。
皆さんもぜひ、Dockerを活用して、開発環境の整備やチーム連携をよりスムーズに進めてみてください。