Dockerとは

Dockerは、アプリケーションの開発・配布・実行を効率的に行うためのオープンプラットフォームです。
「コンテナ」と呼ばれる仮想化技術を用いて、アプリケーションを分離された環境にパッケージングし、環境差異の影響を最小限に抑えつつ動作させることができます。

本記事では、Dockerの基本概念と操作方法について、仮想化の基礎から順を追って解説していきます。

仮想化技術の基礎

仮想化とは、物理的なコンピュータ資源を仮想的に分割・再構成し、複数の独立した環境を構築する技術です。

たとえば「サーバー仮想化」では、1台の物理サーバー上に複数の仮想サーバーを立ち上げ、それぞれにメモリやストレージといったリソースを割り当てることが可能になります。

仮想化には以下の3種類のアプローチがあります。

ハードウェア ホストOS 仮想化ソフトウェア ゲストOS アプリ 仮想マシン コンテナ Docker ホストOS 型 ハイパーバイザー型 コンテナ型
  • ホストOS型

    ホストOS上に仮想化ソフトウェア(VMware, VirtualBoxなど)をインストールして仮想マシンを作成・管理する方式です。

  • ハイパーバイザー型

    物理サーバーに直接ハイパーバイザー(例:VMware ESXi, Hyper-V)をインストールして仮想マシンを実行する方式です。ホストOSを介さないため、オーバーヘッドが少なく、性能面で有利です。

  • コンテナ型(Docker)

    コンテナ型では、ホストOSのカーネルを共有しつつ、アプリケーションごとに分離された実行環境(コンテナ)を提供します。仮想マシンとは異なり、OSごとの起動は不要なため、軽量で高速な環境構築が可能です。

コンテナとは

コンテナは、アプリケーションとその実行に必要なすべて(依存関係や設定ファイルなど)をまとめた単位であり、ホストOS上で隔離されて動作します。

たとえばPHP、Nginx、MySQLなどをそれぞれ別のコンテナで動かし、構成管理することが可能です。

コンテナの特徴

  • ゲストOSが不要
    コンテナは仮想マシンと異なり、独自のOSを持たずホストOSのカーネルを共有します。

  • 高速な起動・停止
    OSの起動が不要なため、数秒で起動・破棄が可能です。

  • プロセス・リソースの隔離
    他のコンテナやホストOSから独立しており、ルートディレクトリやIPアドレスも分離されています。

コンテナ利用のメリット

  • アプリケーション管理が容易
    コンテナ単位でアプリケーションを管理でき、不要になれば削除するだけで環境をクリーンに保てます。

  • 環境の再現性が高い
    コンテナをイメージとして共有すれば、チーム全員が同一環境で開発可能です。

  • デプロイの簡素化
    イメージをそのまま本番環境へ展開でき、CI/CDと連携すれば自動化も可能です。

Dockerイメージ

Dockerイメージとは、コンテナの元となるテンプレートです。アプリケーションの実行に必要なファイル群(OS、ライブラリ、実行ファイルなど)をレイヤー構造で持ちます。

イメージの特徴

  • 変更不可の読み取り専用形式
  • 同一イメージからは常に同じ環境のコンテナが作成される
  • バージョン管理にタグ(tag)を利用

イメージの作成と利用

イメージは以下の方法で作成・利用されます。

  • Dockerfileを用いたビルド
  • 既存のコンテナの状態からcommit
  • Docker Hubなどのレジストリからpull
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# Ubuntuの最新イメージを取得
$ docker image pull ubuntu

# 特定バージョンを指定
$ docker image pull ubuntu:20.04

# イメージの一覧表示
$ docker image ls

# イメージの削除
$ docker image rm ubuntu
$ docker image rm ubuntu:20.04

Dockerのインストール

公式ドキュメントを参考に、OSに応じたDockerのインストーラを取得し、インストールを行います。

https://matsuand.github.io/docs.docker.jp.onthefly/get-docker/

インストール後、以下のコマンドで動作確認が可能です。

1
2
$ docker --version
Docker version 24.0.7, build afdd53b

Dockerの基本操作

Dockerでは、イメージ・コンテナを中心に操作を行います。

イメージ操作

1
2
3
4
5
6
7
8
# イメージの取得
$ docker image pull hello-world

# イメージの表示
$ docker image ls

# イメージの削除
$ docker image rm hello-world

コンテナの作成と操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# コンテナの作成・起動
$ docker container run -it ubuntu bash

# 起動中のコンテナを確認
$ docker container ls

# 停止中も含めた全コンテナを確認
$ docker container ls -a

# コンテナの停止・起動・再起動
$ docker container stop <name>
$ docker container start <name>
$ docker container restart <name>

# コンテナの削除
$ docker container rm <name>
$ docker container rm -f <name>  # 強制削除

コンテナでのコマンド実行

1
2
3
4
5
# コンテナ内でbashを実行
$ docker container exec -it <name> bash

# 任意のコマンドを実行(例:ls)
$ docker container exec -t <name> ls

イメージの作成(commit)

1
2
3
4
5
# コンテナの状態からイメージを作成
$ docker container commit <container_name> myubuntu:1.0

# 作成されたイメージの確認
$ docker image ls

イメージの保存と読み込み

1
2
3
4
5
# イメージをファイルとして保存
$ docker image save -o myubuntu_image.tar myubuntu

# 保存ファイルからイメージを読み込む
$ docker image load -i myubuntu_image.tar

デタッチモード

Nginxなど、ターミナルを占有しない起動が望ましいアプリケーションでは、デタッチモード(バックグラウンド)で起動します。

1
2
# デタッチモードで起動(8080→80ポート割り当て)
$ docker container run -dit -p 8080:80 --name webserver nginx

この状態ではターミナルが自由に使える一方、ログ出力などはリアルタイムで見られません。必要に応じて以下のように切り替えます。

1
2
3
4
# アタッチモード(フォアグラウンド)に切り替え
$ docker container attach webserver

# 再度デタッチに戻す(Ctrl + P + Q)

※コンテナ起動時に-itオプションがない場合、デタッチ操作は無効になるため注意が必要です。