はい、承知いたしました。Docker Desktop for Macを始めようとしている初心者の方に向けた、約5000語の詳細な解説記事を執筆します。
Docker Desktop for Macを始めよう!初心者向け徹底解説
Macユーザーの皆さん、開発やアプリケーションの実行環境構築でこんな悩みを抱えていませんか?
- 「このアプリケーションを動かすには、特定のOSバージョンやライブラリが必要で、今の環境に入れると他のものが壊れそう…」
- 「新しいプロジェクトを始めるたびに、開発環境のセットアップに時間がかかるし、人によって環境が微妙に違うせいで動かないことがある…」
- 「本番環境と開発環境でOSや設定が違うから、デプロイしてから問題が見つかる…」
- 「たくさんのサービス(Webサーバー、データベース、キャッシュなど)を組み合わせたいけど、それぞれインストールして連携させるのが大変…」
これらの悩みを解決する強力なツールが「Docker」です。そしてMacユーザーにとって、Dockerを最も手軽に、そしてパワフルに利用できるのが「Docker Desktop for Mac」です。
この記事では、「Dockerって何?」「Docker Desktop for Macってどう使うの?」といったゼロからの疑問に答えながら、インストール方法から基本的な使い方、そして簡単なアプリケーションを動かす実践例まで、初心者の方でも安心してDockerの世界に飛び込めるように徹底的に解説していきます。約5000語に及ぶ詳細な解説で、あなたの開発ライフをよりスムーズで効率的なものに変える手助けができれば幸いです。
さあ、Docker Desktop for Macの世界へ一緒に踏み出しましょう!
1. はじめに:なぜ今、Dockerなのか?
1.1 Dockerとは何か? コンテナの魔法
Dockerを一言で説明するなら、「アプリケーションとその実行に必要なものをすべて一つにまとめて、どこでも同じように動かせるようにする技術」です。この「すべてをまとめたもの」を「コンテナ(Container)」と呼びます。
コンテナは、例えるなら「規格化された引っ越し用ダンボール」のようなものです。アプリケーション本体、必要なライブラリ、設定ファイル、実行環境(OSの一部機能など)といった、アプリケーションが動くために必要な要素すべてを、このダンボールに詰めてしまいます。このダンボール(コンテナ)は、WindowsでもMacでもLinuxでも、あるいはクラウド上でも、コンテナを扱える場所であれば、中身を変えずにそのまま運び、開けてすぐにアプリケーションを動かすことができます。
これが、Dockerが「Build, Ship, and Run Any App, Anywhere(どんなアプリケーションも、どこでもビルド、配布、実行できる)」と謳われる理由です。
1.2 仮想マシン(VM)との違い
Dockerのコンテナ技術は、従来の仮想マシン(Virtual Machine: VM)と比較されることが多いですが、両者には重要な違いがあります。
特徴 | 仮想マシン (VM) | Dockerコンテナ |
---|---|---|
構造 | ホストOSの上にハイパーバイザー、その上にゲストOSとアプリ | ホストOSの上にDockerエンジン、その上にコンテナ(OSの一部機能とアプリ) |
OS | ゲストOS全体が必要 | ホストOSのカーネルを共有、ゲストOS全体は不要 |
起動時間 | 数分~数秒 | 数秒~ミリ秒 |
リソース | 各VMが独自のOSリソースを持つため、消費が大きい | ホストOSのリソースを共有し、消費が小さい |
サイズ | 数GB~数十GB | 数MB~数百MB |
目的 | OSレベルでの完全な分離、異なるOSを実行 | アプリケーションとその依存関係の分離、ポータビリティ |
VMは、ハードウェアの上にハイパーバイザー(VirtualBox, VMware, Hyper-Vなど)があり、その上で「ゲストOS」を丸ごと起動します。Windows上でLinuxを動かしたり、Mac上でWindowsを動かしたりといった、完全に独立したOS環境が必要な場合に適しています。しかし、ゲストOS自体の起動やOSに必要なリソースの消費が大きくなる傾向があります。
一方Dockerコンテナは、ホストOS(MacならmacOS)のカーネル(OSの核となる部分)を共有し、その上でアプリケーションとその依存関係だけをパッケージングします。ゲストOS全体を起動する必要がないため、起動が非常に速く、消費するリソースも少なくて済みます。これは、例えるならVMが「各部屋にミニキッチンとバスルームがついた完全に独立したアパートの一室」だとすれば、コンテナは「共有キッチンやバスルームを使う代わりに、自分の部屋はコンパクトで、すぐに移動できるシェアハウスの一室」のようなイメージです。
開発環境の構築や、複数のサービスを連携させて動かすような場合には、軽量で高速、そしてポータビリティに優れたコンテナ技術が非常に強力なツールとなります。
1.3 Docker Desktop for Macとは?
MacでDockerを動かすための公式アプリケーションです。かつてMac上でDockerを動かすには、VirtualBoxのようなVMソフトウェアの上にLinuxをインストールし、その中でDockerを動かす必要がありました(Docker Toolboxなど)。しかし、Docker Desktopが登場してからは、その複雑な設定が不要になりました。
Docker Desktop for Macは、macOS上でLinuxVMを内部的に実行し、そのVM上でDockerエンジンを動かします。しかし、このVMの存在をユーザーが意識することはほとんどなく、あたかもmacOS上で直接Dockerが動いているかのように、使い慣れたターミナルや専用のGUIアプリケーションからDockerを操作できます。
Docker Desktop for Macを使えば:
- 簡単なインストールでDocker環境が手に入ります。
- macOSのターミナルから
docker
コマンドを直接実行できます。 - 直感的なGUIアプリケーションで、実行中のコンテナやイメージを視覚的に管理できます。
- ファイルの共有やポートのマッピングといったネットワーク設定が容易に行えます。
- Kubernetesのようなコンテナオーケストレーションツールも簡単に利用開始できます(オプション)。
MacでDockerを利用する上で、Docker Desktop for Macは最も標準的で推奨される方法と言えるでしょう。
1.4 この記事で学ぶこと
この記事は、Dockerやコンテナ技術に初めて触れるMacユーザーを対象としています。以下の内容をステップバイステップで学びます。
- Dockerの基本的な概念(コンテナ、イメージ、Dockerfileなど)を理解する。
- Docker Desktop for Macのインストール手順をマスターする。
- ターミナルを使ってDockerを操作する基本的なコマンドを覚える。
- 簡単なWebサーバーやLinux環境をDockerコンテナで動かしてみる。
- 独自のDockerfileを作成し、カスタムイメージをビルドして実行する。
- コンテナのデータを永続化する方法(Volume)を知る。
- 複数のコンテナをまとめて管理するDocker Composeの基本を学ぶ。
- Docker Desktop for Macの便利な機能や、よくある疑問・トラブルシューティングについて知る。
この記事を最後まで読めば、あなたはDockerの基本的な使い方を習得し、自身の開発ワークフローにDockerを取り入れる第一歩を踏み出せているはずです。
2. Dockerの基本概念を理解しよう
Dockerを使い始める前に、いくつかの重要な概念を理解しておくことが大切です。
2.1 コンテナ (Container)
前述の通り、コンテナは「アプリケーションとその実行に必要なものをすべて詰め込んだ、分離された実行環境」です。コンテナは軽量で使い捨て可能であることが一般的です。必要に応じて起動し、役割を終えれば停止・削除します。
コンテナは「イメージ (Image)」から生成されます。例えるなら、イメージが「設計図」や「金型」であり、コンテナが「設計図に基づいて作られた実際の建築物」や「金型から作られた製品」です。一つのイメージから、同じ状態のコンテナを複数起動することができます。
2.2 イメージ (Image)
イメージは「コンテナを起動するためのテンプレート」です。アプリケーションのコード、ランタイム(Java, Python, Node.jsなど)、システムツール、ライブラリ、設定ファイルなど、コンテナを構成するために必要なファイルシステムやメタデータがすべて含まれています。
イメージは「レイヤー構造」になっています。これは、イメージが複数の読み込み専用のレイヤー(層)を重ねて構成されていることを意味します。例えば、あるイメージがUbuntuというOSの上にApacheというWebサーバーをインストールしている場合、「Ubuntuのベースレイヤー」の上に「Apacheのインストールレイヤー」が重ねられています。このレイヤー構造のおかげで、共通の部分は共有され、イメージのサイズが小さく保たれ、ビルドも効率的に行われます。
イメージは不変(Immutable)です。一度ビルドされたイメージの内容は変更できません。もし変更が必要な場合は、新しいイメージをビルドします。これにより、常に同じ環境を再現できる保証が得られます。
2.3 Dockerfile
Dockerfileは「イメージを自動的にビルドするための手順を記述したテキストファイル」です。Dockerfileには、どのベースイメージを使うか、必要なファイルをコピーするか、コマンドを実行するか、どのポートを公開するか、アプリケーションの起動コマンドは何か、といったイメージ作成の一連の手順が、特定の書式で記述されています。
例えば、シンプルなWebサイトを動かすNginxイメージを作成する場合、Dockerfileは以下のようになるかもしれません。
“`dockerfile
どのイメージをベースにするか
FROM nginx:latest
ホストマシンのファイルをイメージ内の特定の場所にコピーする
COPY html/ /usr/share/nginx/html/
コンテナ起動時に実行されるコマンド(この場合はNginxをフォアグラウンドで起動)
CMD [“nginx”, “-g”, “daemon off;”]
コンテナが公開するポート(ドキュメントとしての意味合いが強い)
EXPOSE 80
“`
Dockerfileを使うことで、イメージのビルド手順をコードとして管理し、再現性のあるイメージ作成が可能になります。
2.4 Registry
Registryは「Dockerイメージを保管・共有する場所」です。世界中で最も有名なPublic RegistryはDocker公式の「Docker Hub」です。Docker Hubには、UbuntuやNginx, MySQLといった公式イメージや、世界中の開発者が作成・公開したイメージが多数登録されています。
docker pull [イメージ名]
コマンドを使うと、Registryからイメージを取得(ダウンロード)できます。docker push [イメージ名]
コマンドを使うと、ローカルでビルドしたイメージをRegistryにアップロードして共有できます。
Docker Hub以外にも、プライベートなRegistryを構築したり、クラウドプロバイダーが提供するRegistryサービス(AWS ECR, Google Container Registryなど)を利用したりすることも可能です。
2.5 Volume
コンテナはデフォルトでは使い捨てであり、コンテナ内で発生したデータ(ログファイル、データベースのデータなど)は、コンテナが削除されると一緒に消えてしまいます。永続化したいデータや、ホストマシンとコンテナで共有したいファイルがある場合は、「Volume」を利用します。
Volumeを使うと、コンテナのライフサイクルとは独立してデータを管理できます。主に以下の2種類があります。
- 名前付きVolume (Named Volumes): Dockerが管理する領域にデータが保存されます。コンテナの内部パスとVolume名をマッピングします。Dockerコマンドで簡単に作成、管理できます。
- バインドマウント (Bind Mounts): ホストマシンの特定のディレクトリを、コンテナ内の特定のディレクトリにマッピングします。開発中のコードをコンテナにマウントして、コードを編集したらすぐにコンテナ内の挙動を確認する、といった用途によく使われます。
データベースのデータのような永続化が必要なデータには名前付きVolume、開発中のコードや設定ファイルの共有にはバインドマウント、という使い分けが一般的です。
2.6 Network
Dockerコンテナは、デフォルトでいくつかのネットワーク設定が利用可能です。コンテナ間の通信や、ホストマシンとコンテナ間の通信、あるいは外部ネットワークとの通信を制御します。
- bridge (デフォルト): コンテナはDockerが作成する仮想ネットワークブリッジに接続されます。同じブリッジネットワーク上のコンテナは互いにIPアドレスで通信できます。ホストマシンからはポートフォワーディング(マッピング)を使ってコンテナにアクセスするのが一般的です。
- host: コンテナはホストマシンのネットワークスタックを共有します。コンテナが特定のポートを公開すると、ホストマシン上のそのポートも開放されます。隔離性は低くなります。
- none: ネットワークに接続しません。
- overlay, macvlanなど: Docker Swarmなどの複数ホスト環境で利用される高度なネットワークタイプ。
通常、単一のホスト上でコンテナを動かす場合はbridge
ネットワークが使われます。複数のコンテナ(例えばWebサーバーコンテナとデータベースコンテナ)を連携させる場合は、ユーザー定義のbridgeネットワークを作成して、そのネットワークにコンテナを接続すると、コンテナ名で名前解決して通信できるようになり便利です(これはDocker Composeを使うと簡単に行えます)。
これらの概念を理解することで、Dockerがどのように動作し、どのように活用できるのかが見えてきます。少し難しいと感じるかもしれませんが、実際に手を動かしながら学ぶことで、徐々に理解が深まっていくはずです。
3. Docker Desktop for Macのインストール準備
Docker Desktop for Macをインストールする前に、お使いのMacがシステム要件を満たしているか確認しましょう。
3.1 システム要件
Docker Desktop for Macは、macOSのバージョンやMacのチップセット(IntelかAppleシリコンか)によって必要なバージョンや設定が異なります。
現在の最新版(例: 4.x系)の一般的な要件は以下の通りです。(詳細な最新情報は必ずDocker公式ドキュメントを確認してください。)
- macOSのバージョン: 比較的最近のバージョン(例: macOS Monterey 12 以降)。特定のバージョンでしか動作しない場合や、非推奨となる場合があります。
- CPU: 64-bit Intel プロセッサ または Apple Silicon (M1, M2, M3など)
- RAM: 4GB以上のメモリ推奨
- ストレージ: Docker Desktopアプリケーション自体に加えて、イメージやコンテナが使用する領域が必要です。数十GB以上の空き容量を推奨します。
- Virtualization (仮想化) サポート: Macのハードウェアが仮想化技術(Intel VT-x or AMD-V, または Apple SiliconのVirtualization Framework)をサポートしている必要があります。最近のMacであれば通常問題ありません。
特にApple Silicon搭載Mac(M1, M2, M3チップなど)をご利用の場合、Intelチップ搭載Macとは内部的な仕組みが異なりますが、Docker Desktopがその違いを吸収してくれます。ただし、Intelチップ向けにビルドされた古いイメージを使用する場合など、場合によってはパフォーマンスの問題や互換性の問題が発生する可能性もあります(Rosetta 2によるエミュレーションなどで対応されることも多いですが)。
3.2 既存の環境との競合
Docker Desktop for Macは、内部的に仮想マシン技術を利用します。そのため、すでにVirtualBoxやVMware Fusion、Parallels Desktopといった他の仮想化ソフトウェアを使用している場合、競合する可能性があります。特に、これらのソフトウェアがネットワーク設定やカーネル拡張などで類似のリソースを使用している場合に問題が発生することがあります。
通常、Docker Desktopと他のVMソフトウェアを同時に実行することは可能ですが、予期しない問題が発生する可能性もゼロではありません。もし可能であれば、他のVMソフトウェアを終了させてからDocker Desktopをインストール・起動することをおすすめします。
3.3 インストールの前に確認すること
- macOSのアップデート: システム要件を満たす最新のmacOSバージョンにアップデートしておきましょう。
- 十分な空き容量: イメージやコンテナはディスク容量を消費します。特に開発で色々なイメージを試したり、大量のデータをコンテナ内で扱ったりする場合、すぐに数GB〜数十GBを消費することがあります。事前に十分な空き容量を確保しておきましょう。
- インターネット接続: インストーラーのダウンロードや、Dockerイメージの取得にはインターネット接続が必要です。
- 管理者権限: インストールには管理者権限が必要です。
これらの準備が整ったら、いよいよインストールに進みましょう。
4. Docker Desktop for Macのインストール手順
Docker Desktop for Macのインストールは非常に簡単です。公式サイトからインストーラーをダウンロードし、指示に従って実行するだけです。
4.1 公式サイトからのダウンロード
- Webブラウザを開き、Docker公式サイトのDocker Desktop for Macダウンロードページにアクセスします。
https://docs.docker.com/desktop/install/mac-install/ - ページ内のダウンロードボタンを見つけます。「Download for Mac with Intel chip」または「Download for Mac with Apple chip」というボタンがあるはずです。お使いのMacのチップセットに合わせて適切な方をダウンロードしてください。
.dmg
ファイルがダウンロードされます。
4.2 インストーラーの実行
- ダウンロードした
.dmg
ファイルを開きます。 - ディスクイメージがマウントされ、「Docker」というアイコンと「Applications」フォルダへのエイリアスが表示されます。
- 「Docker」アイコンを「Applications」フォルダのエイリアスにドラッグ&ドロップします。これでDocker Desktopアプリケーションがアプリケーションフォルダにコピーされます。
- ディスクイメージをアンマウントします(Finderのサイドバーなどでディスク名の横にある取り出しボタンをクリック)。
4.3 Docker Desktopの初回起動
- 「アプリケーション」フォルダを開き、「Docker」アイコンをダブルクリックしてDocker Desktopを起動します。
- 初回起動時には、セキュリティの確認ダイアログが表示されることがあります。「開く」をクリックして続行します。
- システム拡張機能のインストールや必要な設定のために、macOSのパスワード入力を求められる場合があります。パスワードを入力し、指示に従って進めます。
- 利用規約が表示されます。内容を確認し、「Accept(同意)」をクリックします。
- Docker Desktopが必要なコンポーネントのセットアップを開始します。これには少し時間がかかる場合があります。進行状況が表示されます。
- セットアップが完了すると、簡単なチュートリアルを実行するか尋ねられます。初心者の場合は、このチュートリアルを実行してみるのも良いでしょう。スキップしても問題ありません。
- Docker Desktopアプリケーションのメイン画面が表示されます。画面右上のメニューバーにDockerクジラのアイコンが表示されているはずです。アイコンが緑色になっていれば、Dockerエンジンが正常に起動している状態です。
4.4 インストール後の確認
インストールが成功したかを確認するために、ターミナルを開いて以下のコマンドを実行してみましょう。
-
Dockerのバージョン確認:
bash
docker version
クライアント(Client)とサーバー(Server)のバージョン情報が表示されれば成功です。Serverの情報が表示されるのは、Docker Desktopの内部でDockerエンジン(サーバー)が動いているからです。 -
Docker情報確認:
bash
docker info
Dockerの様々な情報(コンテナ数、イメージ数、ストレージドライバーなど)が表示されます。
これらのコマンドがエラーなく実行できれば、Docker Desktop for Macのインストールは完了です!
5. Docker Desktop for Macの基本的な使い方
Docker Desktop for Macは、GUIアプリケーションとターミナルコマンドの両方から操作できます。最初はターミナルコマンドに慣れることをおすすめします。
5.1 Docker Desktop UIの概要
メニューバーのDockerクジラアイコンをクリックすると、簡単なメニューが表示されます。「Dashboard」を選択すると、Docker DesktopのGUIアプリケーションウィンドウが開きます。
GUI画面では、主に以下の項目を確認・操作できます。
- Containers: 実行中および停止中のコンテナ一覧。コンテナの起動、停止、再起動、削除、ログの確認、シェルの実行などができます。
- Images: ローカルにあるDockerイメージ一覧。イメージのプル、ビルド、削除ができます。どのコンテナがどのイメージを使っているかも確認できます。
- Volumes: ローカルにあるDocker Volume一覧。Volumeの作成、検査、削除ができます。どのコンテナがどのVolumeを使っているかも確認できます。
- Dev Environments: 開発環境用の設定。
- Settings: Docker Desktop全体の設定(リソース割り当て、Kubernetes有効化、Proxy設定など)。
- Troubleshoot: 問題発生時の診断やリセット機能。
初心者の方は、まずはContainersとImagesの画面を中心に触ってみると良いでしょう。ターミナルで実行した操作の結果が、GUI画面に反映されるのを確認するのも理解を深める良い方法です。
5.2 ターミナルでのDockerコマンド
Dockerの操作は、ほとんどの場合ターミナルからコマンドを実行して行います。よく使う基本的なコマンドを見ていきましょう。
コマンドの一般的な形式は docker [サブコマンド] [オプション] [引数]
です。
5.2.1 イメージの操作
-
イメージの取得 (Pull): Registryからイメージをダウンロードします。
bash
docker pull <イメージ名>:<タグ>
# タグを省略すると最新版 (latest) が取得されます
docker pull ubuntu:latest
docker pull nginx -
イメージ一覧表示: ローカルにダウンロード済みのイメージ一覧を表示します。
bash
docker images
# または
docker image ls
REPOSITORY, TAG, IMAGE ID, CREATED, SIZE といった情報が表示されます。 -
イメージの削除: 指定したイメージを削除します。そのイメージから実行中のコンテナがあると削除できません。
bash
docker rmi <イメージ名>:<タグ>
# またはイメージIDでも指定できます
docker rmi <イメージID>
5.2.2 コンテナの操作
コンテナ操作の最も基本的なコマンドは docker run
です。これは 「指定したイメージから新しいコンテナを作成し、実行する」 コマンドです。多くのオプションがあり、非常に重要です。
-
コンテナの実行 (Run): イメージからコンテナを起動します。
bash
docker run [オプション] <イメージ名>:<タグ> [コマンド] [引数...]よく使うオプション:
*-d
: デタッチドモード (Detached mode)。コンテナをバックグラウンドで実行し、ターミナルは解放されます。Webサーバーやデータベースなど、サービスとして継続的に動かしたい場合に利用します。
*-it
: インタラクティブモード (Interactive & TTY)。コンテナの標準入力(stdin)を開放し、仮想端末(tty)を割り当てます。コンテナ内でシェルを実行したり、対話的に操作したい場合に利用します。-it
は-i -t
の省略形です。
*-p <ホストポート>:<コンテナポート>
: ポートフォワーディング (Port Forwarding)。ホストマシンの指定したポート(ホストポート)へのアクセスを、コンテナの指定したポート(コンテナポート)に転送します。Webサーバー(通常コンテナの80番ポートで待機)をホストの8080番ポートで公開したい場合などに使います。
*-v <ホストパスまたはVolume名>:<コンテナパス>
: ボリュームマウント (Volume Mount)。ホストのディレクトリまたはVolumeを、コンテナ内のディレクトリにマウントします。データの永続化やファイル共有に使います。
*--name <コンテナ名>
: コンテナに分かりやすい名前をつけます。指定しない場合はランダムな名前が自動生成されます。
*--rm
: コンテナの停止時に自動的に削除します。一時的にコマンドを実行したい場合などに便利です。
*-e <環境変数名>=<値>
: 環境変数をコンテナ内に設定します。データベースのパスワードなどを渡すのに使います。実行例:
* バックグラウンドでNginxコンテナを起動し、ホストの8080ポートをコンテナの80ポートにマッピングする:
bash
docker run -d -p 8080:80 --name my-nginx nginx
* Alpine Linuxコンテナを起動し、インタラクティブなシェルを実行、終了時にコンテナを削除する:
bash
docker run -it --rm alpine /bin/sh -
実行中のコンテナ一覧表示:
bash
docker ps
CONATINER ID, IMAGE, COMMAND, CREATED, STATUS, PORTS, NAMES といった情報が表示されます。 -
すべてのコンテナ一覧表示 (停止中含む):
bash
docker ps -a -
コンテナの停止: 指定したコンテナを停止します。
bash
docker stop <コンテナIDまたはコンテナ名> -
コンテナの開始: 停止中のコンテナを開始します。
bash
docker start <コンテナIDまたはコンテナ名> -
コンテナの再起動:
bash
docker restart <コンテナIDまたはコンテナ名> -
コンテナの削除: 停止中のコンテナを削除します。実行中のコンテナを削除するには
-f
(force) オプションが必要ですが、非推奨です。
bash
docker rm <コンテナIDまたはコンテナ名>
複数のコンテナをまとめて削除することも可能です。
bash
docker rm <コンテナID1> <コンテナID2> ... -
実行中のコンテナ内でコマンド実行: 実行中のコンテナの内部で別のコマンドを実行したい場合に利用します。デバッグなどに便利です。
bash
docker exec [オプション] <コンテナIDまたはコンテナ名> <コマンド> [引数...]
# 例: 実行中のnginxコンテナ内でシェルを実行する
docker exec -it my-nginx /bin/bash -
コンテナのログ表示: コンテナの標準出力(stdout)と標準エラー出力(stderr)を表示します。
bash
docker logs <コンテナIDまたはコンテナ名>
# リアルタイムでログを追跡する場合
docker logs -f <コンテナIDまたはコンテナ名> -
コンテナの詳細情報表示: コンテナのネットワーク設定、Volume設定、環境変数など、詳細な情報をJSON形式で表示します。
bash
docker inspect <コンテナIDまたはコンテナ名>
これらの基本的なコマンドを組み合わせることで、様々なコンテナ操作が可能になります。
6. 実践!簡単なアプリケーションを動かしてみよう
さて、基本的な概念とコマンドを学んだところで、実際にいくつかのアプリケーションをDockerコンテナで動かしてみましょう。
6.1 例1: Nginx (Webサーバー) を動かす
Webサーバーとしてよく使われるNginxをDockerコンテナで動かしてみましょう。
-
Nginxイメージを取得:
まだローカルにnginx
イメージがない場合、Docker Hubから取得します。
bash
docker pull nginx:latest
Using default tag: latest
と表示され、イメージのダウンロードが開始されます。少し待ちます。 -
Nginxコンテナを実行:
取得したイメージを使って、Nginxコンテナを起動します。ホストの8080ポートをコンテナの80ポートにマッピングし、バックグラウンドで実行します。コンテナ名もつけておきましょう。
bash
docker run -d -p 8080:80 --name my-nginx nginx:latest
コンテナIDが表示されれば成功です。 -
実行中のコンテナを確認:
bash
docker ps
my-nginx
という名前のコンテナがUp ...
というステータスで表示されているはずです。PORTSの欄に0.0.0.0:8080->80/tcp
のように表示されていれば、ポートマッピングも成功しています。 -
ブラウザで確認:
Webブラウザを開き、http://localhost:8080/
にアクセスしてください。「Welcome to nginx!」というデフォルトページが表示されるはずです。 -
コンテナの停止:
必要なくなったらコンテナを停止します。
bash
docker stop my-nginx -
コンテナの削除:
停止したコンテナを削除します。
bash
docker rm my-nginx
docker ps -a
で、コンテナがリストから消えていることを確認してください。
たった数コマンドでWebサーバーを起動・停止・削除できました。これがDockerの力です。ホストマシンにNginxをインストールすることなく、手軽に試すことができました。
6.2 例2: Alpine Linux (軽量Linux) で遊ぶ
非常に軽量なLinuxディストリビューションであるAlpine Linuxのコンテナを起動し、その中でコマンドを実行してみましょう。
-
Alpineイメージを取得:
bash
docker pull alpine:latest -
Alpineコンテナをインタラクティブに実行:
コンテナ内でシェル(/bin/sh
)を実行し、対話的に操作します。終了したら自動的にコンテナが削除されるように--rm
オプションをつけます。
bash
docker run -it --rm alpine:latest /bin/sh
コマンドを実行すると、プロンプトがコンテナ内のシェルのものに変わるはずです(例:#
や$
)。 -
コンテナ内でコマンドを実行:
コンテナ内のシェルで、通常のLinuxコマンドを実行してみましょう。
“`sh
ls /
# /bin, /etc, /home … といったディレクトリが見えるはずですpwd
/ と表示されるはずです(ルートディレクトリにいます)
cat /etc/os-release
Alpine Linuxのバージョン情報などが表示されます
apk update && apk add –no-cache cowsay
パッケージマネージャーを使ってcowsayコマンドをインストールしてみます
cowsay “Hello from Docker!”
牛がメッセージを喋ります
“`
-
コンテナから退出:
コンテナ内のシェルから抜けるには、exit
コマンドを実行します。
sh
exit
ホストマシンのターミナルプロンプトに戻ります。--rm
オプションをつけたので、このコンテナは自動的に削除されています。docker ps -a
で確認してみてください。
この例から、Dockerコンテナが隔離された独立した環境であることが分かります。ホストマシンにはcowsay
コマンドはインストールされていませんが、コンテナ内には簡単にインストールして実行できました。
6.3 例3: Static HTMLファイルを提供するカスタムイメージの作成
ローカルにあるHTMLファイルを提供するだけのシンプルなWebサーバーを、独自のDockerイメージとして作成し、実行してみましょう。
-
プロジェクトディレクトリの作成:
適当な場所に新しいディレクトリを作成し、その中に移動します。
bash
mkdir my-static-site
cd my-static-site -
HTMLファイルの作成:
html
という名前のディレクトリを作成し、その中にindex.html
ファイルを作成します。
bash
mkdir html
html/index.html
を任意のテキストエディタで開き、以下の内容を記述して保存します。
html
<!DOCTYPE html>
<html>
<head>
<title>My Static Site</title>
</head>
<body>
<h1>Welcome to my static website!</h1>
<p>This page is served by Nginx in a Docker container.</p>
</body>
</html> -
Dockerfileの作成:
my-static-site
ディレクトリの直下にDockerfile
という名前のファイルを作成します(拡張子はありません)。
bash
# テキストエディタで開く
# nano Dockerfile
# または code Dockerfile (VS Codeの場合)
Dockerfile
を開き、以下の内容を記述して保存します。
“`dockerfile
# ベースイメージとして公式のnginxイメージを使う
FROM nginx:latestホストの ./html/ ディレクトリの内容を、コンテナ内のNginxのデフォルトドキュメントルートにコピーする
COPY html/ /usr/share/nginx/html/
コンテナ起動時に実行されるコマンド(通常、ベースイメージに定義済みなので必須ではないが多い)
CMD [“nginx”, “-g”, “daemon off;”]
コンテナが公開するポート(ドキュメントとして)
EXPOSE 80
``
COPY命令は、Dockerfileがあるディレクトリ(カレントディレクトリ
.) をコンテキストとして、その中の
html/ディレクトリの内容をイメージ内の
/usr/share/nginx/html/にコピーします。Nginxのデフォルト設定では、このディレクトリの
index.html`が最初に表示されます。 -
イメージのビルド:
Dockerfileを使ってイメージをビルドします。docker build
コマンドを使います。-t
オプションでイメージ名(と必要ならタグ)を指定し、コマンドの最後にDockerfileがあるディレクトリのパスを指定します。通常はカレントディレクトリなので.
を指定します。
bash
docker build -t my-static-website:v1 .
.
を指定することで、現在のディレクトリ(my-static-site
)をビルドコンテキストとしてDockerデーモンに送信します。Dockerデーモンはこのコンテキスト内のファイル(Dockerfileやhtml
ディレクトリなど)にアクセスできます。
ビルドプロセスが実行され、各ステップ(Dockerfileの各行)が実行されます。Successfully built ...
というメッセージと新しいイメージIDが表示されれば成功です。 -
ビルドしたイメージを確認:
bash
docker images
my-static-website
という名前のイメージがリストに追加されているはずです。 -
カスタムイメージからコンテナを実行:
ビルドしたイメージを使ってコンテナを起動します。ホストの8081ポートにマッピングしてみましょう。
bash
docker run -d -p 8081:80 --name my-custom-nginx my-static-website:v1 -
ブラウザで確認:
Webブラウザを開き、http://localhost:8081/
にアクセスしてください。先ほど作成したindex.html
の内容が表示されるはずです。 -
コンテナとイメージのクリーンアップ:
使い終わったらコンテナを停止・削除し、必要であればイメージも削除しましょう。
bash
docker stop my-custom-nginx
docker rm my-custom-nginx
docker rmi my-static-website:v1
この例を通して、自分でDockerfileを書いてイメージをビルドし、カスタムアプリケーションをコンテナとして実行する基本的な流れを学ぶことができました。
7. データ永続化 (Volume) を活用する
コンテナはデフォルトで使い捨てですが、データベースのデータやログファイルなど、永続化する必要があるデータもあります。また、開発中のコードをコンテナと共有したい場合もあります。こうした目的にVolumeが使われます。
7.1 Volumeの重要性
コンテナ内のファイルシステムは、そのコンテナ専用の書き込み可能なレイヤー(Container Layer)に保存されます。このレイヤーはコンテナが削除されると一緒に失われます。したがって、重要なデータはこのレイヤーに保存すべきではありません。
Volumeを使うことで、データをコンテナのライフサイクルから分離し、ホストマシン上やDockerが管理する専用の領域に保存できます。これにより、コンテナを停止・削除してもデータは保持され、後で新しいコンテナから同じVolumeをマウントしてデータにアクセスすることが可能になります。
7.2 Volumeの種類
前述の通り、主に「名前付きVolume」と「バインドマウント」があります。
-
名前付きVolume (Named Volumes):
- Dockerがホストマシン上の管理された領域(通常は
/var/lib/docker/volumes
以下、ただしDocker Desktopでは内部VM内)にデータを作成・管理します。 docker volume create <Volume名>
で作成し、docker run -v <Volume名>:<コンテナパス>
でマウントします。- Volumeの名前で参照するため、コンテナのIDやホストのパスを意識する必要がありません。
- データベースのデータなど、コンテナがその内部構造を管理するような用途に適しています。Dockerが内部で最適化を行うため、パフォーマンスや信頼性の面で推奨されることが多いです。
- Dockerがホストマシン上の管理された領域(通常は
-
バインドマウント (Bind Mounts):
- ホストマシンの任意のディレクトリやファイルを、そのままコンテナ内のパスにマッピングします。
docker run -v <ホストパス>:<コンテナパス>
でマウントします。- ホスト側のパスを直接指定するため、ホスト側のファイルシステム構造を意識する必要があります。
- 開発中のソースコードをコンテナにマウントし、コードを編集したらコンテナ内で即座に変更が反映されるようにする、といった用途に非常に便利です。設定ファイルを共有する用途にも使われます。
7.3 名前付きVolumeの使い方(実例: MySQLコンテナ)
データベースであるMySQLのデータを永続化する例を見てみましょう。MySQLコンテナは、デフォルトで/var/lib/mysql
ディレクトリにデータベースファイルを保存します。ここにVolumeをマウントすることで、コンテナを削除してもデータが失われないようにします。
-
MySQLイメージを取得:
bash
docker pull mysql:latest -
Volumeを作成:
MySQLデータ用の名前付きVolumeを作成します。
bash
docker volume create mysql-data
作成したVolumeを確認するにはdocker volume ls
コマンドを使います。
bash
docker volume ls
mysql-data
という名前のVolumeが表示されるはずです。 -
MySQLコンテナを実行し、Volumeをマウント:
Volumeを/var/lib/mysql
にマウントしてMySQLコンテナを起動します。MySQLイメージは起動時にMYSQL_ROOT_PASSWORD
環境変数を要求するので、-e
オプションで設定します。
bash
docker run -d \
-p 3306:3306 \
-v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=mysecretpassword \
--name my-mysql \
mysql:latest
オプションの意味:-d
: バックグラウンド実行-p 3306:3306
: ホストの3306ポートをコンテナの3306ポートにマッピング(MySQLのデフォルトポート)-v mysql-data:/var/lib/mysql
:mysql-data
という名前付きVolumeをコンテナ内の/var/lib/mysql
にマウント-e MYSQL_ROOT_PASSWORD=mysecretpassword
: MySQLのrootユーザーのパスワードを設定--name my-mysql
: コンテナ名をmy-mysql
に設定
-
コンテナの起動を確認:
bash
docker ps
my-mysql
コンテナがUp ...
ステータスで表示されていることを確認します。起動まで少し時間がかかる場合があります。 -
MySQLに接続してデータを作成(例):
ホストマシンからMySQLクライアントを使って、起動したMySQLコンテナに接続してみましょう。(MySQLクライアントがインストールされている必要があります。)
bash
mysql -h 127.0.0.1 -P 3306 -u root -pmysecretpassword
接続できたら、テスト用のデータベースを作成してみます。
sql
CREATE DATABASE test_db;
USE test_db;
CREATE TABLE messages (id INT AUTO_INCREMENT PRIMARY KEY, text VARCHAR(255));
INSERT INTO messages (text) VALUES ('Hello Docker Volume!');
SELECT * FROM messages;
EXIT; -
コンテナを停止・削除:
コンテナを停止し、削除します。
bash
docker stop my-mysql
docker rm my-mysql
コンテナは削除されましたが、mysql-data
Volumeは残っています。docker volume ls
で確認できます。 -
新しいMySQLコンテナを同じVolumeで起動:
全く新しいコンテナを、先ほどと同じmysql-data
Volumeをマウントして起動します。
bash
docker run -d \
-p 3307:3306 \ # ポートを変えてみましょう (ホスト側のポートを8081にするなど任意)
-v mysql-data:/var/lib/mysql \ # 同じVolume名をマウント
-e MYSQL_ROOT_PASSWORD=mysecretpassword \
--name my-mysql-new \ # コンテナ名も変えましょう
mysql:latest -
新しいコンテナでデータを確認:
新しいコンテナに接続し、以前作成したデータが存在するか確認します。
bash
mysql -h 127.0.0.1 -P 3307 -u root -pmysecretpassword # マッピングしたポートに注意
sql
USE test_db;
SELECT * FROM messages;
EXIT;
先ほど追加したHello Docker Volume!
というメッセージが表示されるはずです。これで、データがVolumeに永続化されていることが確認できました。 -
Volumeの削除(不要になったら):
Volumeも不要になったら削除できます。Volumeが使用中のコンテナがある場合は削除できません。
bash
docker volume rm mysql-data
7.4 バインドマウントの使い方(実例: 開発中のWebサイト)
開発中のソースコードをコンテナにマウントする例を見てみましょう。
-
開発用ディレクトリを作成:
プロジェクト用のディレクトリを作成し、その中にNginxで配信したいHTMLファイルを作成します。
bash
mkdir my-dev-site
cd my-dev-site
index.html
ファイルを作成し、好きな内容を記述します。
html
<!DOCTYPE html>
<html>
<head>
<title>Developing with Docker</title>
</head>
<body>
<h1>This is my development site!</h1>
<p>Try changing this text and refreshing the browser.</p>
</body>
</html> -
Nginxコンテナをバインドマウント付きで実行:
ホストのmy-dev-site
ディレクトリ(カレントディレクトリ.
)を、コンテナ内のNginxのドキュメントルート/usr/share/nginx/html
にバインドマウントしてNginxコンテナを起動します。
bash
docker run -d \
-p 8082:80 \
-v "$(pwd)":/usr/share/nginx/html \ # バインドマウント
--name my-dev-nginx \
nginx:latest"$(pwd)"
は、現在のディレクトリの絶対パスを取得するMac/Linuxのシェルコマンドです。WindowsのPowerShellなどでは"${PWD}"
、WindowsのCommand Promptでは"%cd%"
など、環境によって異なります。Macの場合はこれでOKです。- ホストのパスをコンテナの
/usr/share/nginx/html
にマウントしています。
-
ブラウザで確認:
http://localhost:8082/
にアクセスしてください。作成したindex.html
の内容が表示されます。 -
ホスト側のファイルを編集:
my-dev-site/index.html
ファイルをエディタで開いて、内容を少し変更して保存してください。
html
<!DOCTYPE html>
<html>
<head>
<title>Developing with Docker</title>
</head>
<body>
<h1>This is my development site! (Updated!)</h1>
<p>The changes are reflected instantly in the container.</p>
</body>
</html> -
ブラウザをリロード:
ブラウザをリロードすると、コンテナを再起動することなく、変更した内容がすぐに反映されていることが確認できます。これは、コンテナがホストのファイルを直接読み込んでいるためです。 -
コンテナのクリーンアップ:
使い終わったらコンテナを停止・削除しましょう。バインドマウントはVolumeではないので、削除コマンドはありません(ホスト側のディレクトリを削除するだけです)。
bash
docker stop my-dev-nginx
docker rm my-dev-nginx
このように、バインドマウントは開発中のファイルをリアルタイムにコンテナと共有したい場合に非常に強力です。
8. 複数のコンテナを連携させる (Docker Compose)
実際のアプリケーションは、Webサーバーだけでなく、アプリケーションサーバー、データベース、キャッシュサーバーなど、複数のサービス(コンテナ)から構成されることがよくあります。これらの複数のコンテナを個別にdocker run
コマンドで管理するのは煩雑です。
そこで登場するのがDocker Composeです。Docker Composeは、複数のコンテナ化されたアプリケーションを定義・実行するためのツールです。YAMLファイル(docker-compose.yml
という名前が一般的)に、アプリケーションを構成するサービス(コンテナ)、ネットワーク、ボリュームなどをまとめて定義し、docker compose up
という単一のコマンドでそれらを一括して起動・管理できます。
Docker Desktop for MacにはDocker Composeが同梱されています。
8.1 なぜDocker Composeが必要か?
- 定義のコード化: アプリケーション全体の構成(どのイメージを使うか、ポート設定、ボリューム設定、環境変数など)をYAMLファイルとして記述できます。これにより、環境設定をコードとして管理でき、チームメンバー間での共有やバージョン管理が容易になります。
- 一括管理: 定義ファイルに基づいて、複数のサービスをまとめて起動、停止、再起動、削除できます。
- 依存関係の解決: サービス間の依存関係(例: アプリケーションサーバーはデータベースが起動してから起動する)を定義できます。
- ネットワークの自動設定: デフォルトでユーザー定義のネットワークが作成され、同じComposeプロジェクト内のサービスはサービス名で互いに通信できるようになります。
8.2 docker-compose.yml
ファイルの書き方
docker-compose.yml
ファイルは、YAML形式で記述されます。基本的な構成は以下のようになります。
“`yaml
version: ‘3.8’ # Composeファイルのバージョン。利用できる機能が異なる。
services: # アプリケーションを構成する個々のサービス(コンテナ)を定義
web: # サービス名(任意)。後でコンテナ名やネットワークエイリアスに使われる
image: nginx:latest # 使用するDockerイメージ
ports: # ポートマッピング。ホスト:コンテナ の形式
– “80:80”
volumes: # ボリュームマウント。ホストパスまたはVolume名:コンテナパス
– ./html:/usr/share/nginx/html
depends_on: # 依存関係。ここに指定されたサービスが起動してからこのサービスが起動する
– app # 例えばwebサーバーはappサーバーに依存するなど
app:
build: . # Dockerfileを使ってイメージをビルドする場合。Dockerfileがあるディレクトリを指定
# image: my-custom-app:latest # 既にビルド済みのイメージを使う場合
ports:
– “5000:5000”
volumes:
– .:/app # ホストのコードをコンテナにマウント(開発時など)
environment: # コンテナに渡す環境変数
DATABASE_URL: postgres://user:password@db:5432/mydatabase
depends_on:
– db
db:
image: postgres:13 # データベースイメージ
volumes:
– db_data:/var/lib/postgresql/data # データベースデータ用の名前付きVolume
environment: # データベースの認証情報など
POSTGRES_DB: mydatabase
POSTGRES_USER: user
POSTGRES_PASSWORD: password
ports: # DBに直接アクセスしたい場合(開発時など)
– “5432:5432”
volumes: # 名前付きVolumeを定義。ここで定義したVolumeはdocker volumeコマンドでも管理できる
db_data:
networks: # ネットワークをカスタマイズする場合に定義。定義しない場合はデフォルトのbridgeネットワークが作成される
app_net:
driver: bridge
“`
8.3 簡単な例: Flask Webアプリ + Redisキャッシュ
PythonのFlaskフレームワークを使ったシンプルなWebアプリケーションと、キャッシュサーバーとしてRedisを使う例を見てみましょう。
-
プロジェクトディレクトリを作成:
bash
mkdir flask-redis-app
cd flask-redis-app -
Flaskアプリケーションのコード:
app.py
ファイルを作成します。
“`python
from flask import Flask
from redis import Redisapp = Flask(name)
redis = Redis(host=’redis’, port=6379) # ホスト名はサービス名と同じ ‘redis’@app.route(‘/’)
def hello():
count = redis.incr(‘hits’) # Redisのカウンターをインクリメント
return f’Hello! This page has been viewed {count} times.’if name == ‘main‘:
app.run(host=’0.0.0.0’, debug=True) # 0.0.0.0でリッスンしないと外部からアクセスできない
``
hits`というカウンターをインクリメントしてその値を表示するだけの簡単なものです。
このコードは、Redisコンテナに接続し、 -
Pythonの依存関係ファイル:
requirements.txt
ファイルを作成します。
txt
flask
redis -
Flaskアプリケーション用のDockerfile:
Flaskアプリケーションを実行するためのイメージをビルドするためのDockerfileを作成します。
“`dockerfile
# Pythonの公式イメージをベースにする
FROM python:3.9-slim作業ディレクトリを設定
WORKDIR /app
依存関係ファイルをコピーし、インストール
COPY requirements.txt .
RUN pip install –no-cache-dir -r requirements.txtアプリケーションコードをコピー
COPY app.py .
5000番ポートを公開する(ドキュメントとして)
EXPOSE 5000
コンテナ起動時に実行されるコマンド
CMD [“python”, “app.py”]
“` -
Docker Composeファイル:
docker-compose.yml
ファイルを作成します。
“`yaml
version: ‘3.8’services:
web: # Flaskアプリケーションサービス
build: . # このディレクトリのDockerfileを使ってイメージをビルド
ports:
– “5000:5000” # ホストの5000ポートをコンテナの5000ポートにマッピング
volumes:
– .:/app # 開発中にコードを編集したら即座に反映されるようにバインドマウント
depends_on:
– redis # redisサービスが起動してからwebサービスを起動するredis: # Redisキャッシュサービス
image: redis:latest # 公式のredisイメージを使用
ports:
– “6379:6379” # 開発中にRedisクライアントから直接接続したい場合などにマッピング
volumes:
– redis_data:/data # Redisのデータを永続化するための名前付きVolume
volumes: # 名前付きVolumeの定義
redis_data:
“`
-
Docker Composeを使ってアプリケーションを起動:
docker-compose.yml
ファイルがあるディレクトリで以下のコマンドを実行します。
bash
docker compose up # -d オプションをつけるとバックグラウンド実行
(Docker Compose v1を使っている場合はdocker-compose up
とハイフンで繋がりますが、v2からはスペース区切りdocker compose
が推奨です。Docker Desktopに同梱されているのはv2です。)
このコマンドを実行すると、以下のことが自動で行われます。web
サービスのために、指定されたDockerfile(.
ディレクトリ内)を使ってイメージがビルドされます。redis
イメージがDocker Hubからプル(ダウンロード)されます(まだローカルにない場合)。redis_data
という名前付きVolumeが作成されます(まだ存在しない場合)。redis
サービス(コンテナ)が起動し、redis_data
Volumeがマウントされます。web
サービス(コンテナ)が起動し、カレントディレクトリが/app
にバインドマウントされ、ホストの5000ポートがコンテナの5000ポートにマッピングされ、redis
コンテナと同じネットワークに接続されます(サービス名redis
で名前解決できるようになります)。
-
アプリケーションを確認:
Webブラウザを開き、http://localhost:5000/
にアクセスしてください。「Hello! This page has been viewed 1 times.」と表示されるはずです。ページをリロードするたびに、カウンターが増えていくのが確認できます。これは、FlaskアプリケーションがRedisコンテナと正常に通信できていることを示しています。 -
実行中のサービスを確認:
別のターミナルを開き、Composeファイルがあるディレクトリで以下のコマンドを実行します。
bash
docker compose ps
web
とredis
という名前のコンテナが実行中であることが確認できます。 -
アプリケーションの停止とクリーンアップ:
アプリケーションを停止するには、docker compose up
を実行しているターミナルでCtrl+C
を押します。バックグラウンド実行 (-d
) している場合は、以下のコマンドを実行します。
bash
docker compose down
このコマンドは、docker-compose.yml
ファイルで定義されているすべてのサービス(コンテナ)を停止・削除します。デフォルトではVolumeは削除されません。Volumeも削除したい場合は-v
オプションをつけます。
bash
docker compose down -v
Docker Composeを使うことで、複雑なマルチコンテナアプリケーションの構築と管理が劇的に簡単になることが理解できたかと思います。
9. Docker Desktop for Macの便利な機能
Docker Desktop for Macには、基本的なDocker機能以外にも便利な機能がいくつか備わっています。
9.1 リソース設定の調整
Docker Desktopの内部で実行されるLinux VMに割り当てるCPU、メモリ、ディスク容量などを調整できます。特にメモリやディスク容量は、多数のコンテナを動かしたり大きなイメージを扱ったりする場合に重要です。
Docker Desktop UIのSettings (歯車アイコン) > Resources から設定できます。Macのリソースに余裕があれば、デフォルトよりも多めに割り当てることでパフォーマンスが向上する場合があります。ただし、割り当てすぎるとMac全体の動作が遅くなるので注意が必要です。
9.2 Kubernetesの有効化(簡単な紹介)
Docker Desktop for Macには、Kubernetesクラスターをローカルで起動する機能が搭載されています。Kubernetesは、多数のコンテナを大規模に管理・自動化するための強力なオーケストレーションツールです。
Settings > Kubernetes から「Enable Kubernetes」にチェックを入れることで有効化できます。有効化すると、Docker Desktop内で単一ノードのKubernetesクラスターが起動し、kubectl
コマンドを使って操作できるようになります。プロダクションレベルのKubernetesとは異なりますが、ローカルでの開発や学習には非常に便利です。
初心者の段階では必須ではありませんが、Dockerに慣れてきたら次のステップとして触ってみる価値はあります。
9.3 Docker Hub連携
Docker Desktop UIの右上からDocker Hubアカウントにサインインできます。サインインしておくと、ローカルでビルドしたイメージをDocker Hubにプッシュ(アップロード)したり、プライベートなイメージをプル(ダウンロード)したりする際に便利です。
9.4 トラブルシューティング
問題が発生した場合、Settings > Troubleshoot から以下の機能を利用できます。
- Diagnose & Feedback: Docker Desktopの状態を診断し、レポートを生成してDockerチームにフィードバックを送信できます。問題解決の手がかりになる情報が含まれています。
- Reset: Docker Desktopの状態をリセットできます。軽微な問題であればこれで解決することがあります。ただし、「Reset to factory defaults」は、ダウンロード済みのイメージ、実行中のコンテナ、Volumeなどがすべて削除されてしまう強力なリセットなので、実行する際は注意が必要です。
10. よくある疑問とトラブルシューティング
Docker Desktop for Macを使い始める上で、よくある疑問や問題について解説します。
10.1 コンテナが起動しない、またはすぐに停止する
- 原因:
- 指定したイメージが存在しない。
- コンテナ内で実行しようとしたコマンドがエラーで終了した。
- Dockerfileに問題がある(カスタムイメージの場合)。
- 必要な環境変数や設定が不足している。
- ポートがすでに使用されている。
- 解決策:
docker ps -a
で停止したコンテナを確認し、そのコンテナIDを使ってdocker logs <コンテナID>
を実行し、ログを確認してください。エラーメッセージから原因が特定できることが多いです。- インタラクティブモード (
-it
) で起動してみて、手動でコマンドを実行してみる。 docker inspect <コンテナID>
でコンテナの詳細設定を確認する。
10.2 ポートの競合
docker run -p <ホストポート>:<コンテナポート>
で指定したホストポートが、すでにMac上の別のアプリケーションや他のDockerコンテナによって使用されている場合、コンテナの起動に失敗します。
- 原因: 指定したホストポートが既に使用中。
- 解決策:
- 使用しようとしているホストポート番号を変更します(例: 8080の代わりに8081を使うなど)。
- ポートが何に使われているか調べる(Macの場合、
lsof -i :<ポート番号>
コマンドなどが使えます)。 docker ps
で実行中の他のDockerコンテナが同じポートを使用していないか確認します。
10.3 ディスク容量の問題
Dockerイメージやコンテナは、特に開発を進めるとすぐにディスク容量を消費します。使わなくなったイメージやコンテナが溜まっている可能性があります。
- 原因: 不要なイメージ、コンテナ、Volumeなどが溜まっている。
- 解決策:
docker images
で不要なイメージを確認し、docker rmi <イメージID>
で削除します。docker ps -a
で不要なコンテナを確認し、docker rm <コンテナID>
で削除します。docker volume ls
で不要なVolumeを確認し、docker volume rm <Volume名>
で削除します。- 一括クリーンアップ: 使われていないイメージ、コンテナ、ネットワーク、Volumeなどをまとめて削除するには、以下のコマンドが便利です。
bash
docker system prune
# すべての停止中のコンテナ、使われていないネットワーク、孤立したイメージ、ビルドキャッシュを削除
# Volumeも削除したい場合は -a または --volumes オプションを追加します(注意して実行してください)
docker system prune -a --volumes - Docker Desktop UIのTroubleshoot > Clean / Purge data からも同様の操作ができます。
- Settings > Resources > Disk Image size でDockerが使用できる最大ディスク容量を調整できます。
10.4 M1/M2などApple Silicon Macでの注意点
Apple Silicon MacはARMアーキテクチャですが、多くのDockerイメージはIntel(AMD64)アーキテクチャ向けにビルドされています。Docker DesktopはRosetta 2の支援を受けてIntelイメージを動作させることができますが、パフォーマンスが低下したり、一部互換性の問題が発生したりする可能性があります。
- 解決策:
- 可能であれば、ARM64アーキテクチャ(
arm64v8
やlinux/arm64
などとタグ付けされていることが多い)に対応したイメージを探して利用します。公式イメージの多くはマルチアーキテクチャに対応しています。 - 自分でイメージをビルドする場合は、Dockerfile内で使用するベースイメージやインストールするパッケージがARM64に対応しているか確認します。
docker buildx
コマンドを使うと、異なるアーキテクチャ向けのイメージをビルドすることも可能です(やや高度なトピックです)。
- 可能であれば、ARM64アーキテクチャ(
10.5 権限の問題
Dockerコマンドを実行する際に権限エラーが発生する場合、Dockerデーモンとの通信に問題があるか、内部的なVMのファイル権限に問題がある可能性があります。
- 解決策:
- MacのユーザーがDockerを使用する権限を持っているか確認します(Docker Desktopのインストール時に設定されます)。
- Docker Desktopアプリケーションを再起動します。
- Mac自体を再起動します。
- Docker Desktop UIのTroubleshootから「Reset to factory defaults」以外のリセットオプションを試します。
- Docker Desktopを一度アンインストールし、再インストールします。
これらのトラブルシューティングの手順は、問題解決の糸口となるはずです。どうしても解決しない場合は、Dockerの公式ドキュメントやコミュニティフォーラムで同じような問題を検索してみるのも有効です。
11. 次のステップへ
この記事で、あなたはDockerの基本的な概念、Docker Desktop for Macのインストールと基本的な使い方、簡単なアプリケーションの実行、データ永続化、そしてDocker Composeによる複数コンテナ管理までを学びました。これはDocker活用のための強固な基盤となります。
しかし、Dockerの世界はこれだけにとどまりません。さらに学習を進めることで、より高度な利用方法や、大規模な開発・運用への応用が可能になります。
次に学ぶべきことのいくつかを紹介します。
- Dockerfileの深掘り: Dockerfileの各命令(RUN, CMD, ENTRYPOINT, WORKDIR, ENVなど)についてより詳しく学び、効率的で安全なイメージを作成するためのベストプラクティスを習得します。マルチステージビルドなど、より高度なテクニックも存在します。
- Docker Hubでのイメージ公開: 自分で作成したカスタムイメージをDocker Hubにプッシュし、他の人と共有したり、別の環境から簡単にプルして利用したりする方法を学びます。
- Docker Networkingの詳細: ユーザー定義ネットワークの作成方法や、コンテナ間のより高度な通信制御について学びます。
- Docker Composeの応用: より複雑なアプリケーション構成をDocker Composeで記述する方法や、開発環境と本番環境でComposeファイルを使い分ける方法などを学びます。
- コンテナオーケストレーション: 単一のホストだけでなく、複数のサーバーにまたがって大量のコンテナを管理・スケーリングするための技術であるDocker SwarmやKubernetesについて学びます。これらのツールは、本番環境でのコンテナ運用において非常に重要です。
- CI/CDパイプラインへの組み込み: DockerをContinuous Integration (CI) や Continuous Deployment (CD) のワークフローに組み込み、自動ビルド、自動テスト、自動デプロイを実現する方法を学びます。
- セキュリティ: Dockerコンテナのセキュリティに関する考慮事項(rootlessモード、イメージの脆弱性スキャンなど)について学びます。
これらのトピックを学ぶことで、あなたはDockerを単なる開発ツールとしてだけでなく、アプリケーションのビルド、テスト、デプロイ、運用の全体にわたる強力なプラットフォームとして活用できるようになるでしょう。
12. まとめ
この記事では、MacユーザーがDocker Desktop for Macを使ってDockerの世界へ踏み出すための第一歩を、丁寧かつ詳細に解説しました。
Dockerとは何か、なぜコンテナが便利なのかという基本的な概念から始まり、Docker Desktop for Macのインストール、そしてターミナルやGUIを使った基本的な操作方法を学びました。さらに、簡単なWebサーバーやカスタムアプリケーションをコンテナとして動かす実践例、データの永続化に必要なVolumeの使い方、そして複数のコンテナを効率的に管理するDocker Composeの基本についても触れました。最後に、Docker Desktopの便利な機能や、初心者の方がつまずきやすいポイントとその解決策、そしてDocker学習の次のステップについてもご紹介しました。
Dockerは、アプリケーションの開発、配布、実行の方法を大きく変える可能性を秘めた強力な技術です。環境構築の煩雑さから解放され、開発効率を向上させ、アプリケーションのポータビリティを高めることができます。Macユーザーにとって、Docker Desktop for Macはその力を最大限に引き出すための最適なツールです。
この記事が、あなたがDockerの世界への第一歩を踏み出し、その恩恵を受けるための一助となれば幸いです。最初は難しく感じる部分もあるかもしれませんが、焦らず、少しずつ、実際に手を動かしながら学ぶことが大切です。
Dockerの旅はまだ始まったばかりです。この新しいツールを使いこなし、あなたの開発や学習をさらに豊かなものにしてください。応援しています!