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 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 に依存せずにイメージを共有する
Docker Hub をはじめとする Registry を利用すれば、ある開発環境で用意した Docker イメージを別の環境と容易に共有できます。何らかの事情で Registry を利用できない場合は以下の方法で Docker イメージを tar.gz 化して共有します。
$ docker save レポジトリ名:タグ名 | gzip > sample.tar.gz
別の Docker 環境に取り込むためには以下のようにします。
$ docker load < sample.tar.gz
SSH 経由で他のホストに取り込むためには以下のようにします。
docker save レポジトリ名:タグ名 | ssh -C hostname "docker load"
これによって Dockerfile およびそれが依存するファイル一式を共有するという事態を避けられます。Dockerfile を利用したビルドはそのビルドを実行した時点の yum レポジトリの状況などに依存したものになるため、Dockerfile を共有するのではなく Docker イメージを共有することが推奨されます。
コンテナへのマウント方法
2017/10/22 現在では三種類のマウント方法が利用できます。ここではそのうち二つの利用コマンドを記載します。
コンテナ外に VOLUME を作成してマウント
Docker が提供する仮想的な Volume です。Amazon EBS のようなものです。
$ docker volume create my-vol
$ docker volume ls
$ docker volume inspect my-vol
コンテナにマウントして利用します。
$ docker run -it -v my-vol:/マウント先 centos:centos6 /bin/bash
サービスを起動せず単に Volume がマウントされているコンテナとして使用する場合は running 状態になっている必要がないため create コマンドを使用してもよいです。実は run コマンドは create コマンドと start コマンドの組み合わせです。
$ docker create -it -v my-vol:/マウント先 centos:centos6 /bin/bash
不要な Volume は以下のコマンドで削除できます。
$ docker volume rm my-vol
コンテナにマウントされていない複数の Volume を一括削除するためには以下のようにします。
$ docker volume prune
ホストのディレクトリをマウント
これはその性質上 Dockerfile では使用できません。
$ docker run -d -P -v /host/dir:/container/mntdir レポジトリ名:タグ名 コマンド
読み込み専用 (readonly) でマウントするためには以下のようにします。
$ docker run -d -P -v /host/dir:/container/mntdir:ro レポジトリ名:タグ名 コマンド
マウントされているディレクトリ一覧の確認
docker inspect -f '{{json .Mounts}}' コンテナID | jq
不要なイメージやボリューム等の掃除 (docker system prune, docker system df)
docker system df
docker system prune --volumes
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all volumes not used by at least one container
- all dangling images
- all build cache
Docker Registry API
v2 バージョンであることの確認
curl -sS "https://docker.example.com/v2/"
レポジトリ一覧の取得
curl -sS "https://docker.example.com/v2/_catalog"
タグ一覧の取得
curl -sS "https://docker.example.com/v2/xxx/yyy/tags/list"
Registry からイメージを削除
name と tag の確認
curl -sS "https://docker.example.com/v2/xxx/yyy/tags/list" | jq . | grep "name"
curl -sS "https://docker.example.com/v2/xxx/yyy/tags/list" | jq .
reference の確認
curl -v -sS -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -XGET https://docker.example.com/v2/<name>/manifests/<tag> 2>&1 | grep 'docker-content-digest' | awk '{print ($3)}'
イメージの削除
curl -v -sS -XDELETE https://docker.example.com/v2/<name>/manifests/sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
netcat による docker save/load
nc を利用するとローカルネットワーク内で image を簡単に共有できます。debian の場合は -l
ではなく -l -p
です。
nc -v -l 1234 | docker load
docker save myimage:latest | nc -v 192.168.0.101 1234
関連記事
- RancherOS で構築した k8s クラスタ用に GlusterFS で簡単な分散ファイルシステムを構築k8s クラスタの各 Node マシンに GlusterFSサーバのコンテナを一つだけ起動して、簡単な分散ファイルシステムを構築します。各 Node へのコンテナ設置のためには DaemonSet が利用できそうですが、ここでは RancherOS の rancher.services を利用します。 1台構成 後に `rancher.ser
- Rancher で構築した kubernetes クラスタのアップグレード手順RancherOS 等、docker が使える何らかの OS で Rancher によって構築した kubernetes クラスタのアップグレードを行うためには、以下のようにします。 v2.1.5 の Rancher で構築した k8s クラスタに存在する脆弱性 CVE-2019-11253 への対応がなされた [v2.3.2](https://github.com
- 複数の物理ホストの Debian9 上に Kubernetes (k8s) クラスタを Rancher で立ち上げるDocker オーケストレーションツールの一つに Kubernetes (k8s) があります。k8s 実行環境の構築方法は複数ありますが、ここでは AWS や GCP 等のクラウドサービスを利用せず、Debian9 がインストールされた複数台の物理マシンがネットワーク内に存在する状況を考えます。これら複数の Debian9 上に k8s クラスタを立ち上げるためには [Ranche
- Dockerfile ベストプラクティス (仮)Dockerfile を書く際に気になるポイント集です。「Best practices for writing Dockerfiles」および「Dockerfile Reference」をもとにしています。 Dockerfil
- RancherOS による Kubernetes クラスタの構築Kubernetes クラスタを RancherOS で構築する場合の設定例を記載します。 インストール ISO ファイルをダウンロードして起動すると ros コマンドが利用できるコンソールに入ります。インストール可能なバージョン一覧はコンソール上で以下のコマンドによって確認できます。 sud