Docker CLI チートシート
[最終更新] (2020/05/13 19:51:51)
最近の投稿
注目の記事

概要

Docker に関するコマンド逆引き集です。公式ページの「Reference documentation」情報をもとにしています。

Docker 用語について

コンテナ

後述のイメージという型をもとに作られる実体です。例えるならば、オブジェクト指向プログラミングにおけるクラスが Docker イメージで、インスタンスが Docker コンテナです。あるイメージをもとにして複数のコンテナが作成され得ります。コンテナには containerId が自動で付与されます。containerId は英数字の羅列であり人間にとって分かり良いものではありません。そこで利便性のためにコンテナ名も付与できます。明示的に付与しない場合は適当な名前が自動で付与されます。containerId はもちろん一意ですが、コンテナ名も一意である必要があります。

  • containerId の例 "bc533791f3f5"
  • コンテナ名の例 "nostalgic_morse"

イメージ

前述のコンテナという実体を作成するための型です。繰り返しになりますが、例えるならばオブジェクト指向プログラミングにおけるクラスが Docker イメージで、インスタンスが Docker コンテナです。イメージには imageId が自動で付与されます。imageId は英数字の羅列であり人間にとって分かり良いものではありません。そこで利便性のために、ある imageId のイメージには任意の個数のタグが付与できます。タグ名はコンテナ名と異なり自動で付与されることはありません。イメージは後述のレポジトリに格納されます。imageId はレポジトリ間全体で一意です。タグ名は若干制約が緩く、あるレポジトリ内で一意であれば設定可能です。

  • imageId の例 "fc77f57ad303"
  • タグ名の例 "latest", "13.10", "dev", "v2"
  • レポジトリ名の例 "ubuntu", "training/webapp"

レポジトリ

あるレポジトリには複数のバージョンのイメージ (v10, v11,...) が格納され得ります。以上のことから言える事実として「レポジトリ名:タグ名」とすればイメージが一意に定まります。もちろん「imageId」だけでも一意に定まります。あるレポジトリ内の最新のイメージには latest タグが自動で付与されます。「レポジトリ名」とだけしたときは「レポジトリ名:latest」として処理されます。レポジトリ名には「ubuntu」といった base image や root image とよばれるものと、「training/webapp」といった user image の二種類があります。

逆引きコマンド集

イメージからコンテナを作成してシェルを起動して入る

オプション -i (--interactive) および -t (--tty) を付与して起動するのがポイントです。

$ docker run -it レポジトリ名:タグ名 /bin/bash   ←例 centos:centos6

シェル内で exit したらコンテナを自動で削除するためには --rm オプションも追加しておきます。オプション -d とは併用できません。

$ docker run --rm -it レポジトリ名:タグ名 /bin/bash

コンテナ一覧を表示

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

$ docker ps

停止中のものも含めてすべてのコンテナ一覧を表示するためにはオプション -a (--all) を付与します。

$ docker ps -a

停止中のものを含むすべてのコンテナの中で最後に作成したものを表示するためにはオプション -l (--latest) を付与します。

$ docker ps -l

containerId だけを表示するためにはオプション -q (--quiet) を付与します。

$ docker ps -q

長いコマンドなどを省略せずにすべて表示するためにはオプション --no-trunc を付与します。

$ docker ps --no-trunc

イメージ一覧の表示

ホストに格納されているイメージの一覧は以下のコマンドで確認できます。

$ docker images

history によってイメージが作成される過程における RUN, ADD, CMD などの発行履歴を表示できます。

$ docker history レポジトリ名:タグ名

あるイメージに依存している子コメージの一覧を取得

for i in $(docker images -q); do
    docker history $i | grep -q xxxxxxxx && echo $i
done | sort -u

コンテナの停止および起動

コンテナを停止するには以下のようにします。

$ docker stop コンテナ名

最後に作成されたコンテナを stop したのであれば、以下のコマンド latest オプションで何も表示されないことをもって停止されたと確認できます。

$ docker ps -l

コンテナの起動には start を利用します。

$ docker start コンテナ名

コンテナの再起動も可能です。

$ docker restart コンテナ名

何らかの原因で stop できないコンテナに対しては kill を実行できます。

$ docker kill コンテナ名

コンテナ名を指定する

オプション --name を使用します。

$ docker run -d -P --name コンテナ名  レポジトリ名:タグ名  コマンド

ある containerId のコンテナ名は docker ps や以下のコマンドで確認します。

$ docker inspect -f "{{ .Name }}" containerId

後からコンテナ名を変更することもできます。

$ docker rename 旧コンテナ名  新コンテナ名

バックグラウンドで起動中のコンテナ COMMAND をフォアグラウンドに変更

オプション -d (--detach) で起動したコンテナの COMMAND はバックグラウンドで実行されます。

$ docker run -d -it centos:centos6 /bin/bash

docker start で起動したコンテナの COMMAND もバックグラウンドで実行されます。

host$ docker run -it centos:centos6 /bin/bash
container$ exit
host$ docker start containerId

バックグラウンドで実行中のコンテナ COMMAND をフォアグラウンドに変更するためには attach を利用します。コンテナを作成した際に指定した COMMAND である /bin/bash がフォアグラウンドに戻ります。

$ docker attach containerId

この方法はコンテナを作成した際に指定した COMMAND を変更するものではないことに注意してください。

$ docker run -d centos:centos6 top -b
$ docker attach containerId

例えば上記方法で attach したとしても依然として top -b が実行された状態です。/bin/bash に変更することはできません。

起動中のコンテナに COMMAND を追加で発行する

コンテナ COMMAND に関する理解を深める

イメージには COMMAND が一つだけ指定できます。例えば Dockerfile の CMD に指定されたコマンドは、その Dockerfile でビルドされたイメージの COMMAND になります。

Dockerfile

FROM centos:centos6
CMD top -b

イメージに COMMAND が設定されている場合、その COMMAND はイメージで作成されるコンテナの COMMAND になります。

$ docker build -t username/top .
$ docker run -d username/top

コンテナの COMMAND は ps によって確認できます。

$ docker ps -l
CONTAINER ID  IMAGE                 COMMAND               CREATED ...
f1237583f707  username/top:latest  "/bin/sh -c 'top -b'   6 seconds ago ...

ただし、イメージに設定された COMMAND は必ずしもコンテナの COMMAND にはなりません。run または create によってコンテナを作成する時に引数として指定したもので上書くことができるためです。

$ docker run -d username/top ping www.yahoo.co.jp
$ docker ps -l
CONTAINER ID  IMAGE                 COMMAND               CREATED ...
d8be9e3e36c3  username/top:latest  "ping www.yahoo.co.j  3 seconds ago ...

逆に、イメージに COMMAND が設定されていない場合は run または create によってコンテナを作成する時に引数として COMMAND を指定しなければエラーになります。

$ docker run -d centos:centos6
FATA[0000] Error response from daemon: No command specified

追加 COMMAND を発行

exec を使用することで、起動中のコンテナに追加の COMMAND を発行できます。

バックグラウンドでコマンドを発行

$ docker exec -d コンテナ名 touch hello.txt

フォアグラウンドでコマンドを発行

$ docker exec コンテナ名 touch hello.txt

/bin/bash コマンドを発行

$ docker exec -it コンテナ名 /bin/bash   ←SSH ではなく直接ログイン

特に最後の例は重要です。コンテナ内に sshd を立てるようなことは避けてください。コンテナには必要最小限のリソースのみを含めるべきだからです。

コンテナの状態を知る

コンテナがどの程度ホストのリソースを消費しているかを調査するためには stats を利用します。

$ docker stats コンテナ名, コンテナ名,...

コンテナ内のプロセス一覧を表示するためには top を利用します。

$ docker top コンテナ名

logs を利用するとコンテナ COMMAND がターミナルに出力する内容を表示することができます。

$ docker logs コンテナ名

Unix におけるテクニックの一つ tail -f のように監視出力するためには以下のようにします。

$ docker logs -f コンテナ名

コンテナの状態を知るための汎用コマンド docker ps でも取得できますが、特にポートマッピングの情報だけを取得したい場合は以下のようにします。

$ docker port コンテナ名  コンテナ内のポート番号

コンテナ内の各種情報を json で出力するためには inspect を利用します。オプション -f で情報のフィルタリングが可能です。

$ docker inspect コンテナ名
$ docker inspect -f '{{ .NetworkSettings.IPAddress }}' コンテナ名

ホストの状態を知る

コンテナ数やイメージ数、それらを格納しているホストのディレクトリ情報などを表示します。

$ docker info

ホストの Docker デーモンにレポートされるコンテナおよびイメージのイベントを監視するためには以下のコマンドを実行します。

$ docker events

過去のある時刻からさかのぼって表示するためには --since を利用します。引数は UNIX 時間です。

$ docker events --since=0

コンテナの削除

事故防止のため running 状態のコンテナは削除できません。事前に stop しておく必要があります。

$ docker stop コンテナ名
$ docker rm コンテナ名

オプション -f (--force) を付与すれば running 状態であっても削除できます。

$ docker rm -f コンテナ名

ホストからイメージを削除

$ docker rmi レポジトリ名:タグ名

イメージのダウンロード

イメージは必要なときになければ自動でダウンロードされます。しかしながら事前にダウンロードするためには以下のようにします。まず以下のコマンドで検索します。

$ docker search 検索ワード

以下のコマンドで実際にダウンロードします。用語集に記載したようにレポジトリには様々なバージョンのイメージが格納されています。タグ名を省略すると latest タグの付与されたイメージが取得されます。

$ docker pull レポジトリ名:タグ名

タグをイメージに付与

$ docker tag imageId レポジトリ名:新タグ名

新しいイメージを作成

コンテナに施された各種変更をコミットして新しいイメージを作成するためには commit を使用します。これは実験的にいろいろなことを試す用途で使用します。

host$ docker run -it レポジトリ名:タグ名 /bin/bash
container$ コンテナ内でいろいろなコマンドを実行 && exit
host$ docker commit -m "メッセージ" -a "AUTHOR" containerId  レポジトリ名:タグ名

最後にコミットした Author を確認

docker inspect -f "{{ .Author  }}" レポジトリ名:タグ名

作成された時刻を知る

docker inspect -f '{{ .Created }}' イメージID

本番環境で動作させるコンテナのイメージを用意する目的としては commit ではなく Dockerfile からビルドして作成したイメージを利用します。カレントディレクトリ '.' 内に Dockerfile が存在する場合は以下のコマンドでビルドします。

$ docker build -t レポジトリ名:タグ名 .

作成したイメージは Docker Hub にアップロードします。

$ docker push レポジトリ名:タグ名

ファイルシステムの変更状態を表示

diff はファイルシステムの変更状態を確認するコマンドです。commit の際に意図しない変更が含まれていないか確認できます。

$ docker diff コンテナ名
  • A: Add
  • C: Change
  • D: Deleted

コンテナをポートマッピングされた状態で作成する

コンテナ内サービスが LISTEN しているポート番号すべてについて、ホストの任意のインタフェースから転送するためには以下のように -P オプションを使用します。これは loopback interface (いわゆる localhost 127.0.0.1 が割り当てられているインタフェース) を含みます。

$ docker run -d -P レポジトリ名:タグ名  コマンド

マッピングするポート番号を明示的に指定するためには -p オプションを使用します。複数のポートをマッピングするためにはオプション -p を複数回指定します。

$ docker run -d -p ホストのポート番号:コンテナ内サービスがLISTENするポート番号  レポジトリ名:タグ名  コマンド

ホストの特定のインタフェースにだけポートを bind することもできます。例えば上述の loopback interface にだけ bind するためには以下のようにします。

$ docker run -d -p 127.0.0.1:ホストのポート番号:コンテナ内サービスがLISTENするポート番号  レポジトリ名:タグ名  コマンド

コンテナ内サービスが UDP ポートを LISTEN している場合には /udp を付与します。

$ docker run -d -p ホストのポート番号:コンテナ内サービスがLISTENするポート番号/udp  レポジトリ名:タグ名  コマンド

コンテナ間の通信路を設定する (legacy)

各コンテナは内部的なネットワークに所属しており、そのネットワークにおける IP が割り当てられています。この IP は docker inspect で調査できます。

$ docker inspect -f '{{ .NetworkSettings.IPAddress }}' コンテナ名

オプション --link によってコンテナ間の通信路を確保できます。

$ docker run -d --name コンテナ名1  レポジトリ名:タグ名  コマンド
$ docker run -d --name コンテナ名2  --link コンテナ名1:エイリアス名  レポジトリ名:タグ名  コマンド

JSON の出力情報をフィルタリングすることで確認できます。

$ docker inspect -f "{{ .HostConfig.Links }}" コンテナ名2

リンクオプション --link を付与して起動したコンテナ内では特殊な環境変数が利用できるようになります。また、環境変数に加えて /etc/hosts にリンク先のコンテナの DNS 情報が追記されます。リンク先のコンテナを再起動するなどして IP が更新されると環境変数はそのままですが /etc/hosts は自動更新されます。名前解決のためには環境変数ではなく /etc/hosts を利用することが推奨されています。

NAT ネットワークの作成

Docker container networking

docker network ls
docker network create --subnet=172.18.0.0/16 mynetwork
docker network rm mynetwork

独自に作成したネットワークでは固定 IP を指定できます

docker run --net mynetwork --ip 172.18.0.101 --entrypoint /bin/bash --rm イメージID -c "ip a"

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
23: eth0@if24: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:12:00:65 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.18.0.101/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever

コンテナ内のファイルを取得

cp によってコンテナ内のディレクトリまたはファイルをホスト側にコピーできます。

$ docker cp コンテナ名:ファイルまたはディレクトリのパス情報  ホストのパス情報

ファイルシステム毎バックアップするためには export を利用します。

$ docker export コンテナ名 > backup.tar
$ gzip backup.tar

後述の data volume は export の対象外となることに注意してください。復旧時に利用するためには以下のようにまずイメージを新規に作成します。

$ cat backup.tar.gz | docker import - レポジトリ名:タグ名

これを利用して作成されるコンテナにはバックアップ時のファイル一式がすべて含まれています。

$ docker run -it レポジトリ名:タグ名  /bin/bash

ただし、イメージとしては新規作成となるためタグ情報や docker history で確認できる履歴は失われます。イメージの共有を目的とする場合は export/import ではなく、イメージをビルドしてから後述の save/load を利用してください。

Docker イメージの差分を確認するためには以下のようにできます。

docker run --name c1 -d --rm --entrypoint="" xxxxx tail -f /dev/null
docker run --name c2 -d --rm --entrypoint="" yyyyy tail -f /dev/null
mkdir c1
docker export c1 | tar -C c1 -xvf -
mkdir c2
docker export c2 | tar -C c2 -xvf -
diff -ur c1 c2

Docker Hub に依存せずにイメージを共有する

この続きが気になる方は
関連ページ
    概要 Vagrant を用いると Docker 関連の作業がはかどります。Vagrant と Docker は相容れない関係にあるのではなく、実は親和性が高くなるように作られています。Vagrant の基本については公式ドキュメント「GETTING STARTED」などをご参照ください。また以下の内容を理解するにあたり Docker のイメージをつかむには公式サイトの
    概要 Dockerfile を書く際に気になるポイント集です。「Best practices for writing Dockerfiles」および「Dockerfile Reference」をもとにしています。 Dockerfile ポイント集 .dockerignore で不要なファイルを除外 Dockerfile をもとに build コマンドを実行すると Dockerfile の存
    概要 「Docker CLI チートシート」および「Dockerfile ベストプラクティス (仮)」でコンテナの作成方法および単体での起動方法を把握しました。これらコンテナを複数起動して連携させる、オーケストレーションを実現する方法しては Docker 社が提供する Docker Swarm だけでなく、Amazon EC2 Container Service (ECS)
    概要 データ可視化ツールの一つ Grafana の簡単な使い方を把握します。 Grafana Documentation インストール APT APT レポジトリを追加します。 sudo vim /etc/apt/sources.list.d/grafana.list deb https://packagecloud.io/grafana/stable/debian/ stretch
    概要 こちらのページで設定した k8s クラスタの各 Node マシンに GlusterFS サーバのコンテナを一つだけ起動して、簡単な分散ファイルシステムを構築します。各 Node へのコンテナ設置のためには DaemonSet が利用できそうですが、ここでは RancherOS の rancher.services
    概要 AWS Glue を利用すると Apache Spark をサーバーレスに実行できます。基本的な使い方を把握する目的で、S3 と RDS からデータを Redshift に ETL (Extract, Transform, and Load) してみます。2017/12/22 に東京リージョンでも利用できるようになりました