Dockerの基本操作

この講座では、Dockerの基本操作について解説したあと、実際にハンズオン形式で手を動かしながら体験します。

  • Docker Hubからのイメージ取得(docker pull)
  • コンテナの起動・停止・削除(docker run / stop / rm)
  • イメージとコンテナの一覧確認(docker images / ps)

1. 事前準備

この講座のハンズオンでは、以下のツールやアカウントが必要です。まだ準備できていない場合は、リンク先の手順に沿って準備をお願いします。

2. Dockerの概要

2.1 Dockerとは

前の講座で学んだ「コンテナエンジン」の代表格がDockerです。2013年にDocker社によって公開され、その使いやすさから急速に普及しました。現在では、コンテナ技術のデファクトスタンダードとして、開発現場で広く利用されています。

Dockerを使うことで、前の講座で学んだコンテナの概念を、実際のコマンド操作として実践できます。本講座では、Dockerの基本的なコマンドを学び、イメージの取得からコンテナの起動・停止・削除までの一連の流れを体験します。

3. Dockerの基本的な実行方法

ここでは、Dockerの基本的な流れをもとに、Dockerの簡単な使い方を解説していきます。

3.1 Dockerイメージの作成

まずは、コンテナの元となる「イメージ」を用意します。 Dockerでイメージを用意する方法は、主に2つあります。

レジストリから取得

1つ目は、Docker Hubなどのレジストリから、既存のイメージを取得する方法です。 これには、Docker公式が提供しているものや、世界中の開発者が公開しているものが利用できます。既存の環境をそのまま手軽に利用したい場合に適しています。

📝 Docker Hubとは
Docker Hubは、Docker社が運営する世界最大のコンテナレジストリです。Webブラウザから https://hub.docker.com/ にアクセスすると、公開されているイメージを検索・閲覧できます。nginxmysqlpythonなど、よく使われるソフトウェアの公式イメージが多数用意されており、これらをdocker image pullコマンドで手軽に取得できます。

Dockerfileによる定義

2つ目は、Dockerfileという定義ファイルを作成し、独自のイメージを作成する方法です。 既存のイメージだけでは要件を満たせない場合や、独自のアプリケーションを組み込みたい場合に有効です。

本講座では、1つ目の「Docker Hubから既存イメージを取得する方法」をハンズオン形式で紹介します。 なお、Dockerfileからイメージを作成する方法については、次の講座で詳しく解説します。

3.2 コンテナの実行管理

イメージの準備ができたら、次に行うのが「コンテナの実行管理」です。 コンテナは、用意したイメージをもとにして起動します。

Dockerコンテナのライフサイクルの全体像を以下の図に示します。

flowchart LR
    A[イメージを取得<br>pull] --> B[コンテナを作成<br>・起動<br>run]
    B --> C[起動中<br>running]
    C --> D[停止<br>stop]
    D -->|再開 start| C
    D --> E[削除<br>rm]

コンテナの運用において、その状態は大きく分けて「起動中」「停止中」、そして「削除」という3つの段階をたどります。

まず「起動中」のコンテナの動きは、用途によって2つのケースがあります。 1つ目は、Webサーバのように常にアクセスを待ち受けるため、「起動中のまま待機し続けるケース」です。 2つ目は、バッチ処理やHello Worldの表示のように、「必要な処理を実行し、役目を終えたら自動的に停止するケース」です。

処理が完了したり、ユーザ操作によって終了させると、コンテナは「停止中」の状態になります。 停止中のコンテナは再開させることも可能ですが、今後使用しないのであれば「削除」を行い、環境を整理します。

4. Dockerコマンド

コンテナやイメージの作成、起動、停止といった一連の操作は、すべて「Dockerコマンド」を使って行います。これらのコマンドは、Docker Desktopをインストールしていれば、ターミナル(またはコマンドプロンプト)からすぐに利用可能です。

実際のコマンドの実行はこの後ハンズオンを用意しているので、ここでは実行は不要です。コマンドの概要の理解のみで構いません。

Dockerコマンドの書き方には、大きく分けて「正式な記法」と「省略形」の2種類が存在します。

例えば、コンテナを起動するコマンドには以下の2通りがあります。

  • 正式な記法: docker container run
  • 省略形: docker run

現在は、コマンドの構造が整理された「正式な記法」が推奨されています。「何を(container)」「どうする(run)」が明記されるため、操作の意味を理解しやすいのが特徴です。そのため、本コースでは基本的にこの正式な記法を使用します。

一方で、古くからDockerを利用しているエンジニアや、少しでも入力を短くしたい場合には「省略形」が好んで使われることもあります。Web上の技術記事などでは省略形が使われていることも多いため、両方の書き方があることを覚えておくと良いでしょう。

4.1 docker image pull (docker pull)

Docker HubやAmazon ECRなどのコンテナレジストリから、Dockerイメージをダウンロードするコマンドです。 このコマンドを実行することで、ローカルのDockerイメージの中に、取得したイメージが追加されます。そのイメージを、実行したりできます。

Docker Hubから取得

下記は、nginx:latestという名称のイメージをDocker Hubから取得するコマンドです

docker image pull nginx:latest
💡 ポイント
nginx:latestlatestの部分は「タグ」と呼ばれ、イメージのバージョンを指定するために使います。latestは「最新版」を意味する特別なタグで、バージョンを省略した場合も自動的にlatestが指定されます。本番環境では、nginx:1.25のように具体的なバージョンを指定することが推奨されます。latestを使うと、pullするタイミングによって取得されるイメージが変わる可能性があり、意図しない動作の原因になることがあるためです。Docker公式のBuilding best practicesでも「Image tags are mutable, meaning a publisher can update a tag to point to a new image」と説明されており、タグが書き換わる可能性があるためビルドの再現性が保証されないことが触れられています。

4.2 Amazon ECRから取得

また、下記はAmazon ECRからイメージを取得する例です。AWSでコンテナを運用する場合、Docker Hubではなく、AWSが提供するAmazon ECRを利用することが一般的です。ECRからのイメージ取得については、後続のハンズオンで詳しく扱います。

docker image pull 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-web-app:v1
💡 ポイント
123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-web-app:v1の部分は、AWSでECRのイメージを一意に特定するURIです。123456789012はAWSアカウントID、ap-northeast-1はリージョン、my-web-app:v1はリポジトリ名とタグを表しています。AWS公式ドキュメント(AuthorizationData(AWS SDK for Java))にも「https://aws_account_id.dkr.ecr.region.amazonaws.com」というURI形式が明記されています。なお、ECRからプルするには事前に認証(ログイン)が必要です。これらの特定方法や認証手順は別途ECR講座で解説します。

4.3 docker image build (docker build)

Dockerfile の内容に基づいて、新しいDockerイメージを作成するコマンドです。docker image pullが「コンテナレジストリから既存のイメージをダウンロードする」ものであるのに対して、docker image buildは、Dockerfileの内容に応じて独自のイメージを作成するものです。

下記は、ローカル上にあるDockerfileの定義をもとに、my-imageという名前のイメージを作成するコマンドです。

docker image build -t my-image:latest .

-tはオプションで、イメージに名前(タグ)をつけることができます。今回はmy-image:latestという名前(タグ)をつけています。名前をつけると、イメージの一覧で識別がしやすくなります。これを省略した場合、リポジトリ名やタグ名は設定されず、イメージ一覧では <none> と表示されます。

なお、latestの部分は「最新版」を表すバージョンを指定しています。もしlatestを省略してmy-image等とした場合、自動でlatestが付きます。またバージョンを個別に指定したい場合、my-image:v1my-image:v2などのように独自にバージョンをつけることができます。

なお、Dockerfileからのイメージビルド方法はこの講座では扱わず、後続で詳しく説明します。

4.4 docker image ls (docker images)

現在ローカルにダウンロード、または作成されているDockerイメージの一覧を表示するコマンドです。

docker image ls

このコマンドを実行すると、以下の例のようにイメージの一覧が表示されます。

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
nginx         latest    605c77e624dd   2 weeks ago    141MB
my-image      latest    3a0933f9a5e2   1 minute ago   50MB

4.5 docker image rm (docker rmi)

不要となったイメージを削除するコマンドです。 以下のコマンドは、my-image:latestというイメージを、ローカルから削除しています。

docker image rm my-image:latest

4.6 docker container run (docker run)

docker container runは、指定したイメージを用いてコンテナを作成し、起動するコマンドです。

docker container run my-image

このコマンドは、my-imageというイメージをもとにコンテナを起動するコマンドです。

また、実行するコンテナに名前を付けて、管理しやすくすることもできます。

docker container run --name my-container my-image

--nameが、コンテナに名前をつけるオプションです。このコマンドでは、起動されたコンテナにmy-containerという名前をつけて、わかりやすく管理できるようにしています。

docker container runコマンドには他にも様々なオプションがありますが、今後のハンズオンで必要になった段階で説明します。

4.7 docker container stop (docker stop)

このコマンドは、起動中のコンテナを停止させるためのコマンドです。

docker container stop my-container

このコマンドは、起動しているmy-containerという名前のコンテナを停止するコマンドです。 先ほどのrunコマンドで--nameオプションを使って名前を付けていたため、その名前を指定するだけで簡単に停止対象を選ぶことができます。

docker container stopコマンドにも強制終了などのオプションがありますが、今後のハンズオンで必要になった段階で説明します。

4.8 docker container start (docker start)

このコマンドは、停止しているコンテナを再開(起動)させるためのコマンドです。

docker container start my-container

このコマンドは、停止状態にあるmy-containerという名前のコンテナを再開するコマンドです。 runコマンドのように新しく作り直すのではなく、先ほど停止させた既存のコンテナを再び動かしたい場合に使用します。

4.9 docker container ls (docker ps)

このコマンドは、現在稼働しているコンテナの一覧を表示するコマンドです。

docker container ls

これにより、下記のサンプルのように、起動中のコンテナの一覧が表示されます。

CONTAINER ID   IMAGE     COMMAND                  STATUS          PORTS                  NAMES
a1b2c3d4e5f6   my-image  "/docker-entrypoint...."   Up 10 seconds   0.0.0.0:8080->80/tcp   my-container

また、docker container lsコマンドは通常は「起動中のコンテナ」のみが対象となりますが、-aのオプションをつけることで、停止しているコンテナも含めて一覧表示できます。

docker container ls -a

4.10 docker container rm (省略形: docker rm)

このコマンドは、停止しているコンテナを削除するためのコマンドです。

docker container rm my-container

このコマンドは、my-containerという名前のコンテナを削除するコマンドです。 コンテナは停止(stop)しただけではPC内にデータが残ってしまうため、不要になったコンテナはこのコマンドを使って完全に削除します。

なお、起動中のコンテナはこのコマンドでは削除できません。まずはdocker container stopコマンドでコンテナを停止させてから、この削除コマンドを実行する必要があります。

docker container rmコマンドにも強制削除などのオプションがありますが、今後のハンズオンで必要になった段階で説明します。

4.11 コマンド一覧

本講座で紹介したDockerコマンドを以下の表にまとめます。

コマンド 説明 主なオプション コマンド例
docker image pull レジストリからイメージをダウンロード - docker image pull nginx:latest
(Docker Hubからnginxの最新版を取得)
docker image build Dockerfileからイメージを作成 -t:イメージに名前を付ける docker image build -t my-image .
(カレントディレクトリのDockerfileからmy-imageを作成)
docker image ls ローカルのイメージ一覧を表示 - docker image ls
(ローカルに保存されているイメージを一覧表示)
docker image rm イメージを削除 - docker image rm my-image:latest
(my-imageの最新版をローカルから削除)
docker container run イメージからコンテナを作成・起動 --name:コンテナに名前を付ける docker container run --name my-container my-image
(my-imageからmy-containerという名前でコンテナを起動)
docker container stop 起動中のコンテナを停止 - docker container stop my-container
(my-containerを停止)
docker container start 停止中のコンテナを再開 - docker container start my-container
(停止中のmy-containerを再開)
docker container ls コンテナ一覧を表示 -a:停止中も含めて表示 docker container ls -a
(停止中のコンテナも含めて一覧表示)
docker container rm コンテナを削除 - docker container rm my-container
(my-containerを完全に削除)

5. ハンズオン:Dockerの基本サイクルを体験しよう

ここでは、Dockerの導入から、最も基本的な「Hello World」コンテナの実行方法をハンズオン形式で解説します。実際に操作してみながら、Dockerの基本操作を理解していきましょう。

5.1 イメージの取得 (pull)

コンテナを作成するための「設計図」であるイメージを、Docker Hubから手元のPCにダウンロードします。今回は hello-world という練習用の軽量イメージを使用します。これは、Docker公式が用意している、練習用に最適な、シンプルな文字列を出力するためのイメージです。

これから実行するコマンドは、Windowsであればコマンドプロンプト、Macであればターミナルを開き、そこで実行していきます。

docker image pull hello-world

成功すると、以下のような正常終了を表すメッセージが表示されます。

latest: Pulling from library/hello-world
198f93fd5094: Pull complete
Digest: sha256:d4aaab6242e0cace87e2ec17a2ed3d779d18fbfd03042ea58f2995626396a274
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest
⚠️ 「Cannot connect to the Docker daemon」エラーが出る場合
このエラーは、Docker Desktopが起動していない場合に発生します。以下の手順でDocker Desktopを起動してください。

Windowsの場合
スタートメニューから「Docker Desktop」を検索して起動します。タスクバー右下の通知領域にDockerのアイコン(クジラのマーク)が表示され、「Docker Desktop is running」と表示されれば起動完了です。

Macの場合
Launchpadまたはアプリケーションフォルダから「Docker」を起動します。メニューバーにDockerのアイコン(クジラのマーク)が表示され、「Docker Desktop is running」と表示されれば起動完了です。

起動完了後、再度コマンドを実行してください。

5.2 イメージの確認 (ls)

ダウンロードが正常に完了したか確認します。PC内に保存されているイメージの一覧を表示します。

docker image ls

REPOSITORY の列に hello-world が表示されていれば、準備完了です。

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    ca9905c726f0   5 months ago   5.2kB

5.3 コンテナの起動 (run)

取得したイメージをもとにして、コンテナを作成・起動します。

docker container run --name my-container hello-world

画面に「Hello from Docker!」というメッセージが表示されれば成功です。これは、コンテナが正しく起動し、メッセージを表示する処理を実行したことを意味します。

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (arm64v8)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

5.4 コンテナの状態確認 (ls / ls --all)

現在動いているコンテナを確認してみましょう。

docker container ls

おそらく、何も表示されないはずです(またはヘッダー行のみ)。 これは、hello-world コンテナが「メッセージを表示する」という役目を終えて、すでに停止しているためです。

💡 ポイント
「コンテナが勝手に止まってしまった」と驚くかもしれませんが、これは正常な動作です。コンテナは「実行すべき処理」が完了すると自動的に終了します。Webサーバのように常に待ち受ける必要があるコンテナは起動し続けますが、今回のhello-worldのような「メッセージを表示して終わり」のコンテナは、処理が終わると停止します。

停止しているコンテナも含めて確認するには、--all(または -a)オプションを使用します。

docker container ls -a

こちらを実行すると、先ほどのコンテナが表示され、STATUSExited(終了)になっていることが確認できます。

CONTAINER ID   IMAGE         COMMAND    CREATED              STATUS                          PORTS     NAMES
b04638fff44a   hello-world   "/hello"   About a minute ago   Exited (0) About a minute ago             my-container

5.5 不要リソースの削除

ハンズオンが終わったら、作成したリソースを削除(お片付け)します。

コンテナの削除

役割を終えた不要なコンテナを削除します。以下のコマンドで、コンテナの削除を行います。

docker container rm my-container
⚠️ 「unable to remove container ... is running」エラーが出る場合
コンテナがまだ起動中のため削除できません。docker container stop my-containerで先にコンテナを停止してから、削除コマンドを実行してください。
ただし、本ハンズオンで使用するhello-workdのイメージは、起動後にすぐに停止されるため、通常はこのエラーは発生しません。

削除できたか確認してみましょう。

docker container ls -a

一覧から消えていれば、コンテナの削除は完了です。

イメージの削除

最後に、練習に使った hello-world のイメージ(設計図)自体もPCから削除します。

docker image rm hello-world

完全に削除されたか確認します。

docker image ls

一覧に hello-world が表示されなくなっていれば、すべての手順は完了です。

6. まとめ

この講座では、Dockerの基本操作について学びました。

  • Docker Hubは、コンテナイメージを共有・配布するための公開レジストリ
  • docker image pullでイメージをダウンロードできる
  • docker container runでコンテナを作成・起動できる
  • docker container lsで起動中のコンテナを確認できる(-aで停止中も表示)
  • docker container rmでコンテナを削除できる
  • docker image rmでイメージを削除できる