Docker CLI(コマンドラインインターフェース)とは?

SHARE:

Docker CLIツールはコマンドラインアプリケーションでありdockerdデーモンとのやり取りに使用されます。dockerdデーモンは、APIエンドポイントを露出させることでコンテナを管理し、CLIから送信されるすべてのコマンドを処理するプロセスです。したがって、dockerが機能するためには、dockerdとDocker CLIの両方が必要となります。以下の図は、Dockerの全体的なアーキテクチャを示しています

Docker Architecture (Source: https://docs.docker.com/)

本記事では、Docker Engineとの連携に使用されるDocker CLIツールの基本、主な機能、インストール方法と操作方法、設定方法、およびDocker ComposeやDocker APIとの関係について解説いたします。

Docker CLIの機能

Docker CLIにはいくつかの便利な機能が含まれております。標準的なUNIXスタイルの引数を扱い、多くの場合、短縮形と長形式の両方を提供しております。

例えば、フラグ-H, --hostはどちらも接続先ホストを指定するものです。環境変数(詳細は後述)を受け付け、設定ファイル(config.json)からの設定も受け付けるため、管理者はフラグの明示的な渡しが制限できます。

–helpフラグは便利ですが、改善の余地があります(Gitツールセットのような包括的なドキュメントがあれば理想的でした)。ほとんどの参照資料は公式のドキュメントサイトでご確認いただけます。

テスト目的で実験的機能を有効にするオプションがあり、以下の環境変数をエクスポートすることで利用できます:

export DOCKER_CLI_EXPERIMENTAL=enabledCode language: JavaScript (javascript)

最後に、プラグインを使用してツールを拡張することも可能です。CLIツールが使用できるアウトオブプロセス拡張機能(新規コマンドの登録など)を設定するには、特定の指示に従う必要があります。

CLIに新規コマンドを追加するサンプルプラグインのgistコード例(インストール済みバージョンのDocker変更履歴を表示する機能)をご参照いただき、プラグインの使用方法についてさらに詳しくご確認ください。

インストールと設定

すべてのソフトウェアと同様に、ご利用になる前にインストールが必要です。Docker CLIはGoプログラミング言語で記述されているため、非常に移植性の高いツールです。

CLIリクエストの処理を担当するdockerdデーモンは、主要なプラットフォーム(Windows、Linux、ARM/x86_64 /amd64 CPU搭載のMacを含む)で実行可能です。Dockerをサポートするプラットフォームの一覧はこちらのページでご確認いただけます。

インストール

Docker CLIは、デスクトップアプリケーション(Docker Desktopと呼ばれる)として、またはコマンドラインを使用してインストールできます。なお、大規模な企業におけるDocker Desktopの商用利用には有料サブスクリプションが必要です。

Dockerの入手ページでは、お使いのコンピュータにDocker Desktopをインストールする方法をご案内しております。一方、Docker CLIのインストールには、いくつかのコマンドの実行が必要となります。例えばUbuntuをご利用の場合、まずaptリポジトリのパッケージが最新のca-certificatesおよびgnupgに更新されていることを確認する必要があります

$ sudo apt update
$ sudo apt install ca-certificates curl gnupg lsb-release

gpgキーのダウンロードには、curlまたはwgetのいずれかを利用できます

$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ sudo chmod a+r /etc/apt/keyrings/docker.gpgCode language: JavaScript (javascript)

以下のコマンドにより、/etc/apt/sources.list.d/docker.listを更新し、Dockerディストリビューション用の新しいリポジトリを追加します。また、適切なLinuxディストリビューション名を出力するためにlsb_releaseツールを使用します

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu 
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Code language: PHP (php)

ソースの設定が完了しましたので、最後の2つのコマンドを使用してDocker CLI、docker daemon、およびdocker-composeツールをインストールします

$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

インストールスクリプトを使用してDockerをインストールすることも可能です。この方法では手順が少なくて済みます。実行前に必ず実行権限を設定してください

$ sudo apt update
$ sudo apt install ca-certificates curl gnupg lsb-release
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo chmod +x get-docker.sh
$ sudo sh ./get-docker.sh --dry-runCode language: JavaScript (javascript)

これらの手順をすべて完了しましたら、docker versionを実行して、正常に動作しているかご確認ください

$ docker version
Client:
 Cloud integration: v1.0.22
 Version:           20.10.13
 API version:       1.41
 Go version:        go1.16.15
 Git commit:        a224086
…

基本的な操作方法

docker <コマンド>を使用して、コマンドを実行したり、利用可能なオプションの一覧を取得したりすることができます。

例えば、docker imageコマンドのオプション一覧を取得するには、以下のように実行してください

$ docker image
Usage:  docker image COMMAND
Manage images
Commands:
  build       Build an image from a Dockerfile
  history     Show the history of an image
…Code language: JavaScript (javascript)

サブコマンドの詳細なオプション一覧を確認するには、docker <コマンド> <サブコマンド> --helpを利用ください。例:

$ docker image build --help
Usage:  docker image build [OPTIONS] PATH | URL | -
Build an image from a Dockerfile
Options:
…Code language: JavaScript (javascript)

誤ったコマンドを実行すると、タスクの実行が停止し、関連するエラーが表示されます

$ docker image build -t
flag needs an argument: 't' in -t
See 'docker image build --help'.Code language: JavaScript (javascript)

Dockerを初めてインストールされた際には、イメージをプッシュまたはプルするためにレジストリへのログインが必要となる場合がございます。その際はdocker login コマンドを利用できます

$ docker login registry.gitlab.com
Authenticating with existing credentials...
Login SucceededCode language: JavaScript (javascript)

Dockerには多数のコマンドが用意されており、さらにサブコマンドやフラグが存在します。ただし、実際にはごく一部のコマンドのみを使用される場合がほとんどです。これらの詳細については、このチュートリアルの後半で詳しくご説明いたします。

環境変数

Docker CLIは実行コンテキスト上で動作し、環境変数で設定が可能です。これらの変数は接続パラメータやアクセス認証情報の設定に使用されます。数は多くありませんが、その役割を理解することが重要です。主なものを以下に示します:

DOCKER_HOST: CLIツールが接続するホストを変更するために使用します。有効な接続文字列である必要があります。各種接続文字列の形式はこちらのコードセクションでご確認いただけます。例えば、tcp://1.2.3.4:5678unix:///pathなどが有効な接続文字列となります。

DOCKER_CONTEXT: デフォルトで使用するDockerコンテキストを指定するために使用します。Dockerコンテキストを利用することで、異なるホスト間を容易に切り替えることが可能です。例えば、利用可能なコンテキストの一覧は以下の通りです

$ docker context list
NAME                TYPE                DESCRIPTION                               DOCKER ENDPOINT                                        KUBERNETES ENDPOINT                 ORCHESTRATOR
default *           moby                Current DOCKER_HOST based configuration   unix:///var/run/docker.sock                            https://127.0.0.1:55093 (default)   swarmCode language: PHP (php)
<code>desktop-linux       moby                                                          unix:///Users/theo.despoudis/.docker/run/docker.sock</code>Code language: HTML, XML (xml)

DOCKER_TLS_VERIFY: CLIツールとdockerdデーモン間のSSL証明書検証をスキップしない場合は、これをtrueまたは1に設定してください。これにより、使用する証明書は有効である必要があり、そうでない場合、操作は失敗します。

DOCKER_CONFIG: Docker設定ファイルの場所です。デフォルトでは、ユーザーのホームディレクトリ内の.dockerに設定されています。

設定ファイル

環境変数 DOCKER_CONFIGは、CLI ツールが特別な config.jsonを使用して設定を行うフォルダを指定します。特定のコマンドに対して別の config.jsonを使用したい場合は、代わりに --config <config_folder>を使用する必要があります。

設定ファイルを使用することで、ユーザーはDockerコマンドに対する上書き設定や共通オプションを指定できます。例えば、イメージ、コンテナ、シークレットなど、各種リスト表示オプションのデフォルト出力形式を割り当てるには、以下のように設定します:

// config.json
{
"imagesFormat": "table {{.ID}}\t{{.Repository}}\t{{.Tag}}\t{{.Size}}"
}
Code language: JSON / JSON with Comments (json)

これは以下のコマンドを使用することと同一の処理となります

$ docker image list --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}\t{{.Size}}"Code language: PHP (php)

YHttpHeadersフィールドを使用してカスタムHTTPヘッダーを指定することも可能です。また、--build-argに対して特定のビルド時引数を指定することもできます。利用可能な設定オプションについてはこちらに文書化されています

これらのファイルは、バージョン管理システムを使用して特定の値を変更する必要が生じた際に自動的に更新できるよう、構成管理ツールに保存されることをお勧めいたします。

便利なコマンド

それでは、Docker CLIツールを使用する際に知っておくと非常に有用で実用的なコマンドをいくつかご紹介いたします。これらのコマンドの多くは特定の位置で引数を受け付けるため、正しい順序で渡す必要がある点にご注意ください。利用可能なコマンドの一覧については、リファレンスドキュメントセクションでご確認いただくことをお勧めいたします。

Docker Create

create(またはcontainer create)コマンドは、既存のベースイメージから新しいコンテナを作成しますが、起動は行いません。コンテナに名前を付けたり、ボリューム、環境変数、その他の設定をアタッチしたりできます。例:

$ docker container create -it --name example busybox
A883f7e9295b42ade570ac2883fbdd3654e3fe6c6d3aa41d05872f16a46835a7

exampleという名前のコンテナを作成します。 BusyBoxイメージから作成され、ステータスはCREATEDとなります。その後、start コマンドを使用して、そのステータスをRUNNINGに変更することができます。

Docker Build

これはDockerfileからイメージをビルドします。イメージをビルドするには、Dockerfileのパスまたは場所を指定するか、URLを指定するか、STDINの指示を使用する必要があります。例えば、現在のフォルダにDockerfileがある場合、以下のように実行するだけで済みます

$ docker build .

ご指定いただいた指示に基づいて、新しいイメージを作成いたします。また、引数を使用して一部のビルドパラメータを上書きするオプションもございます。

Docker Pull

pullコマンドは、レジストリから指定されたイメージをローカルのDockerファイルシステムにダウンロードします。イメージのダウンロードが完了すると、docker image lsコマンドを使用してイメージの一覧を表示できるようになります:

$ docker pull alpine:latest
$ docker image ls
REPOSITORY                  TAG                IMAGE ID       CREATED        SIZE
alpine                      latest             b2aa39c304c2   10 seconds ago   7.05MB

Docker Run

docker runコマンドは、コンテナの作成または取得と、指定されたオプションでの実行を複数のコマンドを組み合わせて行います。例えば、ローカルホストにイメージが存在しない場合、まずデフォルトのレジストリからイメージを取得し、その後コンテナを作成して実行する一連の処理を、すべて同じコマンド内で実行します。以下の例がその流れを示しています

$ docker run --name redis -p 6379:6379 -d redis:latest
Unable to find image 'redis:latest' locally
latest: Pulling from library/redis
3665d49a6c759ad832bf60665e105060935db40a390a87a9f973ff2b81d92c0b

$ docker ps
CONTAINER ID   IMAGE                      COMMAND                  CREATED         STATUS                         PORTS                    NAMES
3665d49a6c75   redis:latest               "docker-entrypoint.s…"   5 seconds ago   Up 4 seconds                   0.0.0.0:6379->6379/tcp   redisCode language: JavaScript (javascript)

runコマンドには複数の設定オプションが利用可能です。詳細はドキュメントでご確認ください。

Dockerの起動/停止

実行中のコンテナの起動と停止は、それぞれdocker startコマンドとdocker stopコマンドで実行できます。コンテナは利用可能な状態でのみ起動でき、起動済みのコンテナはタスク完了後、またはdockerdプロセスを停止する際にのみstopコマンドで停止できます。

$ docker start nocontainer
Error response from daemon: No such container: nocontainer
Error: failed to start containers: nocontainer
$ docker start example
$ docker ps
CONTAINER ID   IMAGE                      COMMAND                  CREATED          STATUS                          PORTS                    NAMES
a883f7e9295b   busybox                    "sh"                     38 minutes ago   Up 6 seconds                                             example
$ docker stop exampleCode language: JavaScript (javascript)

Docker Exec

execコマンドは、実行中のコンテナ内でコマンドを実行するために使用されます。これはrunコマンドとは異なり、レジストリからのイメージのダウンロードやその他の操作には使用できません。例えば、存在しないコンテナに対してexecを使用することはできません。このコマンドは、コンテナのデフォルトディレクトリ、または指定されたWORKDIRオプションによって呼び出されます:

$ docker exec -it redis redis-cli
Error: No such container: redis

$ docker run --name redis -p 6379:6379 -d redis:latest
$docker exec -it redis redis-cli
127.0.0.1:6379> PING
PONG
127.0.0.1:6379>Code language: PHP (php)

execコマンドは、単発タスクの実行、接続性のテスト、環境変数の表示、デバッグ目的などに便利です。

Docker Compose

dockerdデーモンと接続するツールは、Docker CLIだけではありません。dockerdプロセスはAPIを公開しているため、互換性のあるクライアントであれば、これとインターフェースできます。Pythonで書かれたDocker Composeは、Docker APIへのクライアントとして機能する別のツールです。

コマンドを直接使用する代わりに、スタックの YAML 定義を指定する必要があります。これには特定の仕様に従う必要があります。例えば、以下の仕様はポート 6379 で動作する Redis サーバーを定義し、ホストマシン上で同じポートを公開します。その後、docker-compose CLI を使用して記述されたサービスを起動します:

version: "3.9"
services:
  redis:
    image: "redis:alpine"
    container_name: redis
    ports:
      - 6379:6379

$ docker-compose up -d
$ docker-compose ps
Name               Command               State           Ports         
-----------------------------------------------------------------------
redis   docker-entrypoint.sh redis ...   Up      0.0.0.0:6379->6379/tcp

$ docker container ls
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                    NAMES
3d01944c30f8   redis:alpine   "docker-entrypoint.s…"   34 seconds ago   Up 33 seconds   0.0.0.0:6379->6379/tcp   redisCode language: JavaScript (javascript)

これは以下のDocker CLIコマンドを使用することに相当します

$ docker network create --network=redis-net
$ docker run --name redis -p 6379:6379 --network=redis-net -d redis:latest

services フィールドには、1つ以上のサービスを指定することが可能です。各サービスには独自の設定が適用されます。Docker Composeを利用することで、フルスタックのDockerアプリケーションを単一のファイルで記述し、シンプルなコマンドによるデプロイ管理が容易になります。

複数のネットワーク、ボリューム、シークレット、その他のリソースを設定する必要がある場合、Docker Composeはスケーラブルな選択肢となります。docker-compose CLIで使用可能なコマンドの全リストと説明は、こちらのドキュメントページでご確認いただけます。

Docker API

前述の通り、Docker CLIはdockerdサービスで公開されているAPIを介してDocker Engineと連携します。開発者は独自のクライアントを作成し、このAPIとインターフェースできます。

このAPI(こちらでドキュメント化されています)は、Dockerコンテナ、シークレット、サービスを管理するための様々なエンドポイントで構成されています。着信HTTPおよびTCPリクエストには/var/run/docker.sockを使用します:

The Docker API (出典: https://docs.docker.com/)

socatツールを使用して/version情報エンドポイントをリクエストする例を以下に示します

echo -n "GET /info HTTP/1.0\n\n" | socat UNIX-CONNECT:/var/run/docker.sock - | grep -o '{.*}' | jq
{
  "ID": "45BJ:D2Z2:7MT5:YGLC:TFJZ:2XHT:MI6M:AQUC:24BZ:47MJ:SLPA:3JNX",
  "Containers": 2,
  "ContainersRunning": 1,
  "ContainersPaused": 0,
  "ContainersStopped": 1,
  "Images": 4,
  "Driver": "overlay2",
  "DriverStatus": [
    [
      "Backing Filesystem",
      "extfs"
    ],
    [
      "Supports d_type",
      "true"
    ],
    [
      "Native Overlay Diff",
      "true"
    ],
    [
      "userxattr",
      "false"
    ]
  ],
  …Code language: PHP (php)

socatを使用して/infoエンドポイントへGETリクエストを送信します。これによりDockerソケットへ接続されます。この式の一番最後の部分では、JSON形式の応答を取得し、コマンドライン上で読みやすく整形します。dockerdハンドラーに加え、Docker HubおよびDocker Registry向けのAPIもクエリ可能です。公開されているこれらのAPIは、それぞれ異なる管理オプションやリクエストに対応しています。

結論として、Dockerはコンテナ管理のためのプラットフォームであり、そのエコシステムには多くのツールやサービスが存在します。Docker CLIツールを使用することで、ユーザーは柔軟かつ容易にコンテナの作成や管理を行うためのコマンドを発行できます。本記事では、その基本について解説しました。

まとめ

Dockerはコンテナ管理のためのプラットフォームであり、そのエコシステムには多くのツールやサービスが存在します。Docker CLIツールを使用することで、ユーザーは柔軟かつ容易にコンテナの作成や管理を行うためのコマンドを発行できます。本記事では、CLIツールの基本を解説し、最も有用なコマンドについて説明するとともに、その内部動作についてご紹介しました。

本記事の目的は、Docker CLIの優れた入門ガイドを提供することでした。しかし、Dockerやコンテナを実際に扱う際には、WordPress、MySQL、NGINXで構成されるWordPressスタックのデプロイを試みるなど、実世界のシナリオを通じて多くのことを学ばれることでしょう。