Docker 入門究極ガイド、詳細版!もう Docker を使えないなんて言わせない!

Docker 入門究極ガイド、詳細版!もう Docker を使えないなんて言わせない!

リッチ Web 時代、アプリケーションはますます強力になり、同時に複雑化しています。クラスター展開、隔離環境、カナリアリリース、動的スケーリングはどれも欠かせず、コンテナ化はその中間の必須の架け橋となっています。

最終更新 2023/08/15 20:39
Jartto's blog
読了目安 9 分
カテゴリ
Docker
タグ
Docker

Web 時代において、アプリケーションはますます強力になる一方で、複雑さも増しています。クラスター展開、隔離環境、カナリアリリース、動的スケーリングはどれも欠かせず、コンテナ化はその中間に必要な架け橋となっています。

このセクションでは、Docker の神秘的な世界を探検し、ゼロから Docker の基本原理と実践的な操作を習得します。フロントエンドだけに閉じこもらず、領域を拡大する時です。

以下のポイントに沿って進めます:

  1. ひとつの物語
  2. 仮想マシンとコンテナ
  3. Docker を知る
  4. コアコンセプト
  5. Docker のインストール
  6. クイックスタート
  7. 一般的な操作
  8. ベストプラクティス

一、ひとつの物語

Docker とは何かをよりよく理解するために、まず物語を紹介します。

家を建てる必要があり、石を運び、木を切り、図面を描き、家を建てました。一連の作業を終え、ようやく家が完成しました。

家を建てる

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

家を繰り返し建てる

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

黒魔術

海辺に着いたら、この「イメージ」を使って家を複製し、すぐに入居できます。

不思議でしょう?これをプロジェクトに当てはめると、家がプロジェクト本体、イメージがプロジェクトのコピー、リュックがイメージレジストリです。動的スケーリングが必要な場合、レジストリからプロジェクトイメージを取り出して、好きなだけ複製できます。Build once,Run anywhere!

バージョンや互換性、デプロイの問題を気にする必要はもうありません。「リリース即クラッシュ、終わりのないビルド」という厄介な状況を完全に解決します。

二、仮想マシンとコンテナ

始める前に、いくつかの基礎知識を準備しておきます。

  1. 仮想マシン:ハードウェアの仮想化

仮想マシン(Virtual Machine)とは、ソフトウェアによってシミュレートされた完全なハードウェアシステム機能を持ち、完全に隔離された環境で動作する完全なコンピュータシステムを指します。物理コンピュータでできることは、仮想マシンでも実現できます。

コンピュータに仮想マシンを作成する際、物理マシンの一部のハードディスクとメモリ容量を仮想マシンのハードディスクとメモリ容量として割り当てます。各仮想マシンには独立したCMOS、ハードディスク、オペレーティングシステムがあり、物理マシンと同じように操作できます。コンテナ技術が登場する前、業界の人気者は仮想マシンでした。

仮想マシン技術の代表は VMWareOpenStack です。詳細は百科事典 仮想マシンを参照してください。

  1. コンテナ:オペレーティングシステム層を仮想化し、標準化されたソフトウェアユニット

    • どこでも実行可能:コンテナはコード、設定ファイル、関連する依存ライブラリをパッケージ化するため、どの環境でも一貫した実行が保証されます。
    • 高いリソース利用率:コンテナはプロセスレベルの隔離を提供するため、CPUやメモリの使用率をより細かく設定でき、サーバーの計算リソースをより有効活用できます。
    • 迅速な拡張:各コンテナは個別のプロセスとして実行でき、基盤となるオペレーティングシステムのシステムリソースを共有できるため、コンテナの起動と停止の効率が向上します。
  2. 相違点と関連性

    • 仮想マシンは多くの「サブコンピュータ」を隔離できますが、占有スペースが大きく、起動が遅くなります。仮想マシンソフトウェアは有料の場合もあります(例:VMWare)。
    • コンテナ技術はオペレーティングシステム全体を仮想化する必要はなく、「サンドボックス」のように小さな環境を仮想化するだけです。
    • 実行スペース:仮想マシンは通常数GBから数十GBのスペースを必要としますが、コンテナはMBレベル、場合によってはKBレベルで済みます。

比較データを見てみましょう。

特性 仮想マシン コンテナ
隔離レベル オペレーティングシステムレベル プロセス
隔離戦略 Hypervisor(ハイパーバイザー) Cgroups(コントロールグループ)
システムリソース 5 ~ 15% 0 ~ 5%
起動時間 分単位 秒単位
イメージストレージ GB - TB KB - MB
クラスター規模 数百 数万
高可用性戦略 バックアップ、災害復旧、移行 弾力性、負荷分散、動的

仮想マシンと比較して、コンテナはより軽量で高速です。Linux の基盤となるオペレーティングシステムを隔離環境で利用しているからです。仮想マシンの Hypervisor は非常に強固な境界を作り出し、アプリケーションがそれを突破するのを防ぎますが、コンテナの境界はそれほど強力ではありません。

物理マシンへのデプロイではリソースを十分に活用できず、リソースの無駄が生じます。仮想マシン方式のデプロイでは、仮想マシン自体が大量のリソースを消費し、リソースの無駄とパフォーマンスの低下を招きます。一方、コンテナ化によるデプロイは柔軟で軽量であり、パフォーマンスも良好です。

仮想マシンは仮想化技術であり、Docker のようなコンテナ技術は軽量な仮想化に該当します。

三、Docker を知る

Docker

  1. 概念

Docker はオープンソースのアプリケーションコンテナエンジンであり、開発者がアプリケーションとその依存パッケージをポータブルなコンテナにパッケージ化し、任意の Linux マシンに公開して実行できるようにします。また、仮想化も実現します。コンテナは完全にサンドボックスメカニズムを使用し、相互に一切のインターフェースを持ちません。

Docker 技術の三大コアコンセプトは、イメージ Image、コンテナ Container、リポジトリ Repository です。

  1. Docker が軽量な理由は?

疑問に思うかもしれません。なぜ Docker は起動が速いのか?どうやってホストOSとカーネルを共有するのか?

Docker にコンテナの実行を要求すると、Docker はコンピュータ上にリソース隔離環境をセットアップします。次に、パッケージ化されたアプリケーションと関連ファイルを Namespace 内のファイルシステムにコピーし、環境の設定が完了します。その後、Docker は事前に指定したコマンドを実行してアプリケーションを起動します。

イメージには動的データは含まれず、構築後は内容が変更されることはありません。

四、コアコンセプト

  1. Build, Ship and Run(ビルド、輸送、実行)
  2. Build once, Run anywhere(一度ビルドすれば、どこでも実行可能)
  3. Docker 自体はコンテナではなく、コンテナを作成するツールであり、アプリケーションコンテナエンジンです。
  4. Docker の三大コアコンセプト:イメージ Image、コンテナ Container、リポジトリ Repository
  5. Docker 技術は Linux カーネルとその機能(例:Cgroupsnamespaces)を利用してプロセスを分離し、各プロセスが互いに独立して動作できるようにします。
  6. NamespaceCgroups の機能は Linux でのみ利用可能なため、コンテナを他のオペレーティングシステム上で実行することはできません。では、DockermacOSWindows 上でどのように動作するのでしょうか? Docker はトリックを使用して、非 Linux OS 上に Linux 仮想マシンをインストールし、その仮想マシン内でコンテナを実行します。
  7. イメージは実行可能なパッケージであり、アプリケーションの実行に必要なコード、ランタイム、ライブラリ、環境変数、設定ファイルを含みます。コンテナはイメージの実行時インスタンスです。

Docker の原理について詳しくは、Docker の動作原理とコンテナ化の簡易ガイド を参照してください。ここでは割愛します。

五、Docker のインストール

  1. コマンドラインインストール

HomebrewCask はすでに Docker for Mac をサポートしているため、Homebrew Cask を使って簡単にインストールできます。次のコマンドを実行します。

brew cask install docker

その他のインストール方法については、公式ドキュメントを参照してください:Docker のインストール

  1. バージョン確認
docker -v
  1. イメージ加速の設定

Docker Engine の設定に以下を記述します。

{
  "registry-mirrors": [
    "http://hub-mirror.c.163.com/",
    "https://registry.docker-cn.com"
  ],
  "insecure-registries": [],
  "experimental": false,
  "debug": true
}
  1. デスクトップ版のインストール

Docker デスクトップ

デスクトップ版は非常に簡単に操作できます。まず公式サイトからダウンロードしてください。Docker デスクトップ版を使うと、以下の操作が便利に行えます。

  1. clone:プロジェクトのクローン
  2. build:イメージのビルド
  3. run:インスタンスの実行
  4. share:イメージの共有

準備は整いました。さあ、腕を振るいましょう!

六、クイックスタート

Docker をインストールしたら、実際のプロジェクトのイメージを作成しながら学んでいきましょう。

  1. まず、これから使用する 11 個のコマンドを大まかに把握します。
コマンド 説明
FROM どのイメージをベースにするか
MAINTAINER イメージ作成者
ENV 環境変数の宣言
RUN コマンドの実行
ADD ホストのファイルをコンテナに追加。圧縮ファイルは自動解凍
COPY ホストのファイルをコンテナに追加
WORKDIR 作業ディレクトリ
EXPOSE コンテナ内のアプリが使用可能なポート
CMD コンテナ起動後に実行するプログラム。docker run の後に起動コマンドを指定すると上書きされる
ENTRYPOINT CMD と同機能だが、docker run では上書きされない。上書きする場合は --entrypoint オプションを使用
VOLUME データボリューム。ホストのディレクトリをコンテナのディレクトリにマッピング
  1. 新しいプロジェクト

手早く進めるため、Vue CLI を使用してプロジェクトを作成します。

vue create docker-demo

起動を試してみます。

yarn serve

アクセス先:http://localhost:8080/。プロジェクトの準備ができました。次にプロジェクトをビルドします。

yarn build

これで、プロジェクトディレクトリの dist がデプロイする静的リソースになりました。次のステップに進みます。

注意:フロントエンドプロジェクトは通常、Nginx で静的デプロイするものと、Node サービスを起動するものの2種類に分類されます。このセクションでは前者のみを扱います。Node サービスについては、後述で詳しく説明します。

  1. Dockerfile の作成
cd docker-demo && touch Dockerfile

この時点のプロジェクトディレクトリは以下のようになります。

.
├── Dockerfile
├── README.md
├── babel.config.js
├── dist
├── node_modules
├── package.json
├── public
├── src
└── yarn.lock

docker-demo ディレクトリに Dockerfile が作成されました。

  1. 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;
    }
}
  1. イメージの設定

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.conf default.confetc/nginx/conf.d/default.conf にコピーし、ローカルの default.conf 設定で Nginx イメージのデフォルト設定を置き換えます。
  1. イメージのビルド

Dockerbuild コマンドでイメージをビルドします。

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

イメージにも良し悪しがあります。後で最適化方法を紹介しますので、今は気にしなくて大丈夫です。

  1. コンテナの実行
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 を実行すると、実行中の ContainerID を確認できます。

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 を開くとコンテナリストが表示されます。以下の画像をご参照ください。

Docker デスクトップ

  1. プロジェクトへのアクセス

ホストの 3000 ポートをマッピングしたので、次のコマンドを実行します。

curl -v -i localhost:3000

またはブラウザで localhost:3000 にアクセスします。

  1. イメージの公開

コミュニティに貢献したい場合は、イメージを公開して他の開発者が利用できるようにすると良いでしょう。

イメージを公開するには、以下の手順が必要です。

  • dockerhub にログインし、アカウントを登録します。
  • コマンドラインで docker login を実行し、アカウントとパスワードを入力してログインします。
  • イメージをプッシュする前に、タグを打つ必要があります。docker tag <image> <username>/<repository>:<tag> を実行します。

全フローが完了しました。これからは、「石を運び、木を切り、図面を描き、家を建てる」必要はもうありません。すぐに入居できます。これこそが Docker の独特な魅力です

七、一般的な操作

ここまでで、Docker の入門プロジェクトを完了できました。さらに深く掘り下げたい方は、以下をご覧ください。

  1. パラメータの使用
  • 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 /appjs ファイルをコンテナの 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 を適用する過程で整理されたベストプラクティスです。可能な限りこれらのガイドラインに従ってください。

  1. Require 明確化:必要なイメージを明確にする
  2. ステップの簡素化:変更が少ない Step を優先する
  3. バージョンの明確化:イメージ名を明確にする
  4. 説明ドキュメント:イメージのビルド手順を再現可能にする

以下の2つの記事をお勧めします。

九、まとめ

コンテナ化技術はクラウド時代に不可欠なスキルの一つであり、Docker はそのごく一部に過ぎません。その後には、クラスターコンテナ管理の K8s、Service Mesh、Istio などの技術が控えています。Docker の扉を開き、少しずつ深く掘り下げていくことで、コンテナ化の無限の魅力を感じ取れるでしょう。

ぜひスキルの境界を広げ、フロントエンド技術に新たな力を与えてください!

著作権表示: 記事は Jartto's Blog で初出公開されています。転載する場合は、必ずハイパーリンク形式で記事の出典、著者情報、および本著作権表示を明記してください。

さらに探索

関連読書

その他の記事
同じカテゴリ / 同じタグ 2021/12/22

DockerでMySQLを動かしてる?おめでとう、解雇だ!

現在、コンテナとDockerは依然としてテクノロジー分野で最もホットなキーワードです。ステートレスサービスのコンテナ化はすでに大きな流れとなっており、同時に「データベース MySQL はコンテナ化すべきか?」というホットな話題が議論されています。

続きを読む
同じタグ 2025/02/25

.NET 10 Preview 1 リリース

本日.NET 10 Preview 1がリリースされました。私はすぐにダウンロードして、Avalonia UIプロジェクトとブログサイトをアップグレードしました。前者は機能テストとAOT公開が正常に動作し、後者はデバッグが正常に行えます。Dockerは今のところ成功していません。

続きを読む
最近の更新 2026/05/25

CodeWF.Markdown:PDFテキストはコピー可能、画像は埋め込み可能。WeChat公式アカウント/知乎/掘金にコピーしてもHTMLソースが表示されない

CodeWF.Markdown と Vex における Markdown のエクスポートと公開コピーの技術実装を共有:MarkdownDocumentExporter、ExportKind、共有画像読み込み、SVG/GIF/WebP のラスタライズ、Word 埋め込みメディアリソース、テキスト選択可能なPDF、Windows CF_HTML リッチHTMLクリップボード、拡張可能なレイアウトテーマ。

続きを読む