Lesson 7

Docker CLI

Lesson 7 Chapter 1
Docker CLI概要

Lesson7では、今までの整理としてDocker CLI(dockerコマンド)のまとめを行います。

これまで使用したものの復習を含め、まだ使用していないコマンドも紹介します。

新旧コマンドについて

dockerコマンドを整理するにあたって、最初に触れておきたいことがあります。

それはdockerコマンドには、コマンド名が異なるが同じ実行内容のものがあることです。

例えば、docker container rmはコンテナを削除するコマンドですが、旧コマンドのdocker rmでも同じ内容が実行できます。

他にもdocker image rmは、旧コマンドではdocker rmiが対応しています。

lesson7_1_1.png 新旧コマンドの例

このようになっている理由は、dockerがバージョンアップされ多機能になっていく中で、コマンド数が増加したため、コマンドを再構築した歴史があるためです。

コマンドの再構築により、行いたい操作と対象のオブジェクト(container、 image等)の関係が明確になり、使いやすくなっています。

ただし、旧コマンドに対するサポートは続いており、新旧どちらのコマンドでも実行可能になっています。

このLessonでは新旧コマンドの対応を掲載しますので、参考にして下さい。

docker help

行いたい操作に対するdockerコマンドを忘れてしまった場合は、docker helpコマンドで使用できるコマンドの一覧を得ることができます。

lesson7_1_2.png

その他にも、さらにコマンドの一覧を得たい対象を絞って表示することもでき、以下のようなものがあります。

コマンド 対象
docker container help コンテナ
docker image help イメージ
docker network help ネットワーク
docker volume help ボリューム
docker compose help Docker Compose

このように、docker helpコマンドで使用できるコマンドの一覧を得られることを覚えておきましょう。

Lesson 7 Chapter 2
コンテナ

このchapterでは、コンテナ関係のコマンドを整理します。

コンテナを実行することがDockerの目的であるので、コンテナ関係のコマンドが数も一番多くなっています。

docker container help

docker container helpを実行して、使用できるコマンドの一覧を表示してみましょう。

lesson7_2_1.png

これが使用できるコマンド全てになりますが、中々使用する機会がないものもあります。ここでは、この中でも使用頻度の高いものをいくつかピックアップして紹介していきます。

コンテナのライフサイクル

各コマンドの詳細に移る前に、コンテナのライフサイクルについて解説します。

コンテナのライフサイクルは、dockerコマンドでコンテナを操作する上で重要な概念になります。

Lesson3のchapter3では、docker runコマンドの実行内容を以下の図で紹介しました。

lesson7_2_2.png コンテナの作成から起動まで

これは、コンテナの作成から起動までの流れを抜き取った図になります。

しかし、コンテナのステータスは他にもあり、全てを挙げると以下の図のようになります。

lesson7_2_3.png コンテナのライフサイクル

コンテナのライフサイクルとは、このようにコンテナのステータスが変遷する流れのことで、以下のような各段階に沿って移行します。

・作成

コンテナが作成されたが、まだ開始されていない状態(created)です。

・開始/起動

作成されたコンテナ(created)を開始した状態(running)です。

・再起動

起動中(running)のコンテナに対し、docker container restartコマンドを実行すると、再起動状態(restarting)になります。処理が完了すると、起動状態(running)に戻ります。

・一時停止

起動中(running)のコンテナ内部の全プロセスが一時停止した状態(paused)です。docker container pauseコマンドで一時停止し、docker container unpauseコマンドで再起動できます。

・終了

起動中(running)のコンテナが停止した状態(exited)です。何らかの原因が発生し、コンテナの停止に失敗すると、ステータスがdeadになります。終了したコンテナに対し、docker container startコマンドを実行すると、再び起動することができます。

・削除

docker container rmコマンドを実行すると削除している状態(removing)に移行します。処理が完了すると、コンテナが削除されます。

以上がコンテナのライフサイクルの概要になりますが、以下の実際のコマンドの実行でも、ステータスがどのように変遷するか合わせて解説します。

docker container run / docker run(コンテナを作成&起動)

新コマンド 旧コマンド 形式
docker container run docker run docker container run [イメージ名]

指定したイメージを元にコンテナを作成し、起動します。

指定したイメージ名をまず、ローカル内から探します。ローカル内に該当イメージがなければ、Docker Hubからイメージを取得します。

コマンドを指定した場合、デフォルトのコマンドを書き換えて実行します。

lesson7_2_4.png docker container run

オプション

コンテナの起動にあたり、どのように実行するかを指定するためのオプションが豊富にあります。下記のリストで、その中でもよく使うものをピックアップしました。

オプション 省略形 内容
--name コンテナに名前をつける
--rm コンテナが停止したときに自動で削除する
--interactive -i コンテナの標準入力に接続する
--tty -t 擬似ターミナルを割り当てる
--detach -d バックグラウンドで実行する
--publish -p ポートを設定する
--env -e 環境変数を設定する

コンテナを対話操作する

数多くあるオプションの中でも、Lesson4のchapter1でも使用した-itオプションについて解説します。

-it--interactive--ttyオプションの省略形をつなげて実行しています。よって、-i -tと記述しても同じ意味になりますが、一番短く記述できるものを選んでいます。

-iは、ホストマシン側のターミナル(PowerShell)で入力したコマンドをコンテナ内の入力として使用できるようにするオプションです。

-tは、コンテナ内で擬似ターミナルを立ち上げて接続するためのオプションです。

両方を指定することによって、起動したコンテナとホストマシンで対話操作を行うことができるようになります。

以下の簡単な例で、-itオプション有りと無しの場合を比較してみて下さい。

-itオプション無しで実行

-itオプション無しで、docker run ubuntu /bin/bashを実行します。

lesson7_2_5.png

対話操作を行うことができず、コンテナの実行が終了します。

lesson7_2_6.png -itオプション無し

-itオプション有りで実行

今度は-itオプション有りで実行してみましょう。

lesson7_2_7.png

コンテナ内でターミナルが立ち上がり、対話操作を行うことができるようになりました。

lesson7_2_8.png -itオプション有り

docker container create / docker create(コンテナを作成)

新コマンド 旧コマンド 形式
docker container create docker create docker container create [イメージ名]

指定したイメージを元に、コンテナを作成します。

オプション

オプションについてはdocker runコマンドとほとんど同じものが使えます。

docker createによるコンテナの作成段階で指定したオプションにしたがって、次の②docker startでコンテナを起動するというイメージです。

lesson7_2_9.png docker runとdocker createはオプションを共有している

docker container start / docker start(コンテナを起動)

新コマンド 旧コマンド 形式
docker container start docker start docker container start [コンテナ名]

作成されたコンテナ、あるいは停止中のコンテナを起動します。

lesson7_2_10.png docker start

オプション

オプション 省略形 内容
--attach -a 標準入出力に接続してコンテナを起動する
--interactive -i コンテナの標準入力に接続する

docker startでコンテナを起動させる時、コンテナを対話操作するためには-aiオプションをつけて実行する必要があります。

下記のようにdocker create-itオプションをつけても、docker startだけではコンテナを対話操作することができません。

lesson7_2_11.png

-aiオプションをつけて実行すると、コンテナを対話操作できるようになります。

lesson7_2_12.png

lesson7_2_13.png docker start -ai

docker container exec / docker exec(コンテナ内でコマンドを実行)

新コマンド 旧コマンド 形式
docker container exec docker exec docker container exec [コンテナ名] [コマンド]

実行中のコンテナ内で、指定したコマンドを実行します。

コマンドはデフォルトディレクトリで実行されますが、DockerfileのWORKDIR命令で作業ディレクトリを指定している場合は、そちらで実行されます。

実行例

まずは実行中のコンテナを用意します。

docker run -d -it --name my-ubuntu ubuntuを実行して下さい。

lesson7_2_14.png

docker container ls -aで、コンテナが実行中であることを確かめます。

lesson7_2_15.png

my-ubuntuという名前のコンテナが実行中であることが確認できました。

lesson7_2_16.png my-ubuntuが実行中

それでは実行中のコンテナに対し、コマンドを実行してみましょう。

docker exec my-ubuntu lsを実行して下さい。

lesson7_2_17.png

実行中のmy-ubuntu内で、lsコマンドを実行することができました。

オプション

オプション 省略形 内容
--interactive -i コンテナの標準入力に接続する
--tty -t 擬似ターミナルを割り当てる
--detach -d バックグラウンドで実行する
--env -e 環境変数を設定する
--workdir -w コマンドを実行するディレクトリを指定する

実行中のコンテナに接続

次に実行中のコンテナに接続して対話操作できるようにしてみましょう。

docker run -d -it --name my-ubuntu ubuntuでコンテナを実行している状態で、②docker exec -it my-ubuntu /bin/bashを実行します。

lesson7_2_18.png

my-ubuntu内に接続することができました。

lesson7_2_19.png 実行中のコンテナに接続する

docker container restart / docker restart(コンテナを再起動)

新コマンド 旧コマンド 形式
docker container restart docker restart docker container restart [コンテナ名]

指定したコンテナを再起動させます。

オプション

オプション 省略形 内容
--time -t コンテナを強制停止するまで待機する秒数

-tオプションで指定した秒数を経過しても再起動できない場合は、コンテナが強制停止されます。デフォルトでは10秒に設定されています。

docker container stop / docker stop(コンテナを停止)

新コマンド 旧コマンド 形式
docker container stop docker stop docker container stop [コンテナ名]

指定したコンテナを停止させます。

停止に失敗すると、ステータスがdeadになります。

lesson7_2_20.png docker container stop

オプション

オプション 省略形 内容
--time -t コンテナを強制停止するまで待機する秒数

-tオプションで指定した秒数を経過しても停止できない場合は、コンテナが強制停止されます。デフォルトでは10秒に設定されています。

docker container rm / docker rm(コンテナを削除)

新コマンド 旧コマンド 形式
docker container rm docker rm docker container rm [コンテナ名]

指定したコンテナを削除します。

オプション

オプション 省略形 内容
--force -f 実行中のコンテナを強制的に削除する
--volumes -v コンテナに割り当てられた匿名ボリュームを削除する

停止したコンテナの全削除

docker rmの実行では基本的に1つずつコンテナを選択して削除することになります。

停止したコンテナを全て削除したい場合はdocker container pruneというコマンドが使用できます。

docker XXX prune

docker container pruneは停止したコンテナを全て削除するコマンドでしたが、イメージ・ネットワーク・ボリュームについても、それぞれ同じ形式のコマンドが用意されています。また、コンテナ・イメージ・ネットワークをまとめて削除するにはdocker system pruneというコマンドを使用します。

コマンド 内容
docker image prune 未使用イメージの全削除
docker network prune 未使用ネットワークの全削除
docker volume prune 未使用ボリュームの全削除
docker system prune 未使用コンテナ・イメージ・ネットワークの全削除

docker container ls / docker ps(コンテナの一覧を取得)

新コマンド 旧コマンド 形式
docker container ls docker ps docker container ls

コンテナの一覧を表示します。

オプション無しの実行では、コンテナのステータスが実行中のものだけを表示します。

オプション

オプション 省略形 内容
--all -a 全てのコンテナを表示する
--filter -f フィルタリングして表示します

フィルタリングして表示する

-fオプションをつけると、検索条件をつけて表示することができます。

-f "key=value"の形式で指定します。keyはフィルタ名のことです。

例えば、以下のようなものがあります。

フィルタ名 検索内容
id コンテナのID
name コンテナの名前
status コンテナのステータス
volume 実行中のコンテナがマウントしているボリューム
network 実行中のコンテナが接続しているネットワーク名

実行中のコンテナの一覧を取得したい場合には、docker container ls -f "status=running"というように実行します。

docker container cp / docker cp

新コマンド 旧コマンド
docker container cp docker cp

ホストマシンからコンテナ、あるいはコンテナからホストマシンにファイル(ディレクトリ)をコピーします。

以下で簡単な実行例を紹介するに当たり、実行中のコンテナが必要になるので、docker container execのところで使用したコンテナを再利用しましょう。

コンテナが起動していない場合は、docker start my-ubuntuで起動してください。

ホストマシンからコンテナにファイルをコピーする

実行内容 形式
ホストマシンからコンテナにコピー docker container cp [コピー元パス] [コンテナ名]:[コピー先パス]

それでは、ホストマシン上のファイルを実行中のmy-ubuntuコンテナにコピーしてみましょう。

適当なファイルを用意して下さい。ここではmyfile.txtとします。

docker container cp myfile.txt my-ubuntu:/homeを実行して下さい。

lesson7_2_21.png

このコマンドの実行により、myfile.txtをmy-ubuntuコンテナ内のhomeディレクトリにコピーしています。

lesson7_2_22.png ホストマシンからコンテナにコピー

docker exec my-ubuntu ls /homeを実行して下さい。

lesson7_2_23.png

ファイルがコンテナ内にコピーされていることが確認できました。

コンテナからホストマシンにファイルをコピーする

実行内容 形式
コンテナからホストマシンにコピー docker container cp [コンテナ名]:[コピー元パス] [コピー先パス]

次にコンテナからホストマシンにファイルをコピーしてみましょう。

コンテナ内に適当なファイルを用意します。

docker exec my-ubuntu touch /home/myfile2.txtを実行して下さい。

lesson7_2_24.png

それでは、この作成したファイルをホストマシンにコピーしましょう。

docker container cp my-ubuntu:/home/myfile2.txt .を実行して下さい。

lesson7_2_25.png

先ほどと、コンテナとホストマシンのパスの順番が反対になっていることに注意して下さい。

lesson7_2_26.png コンテナからホストマシンにコピー

コピー先を.でカレントディレクトリにしています。

lsコマンドでファイルが存在しているか確認してみましょう。

lesson7_2_27.png

無事、コンテナからホストマシンにファイルをコピーできています。

まとめ

以上で、コンテナに関するコマンドの整理を終了します。

全てのコマンドやオプションを解説しているわけではないので、helpコマンドや公式ページなどを参考に各自必要であれば調べてみて下さい。

Lesson 7 Chapter 3
イメージ・ボリューム・ネットワーク

このchapterではイメージ・ネットワーク・ボリュームに関するコマンドで、今までのLessonで使用したものの復習を行います。

イメージ

docker image helpを実行して、使用できるコマンドの一覧を表示してみましょう。

lesson7_3_1.png

ここでは、以下のものについてピックアップします。

新コマンド 旧コマンド 実行内容
docker image build docker build イメージを作成
docker image ls docker images イメージの一覧表示
docker image pull docker pull イメージの取得
docker image rm docker rmi イメージを削除

docker image build / docker build(イメージを作成)

新コマンド 旧コマンド 形式
docker image build docker build docker image build パス

パスで指定した先のDockerfileを用いてイメージを作成します。

カレントディレクトリのDockerfileを指定するときにパスの.を忘れないようにしましょう。

lesson7_3_2.png

オプション

オプション 省略形 内容
--file -f ファイルを指定する
--tag -t 名前を指定する

ファイルを指定する

デフォルトではdocker buildで指定するファイル名はDockerfileになりますが、-fオプションを使用すると任意の名前のファイルを読み込ませることができます。

例えば、/dockerfilesディレクトリ内にあるDockerfile.devという名前のファイルを元にイメージを作成するとしましょう。

その場合は、docker image build -f Dockerfile.dev /dockerfilesというように実行します。

lesson7_3_3.png 任意の名前のファイルを指定してイメージを作成

docker image ls / docker images(イメージの一覧表示)

新コマンド 旧コマンド 形式
docker image ls docker images docker image ls

イメージの一覧を表示します。

REPOSITORY(リポジトリ名)、TAG(タグ名)、IMAGE ID(イメージID)、CREATED(作成日)、SIZE(イメージサイズ)を確認できます。

lesson7_3_4.png

docker image pull / docker pull(イメージの取得)

新コマンド 旧コマンド 形式
docker image pull docker pull docker image pull [イメージ名:タグ]

レジストリからイメージを取得します。

docker image pull [イメージ名]の実行でタグを指定しなければ、デフォルトでlatestタグを使用します。

lesson7_3_5.png

Docker Hub公式ページ

公式に用意されているイメージにはたくさんの種類のものがありますが、それを元に開発をする際に手助けになる情報がDocker Hubの公式のイメージページに書かれていることがあります。例えば、Lesson4と5ではMySQLイメージの環境変数を設定しましたが、その情報も公式ページに詳しく記載があります。開発中に分からないことがあれば確認してみるとよいかもしれません。

docker image rm / docker rmi(イメージを削除)

新コマンド 旧コマンド 形式
docker image rm docker rmi docker image rm [イメージ名]

指定した名前のイメージを削除します。

未使用イメージの全削除を行うにはdocker image pruneを実行します。

ネットワーク

次にネットワークに関係するコマンドを見ていきます。

Lesson5のchapter3でネットワークの設定に関する学習を行いましたが、そのときに確認したように、複数のコンテナを立ち上げる際にネットワークの設定を手動で行なっていくより、Docker Composeに自動で設定を任せた方が便利でした。

よって、初心者の内は使用頻度があまり高くないと思いますが、どのようなコマンドがあるかざっと知っておくようにしましょう。

docker network helpを実行して、使用できるコマンドの一覧を表示してみましょう。

lesson7_3_6.png

ここでは、以下のものについてピックアップします。

コマンド 実行内容
docker network create ネットワークを作成
docker network ls ネットワークの一覧表示
docker network inspect ネットワークの詳細表示
docker network rm ネットワークを削除

docker network create(ネットワークを作成)

コマンド 形式
docker network create docker network create [ネットワーク名]

指定した名前でネットワークを作成します。

オプション

Lesson5のchapter3では--driver--subnetなどのオプションを使用しました。

その他にもネットワークの詳細を設定していくためのオプションが豊富にありますが、ここでは詳しくは触れないので必要になった場合、Dockerの公式ページなどで確認してみて下さい。

docker network ls

コマンド 形式
docker network ls docker network ls

ネットワークの一覧を表示します。

docker network inspect

コマンド 形式
docker network inspect docker network inspect [ネットワーク名]

指定した名前のネットワークの詳細を表示します。

docker network rm

コマンド 形式
docker network rm docker network rm [ネットワーク名]

指定した名前のネットワークを削除します。

未使用ネットワークの全削除を行うにはdocker network pruneを実行します。

ボリューム

次に、ボリュームに関係するコマンドを見ていきます。

以下でそれぞれのコマンドの整理を行なっていますが、イメージやネットワークに対するコマンドとほとんど形式が同じになっています。

そのためdockerコマンドに慣れてきた方であれば、自然に使いこなせるでしょう。

それでは、docker volume helpを実行して、使用できるコマンドの一覧を表示してみましょう。

lesson7_3_7.png
コマンド 実行内容
docker volume create ボリュームを作成
docker volume inspect ボリュームの一覧表示
docker volume ls ボリュームの一覧表示
docker volume rm ボリュームを削除

docker volume create

コマンド 形式
docker volume create docker volume create [ボリューム名]

指定した名前でボリュームを作成します。

docker volume inspect

コマンド 形式
docker volume inspect docker volume inspect [ボリューム名]

指定した名前のボリュームの詳細を表示します。

docker volume ls

コマンド 形式
docker volume ls docker volume ls

ボリュームの一覧を表示します。

docker volume rm

コマンド 形式
docker volume rm docker volume rm [ボリューム名]

指定した名前のボリュームを削除します。

未使用ボリュームの全削除を行うにはdocker volume pruneを実行します。

まとめ

以上で、イメージ・ネットワーク・ボリュームに関するコマンドの整理を終了します。

コンテナ関係のコマンドと同様に、全てのコマンドやオプションを解説しているわけではないので、helpコマンドや公式ページなどを参考に各自必要であれば調べてみて下さい。

Lesson 7 Chapter 4
docker compose

このchapterではdocker composeコマンドの整理を行います。

docker compose helpでコマンドの一覧を確認してみましょう。

lesson7_4_1.png

ここでも全てのコマンドの解説は行いませんが、基本的にはdocker containerコマンドの操作と同じように考えると分かりやすいと思います。

例えば、docker compose upで実行したコンテナを停止させたければ、docker compose stopというように、docker containerコマンドの理解があれば直感的に使用することができると思います。

以下では使用頻度の高いものに限って整理します。

コマンド 実行内容
docker compose build サービスをビルドする
docker compose up コンテナを作成し、起動する
docker compose down コンテナを停止し、削除する
docker compose stop コンテナを停止する
docker compose exec コンテナ内でコマンドを実行する

-fオプション

docker composeコマンドはデフォルトではカレントディレクトリ内のcompose.yml(docker-compose.yml)を読み込んで実行します。

しかし、-fオプションを使用することでファイルを指定することができます。

docker compose -f [compose.ymlのパス] [コマンド]という形式で使用します。

docker compose build

コマンド 形式
docker compose build docker compose build

compose.ymlに記述された設定に従って、サービスをビルドします。

元になるDockerfileやcompose.ymlでの設定を変更した場合は、このコマンドによるイメージの再構築が必要になります。

docker compose build [サービス名]という形式で、特定のサービスのみビルドを実行することもできます。設定の書き換えが一部のみの場合は積極的に利用すると良いでしょう。

docker compose up

コマンド 形式
docker compose up docker compose up

compose.ymlに記述された設定に従って、コンテナを作成し、起動します。

ネットワークやボリュームの設定なども同時に行われます。

lesson7_4_2.png docker compose up

オプション

オプション 省略形 内容
--detach -d バックグラウンドでコンテナを実行します
--build コンテナ実行前にイメージを構築します

--buildオプションをつけて実行することでdocker compose buildと同様に設定ファイルの変更の反映を行うことができます。

docker compose down

コマンド 形式
docker compose down docker compose down

docker compose upで実行されたコンテナを停止し、削除します。

また、compose.yml内で記述されたネットワークがあれば削除します。

オプション

オプション 省略形 内容
--volumes -v ボリュームの削除

-vオプションをつけて実行することで、コンテナ停止後にcompose.yml内のvolumes項目に記述されたボリュームを削除します。

docker compose stop

コマンド 形式
docker compose stop docker compose stop

実行中のコンテナを停止します。

docker compose downで停止したときと比べると、コンテナが停止状態で残っているので、docker compose startで再起動することができます。

docker compose exec

コマンド 形式
docker compose exec docker compose exec [サービス名] [コマンド]

実行中のコンテナ内で指定したコマンドを実行します。

docker container execコマンドと比べると、デフォルトで擬似端末が割り当てられているため-itオプションなしで対話操作が可能になっています。

まとめ

以上で、docker composeコマンドの整理を終了します。

docker composeコマンドに関してはここであげた5つのコマンドの使用頻度が特に高いと思いますが、他にもコマンドやオプションがあるのでhelpコマンドや公式ページを参照してみて下さい。