富 Web 時代において、アプリケーションはますます強力になる一方で、複雑さも増しています。クラスター展開、隔離環境、カナリアリリース、動的スケーリングはどれも欠かせず、コンテナ化はその中間に必要な架け橋となっています。
このセクションでは、Docker の神秘的な世界を探検し、ゼロから Docker の基本原理と実践的な操作を習得します。フロントエンドだけに閉じこもらず、領域を拡大する時です。
以下のポイントに沿って進めます:
- ひとつの物語
- 仮想マシンとコンテナ
- Docker を知る
- コアコンセプト
- Docker のインストール
- クイックスタート
- 一般的な操作
- ベストプラクティス
一、ひとつの物語
Docker とは何かをよりよく理解するために、まず物語を紹介します。
家を建てる必要があり、石を運び、木を切り、図面を描き、家を建てました。一連の作業を終え、ようやく家が完成しました。

ところが、しばらく住んだ後、急に海辺に引っ越したくなりました。従来の方法では、海辺に行って、再び石を運び、木を切り、図面を描き、家を建てるしかありません。

困っていると、魔法使いが現れて魔法を教えてくれました。この魔法を使うと、完成した家をコピーして「イメージ」にし、リュックに入れて持ち運べます。

海辺に着いたら、この「イメージ」を使って家を複製し、すぐに入居できます。
不思議でしょう?これをプロジェクトに当てはめると、家がプロジェクト本体、イメージがプロジェクトのコピー、リュックがイメージレジストリです。動的スケーリングが必要な場合、レジストリからプロジェクトイメージを取り出して、好きなだけ複製できます。Build once,Run anywhere!
バージョンや互換性、デプロイの問題を気にする必要はもうありません。「リリース即クラッシュ、終わりのないビルド」という厄介な状況を完全に解決します。
二、仮想マシンとコンテナ
始める前に、いくつかの基礎知識を準備しておきます。
- 仮想マシン:ハードウェアの仮想化
仮想マシン(Virtual Machine)とは、ソフトウェアによってシミュレートされた完全なハードウェアシステム機能を持ち、完全に隔離された環境で動作する完全なコンピュータシステムを指します。物理コンピュータでできることは、仮想マシンでも実現できます。
コンピュータに仮想マシンを作成する際、物理マシンの一部のハードディスクとメモリ容量を仮想マシンのハードディスクとメモリ容量として割り当てます。各仮想マシンには独立したCMOS、ハードディスク、オペレーティングシステムがあり、物理マシンと同じように操作できます。コンテナ技術が登場する前、業界の人気者は仮想マシンでした。
仮想マシン技術の代表は VMWare と OpenStack です。詳細は百科事典 仮想マシンを参照してください。
コンテナ:オペレーティングシステム層を仮想化し、標準化されたソフトウェアユニット
- どこでも実行可能:コンテナはコード、設定ファイル、関連する依存ライブラリをパッケージ化するため、どの環境でも一貫した実行が保証されます。
- 高いリソース利用率:コンテナはプロセスレベルの隔離を提供するため、CPUやメモリの使用率をより細かく設定でき、サーバーの計算リソースをより有効活用できます。
- 迅速な拡張:各コンテナは個別のプロセスとして実行でき、基盤となるオペレーティングシステムのシステムリソースを共有できるため、コンテナの起動と停止の効率が向上します。
相違点と関連性
- 仮想マシンは多くの「サブコンピュータ」を隔離できますが、占有スペースが大きく、起動が遅くなります。仮想マシンソフトウェアは有料の場合もあります(例:
VMWare)。 - コンテナ技術はオペレーティングシステム全体を仮想化する必要はなく、「サンドボックス」のように小さな環境を仮想化するだけです。
- 実行スペース:仮想マシンは通常数GBから数十GBのスペースを必要としますが、コンテナはMBレベル、場合によってはKBレベルで済みます。
- 仮想マシンは多くの「サブコンピュータ」を隔離できますが、占有スペースが大きく、起動が遅くなります。仮想マシンソフトウェアは有料の場合もあります(例:
比較データを見てみましょう。
| 特性 | 仮想マシン | コンテナ |
|---|---|---|
| 隔離レベル | オペレーティングシステムレベル | プロセス |
| 隔離戦略 | Hypervisor(ハイパーバイザー) | Cgroups(コントロールグループ) |
| システムリソース | 5 ~ 15% | 0 ~ 5% |
| 起動時間 | 分単位 | 秒単位 |
| イメージストレージ | GB - TB | KB - MB |
| クラスター規模 | 数百 | 数万 |
| 高可用性戦略 | バックアップ、災害復旧、移行 | 弾力性、負荷分散、動的 |
仮想マシンと比較して、コンテナはより軽量で高速です。Linux の基盤となるオペレーティングシステムを隔離環境で利用しているからです。仮想マシンの Hypervisor は非常に強固な境界を作り出し、アプリケーションがそれを突破するのを防ぎますが、コンテナの境界はそれほど強力ではありません。
物理マシンへのデプロイではリソースを十分に活用できず、リソースの無駄が生じます。仮想マシン方式のデプロイでは、仮想マシン自体が大量のリソースを消費し、リソースの無駄とパフォーマンスの低下を招きます。一方、コンテナ化によるデプロイは柔軟で軽量であり、パフォーマンスも良好です。
仮想マシンは仮想化技術であり、Docker のようなコンテナ技術は軽量な仮想化に該当します。
三、Docker を知る

- 概念
Docker はオープンソースのアプリケーションコンテナエンジンであり、開発者がアプリケーションとその依存パッケージをポータブルなコンテナにパッケージ化し、任意の Linux マシンに公開して実行できるようにします。また、仮想化も実現します。コンテナは完全にサンドボックスメカニズムを使用し、相互に一切のインターフェースを持ちません。
Docker 技術の三大コアコンセプトは、イメージ Image、コンテナ Container、リポジトリ Repository です。
- Docker が軽量な理由は?
疑問に思うかもしれません。なぜ Docker は起動が速いのか?どうやってホストOSとカーネルを共有するのか?
Docker にコンテナの実行を要求すると、Docker はコンピュータ上にリソース隔離環境をセットアップします。次に、パッケージ化されたアプリケーションと関連ファイルを Namespace 内のファイルシステムにコピーし、環境の設定が完了します。その後、Docker は事前に指定したコマンドを実行してアプリケーションを起動します。
イメージには動的データは含まれず、構築後は内容が変更されることはありません。
四、コアコンセプト
Build, Ship and Run(ビルド、輸送、実行)Build once, Run anywhere(一度ビルドすれば、どこでも実行可能)Docker自体はコンテナではなく、コンテナを作成するツールであり、アプリケーションコンテナエンジンです。Dockerの三大コアコンセプト:イメージImage、コンテナContainer、リポジトリRepository。Docker技術はLinuxカーネルとその機能(例:Cgroupsやnamespaces)を利用してプロセスを分離し、各プロセスが互いに独立して動作できるようにします。NamespaceとCgroupsの機能はLinuxでのみ利用可能なため、コンテナを他のオペレーティングシステム上で実行することはできません。では、DockerはmacOSやWindows上でどのように動作するのでしょうか?Dockerはトリックを使用して、非LinuxOS 上にLinux仮想マシンをインストールし、その仮想マシン内でコンテナを実行します。- イメージは実行可能なパッケージであり、アプリケーションの実行に必要なコード、ランタイム、ライブラリ、環境変数、設定ファイルを含みます。コンテナはイメージの
実行時インスタンスです。
Docker の原理について詳しくは、Docker の動作原理とコンテナ化の簡易ガイド を参照してください。ここでは割愛します。
五、Docker のインストール
- コマンドラインインストール
Homebrew の Cask はすでに Docker for Mac をサポートしているため、Homebrew Cask を使って簡単にインストールできます。次のコマンドを実行します。
brew cask install docker
その他のインストール方法については、公式ドキュメントを参照してください:Docker のインストール
- バージョン確認
docker -v
- イメージ加速の設定
Docker Engine の設定に以下を記述します。
{
"registry-mirrors": [
"http://hub-mirror.c.163.com/",
"https://registry.docker-cn.com"
],
"insecure-registries": [],
"experimental": false,
"debug": true
}
- デスクトップ版のインストール

デスクトップ版は非常に簡単に操作できます。まず公式サイトからダウンロードしてください。Docker デスクトップ版を使うと、以下の操作が便利に行えます。
- clone:プロジェクトのクローン
- build:イメージのビルド
- run:インスタンスの実行
- share:イメージの共有
準備は整いました。さあ、腕を振るいましょう!
六、クイックスタート
Docker をインストールしたら、実際のプロジェクトのイメージを作成しながら学んでいきましょう。
- まず、これから使用する 11 個のコマンドを大まかに把握します。
| コマンド | 説明 |
|---|---|
| FROM | どのイメージをベースにするか |
| MAINTAINER | イメージ作成者 |
| ENV | 環境変数の宣言 |
| RUN | コマンドの実行 |
| ADD | ホストのファイルをコンテナに追加。圧縮ファイルは自動解凍 |
| COPY | ホストのファイルをコンテナに追加 |
| WORKDIR | 作業ディレクトリ |
| EXPOSE | コンテナ内のアプリが使用可能なポート |
| CMD | コンテナ起動後に実行するプログラム。docker run の後に起動コマンドを指定すると上書きされる |
| ENTRYPOINT | CMD と同機能だが、docker run では上書きされない。上書きする場合は --entrypoint オプションを使用 |
| VOLUME | データボリューム。ホストのディレクトリをコンテナのディレクトリにマッピング |
- 新しいプロジェクト
手早く進めるため、Vue CLI を使用してプロジェクトを作成します。
vue create docker-demo
起動を試してみます。
yarn serve
アクセス先:http://localhost:8080/。プロジェクトの準備ができました。次にプロジェクトをビルドします。
yarn build
これで、プロジェクトディレクトリの dist がデプロイする静的リソースになりました。次のステップに進みます。
注意:フロントエンドプロジェクトは通常、Nginx で静的デプロイするものと、Node サービスを起動するものの2種類に分類されます。このセクションでは前者のみを扱います。Node サービスについては、後述で詳しく説明します。
- Dockerfile の作成
cd docker-demo && touch Dockerfile
この時点のプロジェクトディレクトリは以下のようになります。
.
├── Dockerfile
├── README.md
├── babel.config.js
├── dist
├── node_modules
├── package.json
├── public
├── src
└── yarn.lock
docker-demo ディレクトリに Dockerfile が作成されました。
- Nginx イメージの準備
Docker デスクトップを起動すると、デフォルトでインスタンスが起動します。コンソールで Nginx イメージをプルします。
docker pull nginx
コンソールに以下の情報が表示されます。
Using default tag: latest
latest: Pulling from library/nginx
8559a31e96f4: Pull complete
8d69e59170f7: Pull complete
3f9f1ec1d262: Pull complete
d1f5ff4f210d: Pull complete
1e22bfa8652e: Pull complete
Digest: sha256:21f32f6c08406306d822a0e6e8b7dc81f53f336570e852e25fbe1e3e3d0d0133
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
次のようなエラーが出た場合は、Docker インスタンスが正常に動作しているか確認してください。
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
イメージの準備ができました。ルートディレクトリに Nginx 設定ファイルを作成します。
touch default.conf
以下を記述します。
server {
listen 80;
server_name localhost;
#charset koi8-r;
access_log /var/log/nginx/host.access.log main;
error_log /var/log/nginx/error.log error;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
- イメージの設定
Dockerfile を開き、以下の内容を記述します。
FROM nginx
COPY dist/ /usr/share/nginx/html/
COPY default.conf /etc/nginx/conf.d/default.conf
コードを一行ずつ説明します。
FROM nginxこのイメージがnginx:latestイメージをベースに構築されることを指定します。COPY dist/ /usr/share/nginx/html/プロジェクトルートのdistフォルダ内のすべてのファイルを、イメージ内の/usr/share/nginx/html/ディレクトリにコピーします。COPY default.conf /etc/nginx/conf.d/default.confdefault.confをetc/nginx/conf.d/default.confにコピーし、ローカルのdefault.conf設定でNginxイメージのデフォルト設定を置き換えます。
- イメージのビルド
Docker は build コマンドでイメージをビルドします。
docker build -t jartto-docker-demo .
慣例に従い、コードを説明します。
-tパラメータでイメージにjartto-docker-demoという名前を付けます。.はカレントディレクトリのDockerfileを使用してイメージをビルドすることを示します。
実行が成功すると、以下の出力が得られます。
Sending build context to Docker daemon 115.4MB
Step 1/3 : FROM nginx
---> 2622e6cca7eb
Step 2/3 : COPY dist/ /usr/share/nginx/html/
---> Using cache
---> 82b31f98dce6
Step 3/3 : COPY default.conf /etc/nginx/conf.d/default.conf
---> 7df6efaf9592
Successfully built 7df6efaf9592
Successfully tagged jartto-docker-demo:latest
イメージが作成されました!コンテナを確認してみましょう。
docker image ls | grep jartto-docker-demo
133MB のプロジェクトイメージが作成されたことがわかります。
jartto-docker-demo latest 7df6efaf9592 About a minute ago 133MB
イメージにも良し悪しがあります。後で最適化方法を紹介しますので、今は気にしなくて大丈夫です。
- コンテナの実行
docker run -d -p 3000:80 --name docker-vue jartto-docker-demo
パラメータの説明です。
-dコンテナをバックグラウンドで実行します。-pポートマッピングを指定します。ホストの3000ポートをコンテナの80ポートにマッピングします(これにより、外部からホストの3000ポート経由でアクセス可能になります)。--nameコンテナ名docker-vueを設定します。jartto-docker-demoは上でビルドしたイメージ名です。
補足:
コンソールで docker ps を実行すると、実行中の Container の ID を確認できます。
docker ps -a
コンソール出力:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ab1375befb0b jartto-docker-demo "/docker-entrypoint.…" 8 minutes ago Up 7 minutes 0.0.0.0:3000->80/tcp docker-vue
デスクトップ版を使用している場合、Docker Dashboard を開くとコンテナリストが表示されます。以下の画像をご参照ください。

- プロジェクトへのアクセス
ホストの 3000 ポートをマッピングしたので、次のコマンドを実行します。
curl -v -i localhost:3000
またはブラウザで localhost:3000 にアクセスします。
- イメージの公開
コミュニティに貢献したい場合は、イメージを公開して他の開発者が利用できるようにすると良いでしょう。
イメージを公開するには、以下の手順が必要です。
- dockerhub にログインし、アカウントを登録します。
- コマンドラインで
docker loginを実行し、アカウントとパスワードを入力してログインします。 - イメージをプッシュする前に、タグを打つ必要があります。
docker tag <image> <username>/<repository>:<tag>を実行します。
全フローが完了しました。これからは、「石を運び、木を切り、図面を描き、家を建てる」必要はもうありません。すぐに入居できます。これこそが Docker の独特な魅力です。
七、一般的な操作
ここまでで、Docker の入門プロジェクトを完了できました。さらに深く掘り下げたい方は、以下をご覧ください。
- パラメータの使用
FROM
- ベースイメージを指定します。全ての構築イメージにはベースイメージが必要であり、
FROMコマンドはDockerfileの最初のコマンドでなければなりません。 FROM <image> [AS <name>]あるイメージから新しいイメージ名を構築することを指定します。FROM <image>[:<tag>] [AS <name>]イメージのバージョンTagを指定します。- 例:
FROM mysql:5.0 AS database
- ベースイメージを指定します。全ての構築イメージにはベースイメージが必要であり、
MAINTAINER
- イメージのメンテナー情報。
MAINTAINER <name>- 例:
MAINTAINER Jartto Jartto@qq.com
RUN
- イメージ構築時に実行するコマンド。
RUN <command>- 例:
RUN ["executable", "param1", "param2"]
ADD
- ローカルファイルをコンテナに追加・コピーします。圧縮ファイルは解凍され、ネットワーク上のファイルにもアクセスでき自動ダウンロードされます。
ADD <src> <dest>- 例:
ADD *.js /appでjsファイルをコンテナのappディレクトリに追加。
COPY
- 機能は
ADDと同じですが、コピーのみで解凍やダウンロードは行いません。
- 機能は
CMD
- コンテナ起動後に実行されるコマンド。
RUNとは異なり、RUNはイメージ構築時に実行されるコマンドです。 docker runでコンテナを実行する際、コマンドラインで上書きできます。- 例:
CMD ["executable", "param1", "param2"]
- コンテナ起動後に実行されるコマンド。
ENTRYPOINT
- こちらもコマンドを実行しますが、
CMDと同様で、コマンドラインで上書きされません。 ENTRYPOINT ["executable", "param1", "param2"]- 例:
ENTRYPOINT ["donnet", "myapp.dll"]
- こちらもコマンドを実行しますが、
LABEL:イメージにメタデータを追加します。key-value 形式。
LABEL <key>=<value> <key>=<value> ...- 例:
LABEL version="1.0" description="これはウェブアプリケーションです"
ENV:環境変数を設定します。一部のコンテナは実行時に特定の環境変数を必要とします。
ENV <key> <value>1回で1つの環境変数を設定。ENV <key>=<value> <key>=<value> <key>=<value>複数の環境変数を設定。- 例:
ENV JAVA_HOME /usr/java1.8/
EXPOSE:外部に公開するポートを指定します(コンテナ内部プログラムのポート。ホストと同一でも実際は異なるポート)。
EXPOSE <port>- 例:
EXPOSE 80 - コンテナ実行時、
-pで外部ポートをマッピングしないとコンテナ内のポートにアクセスできません。
VOLUME:データ永続化のディレクトリを指定します。公式用語ではマウントと呼びます。
VOLUME /var/logコンテナ内でマウントが必要なディレクトリを指定。このディレクトリをホストのランダムなディレクトリにマッピングし、データの永続化と同期を実現します。VOLUME ["/var/log","/var/test".....]コンテナ内の複数のマウントが必要なディレクトリを指定。これらをホストの複数のランダムなディレクトリにマッピングします。VOLUME /var/data var/logコンテナ内のvar/logディレクトリをホストの/var/dataディレクトリにマウントすることを指定。この形式ではホスト上のディレクトリを手動で指定できます。
WORKDIR:作業ディレクトリを設定します。設定後、RUN、CMD、COPY、ADD の作業ディレクトリが同期して変更されます。
WORKDIR <path>- 例:
WORKDIR /app/test
USER:コマンド実行時に使用するユーザーを指定します。セキュリティと権限の観点から、実行するコマンドに応じてユーザーを選択します。
USER <user>:[<group>]- 例:
USER test
ARG:イメージ構築時に渡すパラメータを設定します。
ARG <name>[=<value>]ARG name=sss
詳細な操作については、公式ドキュメント を参照してください。
八、ベストプラクティス
Docker の一般的な操作を習得すれば、簡単に目的のプロジェクトイメージを作成できるようになります。しかし、操作の仕方によってイメージの品質は大きく異なります。
何がイメージの違いを生むのか、さらに探求してみましょう。
以下は Docker を適用する過程で整理されたベストプラクティスです。可能な限りこれらのガイドラインに従ってください。
- Require 明確化:必要なイメージを明確にする
- ステップの簡素化:変更が少ない Step を優先する
- バージョンの明確化:イメージ名を明確にする
- 説明ドキュメント:イメージのビルド手順を再現可能にする
以下の2つの記事をお勧めします。
九、まとめ
コンテナ化技術はクラウド時代に不可欠なスキルの一つであり、Docker はそのごく一部に過ぎません。その後には、クラスターコンテナ管理の K8s、Service Mesh、Istio などの技術が控えています。Docker の扉を開き、少しずつ深く掘り下げていくことで、コンテナ化の無限の魅力を感じ取れるでしょう。
ぜひスキルの境界を広げ、フロントエンド技術に新たな力を与えてください!
著作権表示: 記事は Jartto's Blog で初出公開されています。転載する場合は、必ずハイパーリンク形式で記事の出典、著者情報、および本著作権表示を明記してください。