モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

工作HardwareHub ロゴ画像 (Laptop端末利用時)
工作HardwareHub ロゴ画像 (Mobile端末利用時)

Docker CLI チートシート

モーダルを閉じる

ステッカーを選択してください

モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2015/02/25
最終更新最終更新
2022/09/17
記事区分記事区分
一般公開

目次

    Dockerちょっとできる人

    0
    ステッカーを贈るとは?

    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 に依存せずにイメージを共有する

    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
    
    0
    詳細設定を開く/閉じる
    アカウント プロフィール画像 (本文下)

    Dockerちょっとできる人

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    さらに詳しく →
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      関連記事