sagantaf

なんでも自分の思ったこと、経験したことを書いて生きます。

Docker入門〜基本コマンド一覧と使い方のカンタンなまとめ

はじめに

Dockerの基本的なコマンドの一覧とその使い方をまとめています。

Dockerイメージの操作

イメージの「取得」「作成」「表示」「タグ設定」「削除」という基本的な操作について記載しています。

イメージの取得(pull)

$ sudo docker pull nvidia/cuda
Using default tag: latest
latest: Pulling from nvidia/cuda
473ede7ed136: Pull complete
c46b5fa4d940: Pull complete
93ae3df89c92: Pull complete
6b1eed27cade: Pull complete
cb5511f09cc0: Pull complete
4173c1e5c714: Pull complete
221b05733c9e: Pull complete
564d11654322: Pull complete
Digest: sha256:2c7a92b1ca05a770addc715ed247c8235f1d9e96b8b032feaa426cd8f4c7535e
Status: Downloaded newer image for nvidia/cuda:latest

イメージの作成(Dockerfileから)

$ docker build -t test ./(Dockerfileが存在するディレクトリ)

イメージの一覧表示

$ docker images
REPOSITORY                                                             TAG                            IMAGE ID            CREATED             SIZE
nvidia/cuda                                                            latest                         1cc6f1613121        6 weeks ago         2.24GB

-hでヘルプとして使い方を確認できる。

$ docker images -h
Flag shorthand -h has been deprecated, please use --help

Usage:    docker images \[OPTIONS\] [REPOSITORY[:TAG]]

List images

Options:
  -a, --all             Show all images (default hides intermediate images)
      --digests         Show digests
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print images using a Go template
      --no-trunc        Don't truncate output
  -q, --quiet           Only show numeric IDs

イメージの詳細表示

[使い方]

 docker inspect イメージID もしくは リポジトリ名:タグ名

イメージIDは、docker images で一覧表示した時に確認できる。コマンドの実行例は以下(出力は省略しています)。

$ docker inspect 1cc6f1613121
$ docker inspect nvidia/cuda:latest


また、一部の情報のみを出力させることも可能。

[使い方]

 docker inspect --format=”{{ .詳細表示の中の項目名}}” イメージ名

--formatオプションで項目名を指定することでその情報のみを出力できる。

$ sudo docker inspect --format='{{.Created}}' nvidia/cuda:latest
2018-11-13T00:14:31.409404412Z
$ sudo docker inspect --format='{{.ID}}' nvidia/cuda:latest
sha256:1cc6f16131211806e1bebfc07a11b5a2f59d0bee5529f8743bc6211cc6658e0f

イメージのタグ設定

既存のイメージに対して、新しくつけたいイメージ名とタグを指定することで、別のイメージとして扱える。

$ sudo docker tag nvidia/cuda:latest cuda-test:0.2
$ sudo docker images
REPOSITORY                                                             TAG                            IMAGE ID            CREATED             SIZE
cuda-test                                                              0.2                            1cc6f1613121        6 weeks ago         2.24GB
nvidia/cuda                                                            latest                         1cc6f1613121        6 weeks ago         2.24GB

イメージの削除

$ sudo docker rmi nvidia/cuda:latest
Untagged: nvidia/cuda:latest
Untagged: nvidia/cuda@sha256:2c7a92b1ca05a770addc715ed247c8235f1d9e96b8b032feaa426cd8f4c7535e
$ sudo docker images
REPOSITORY                                                             TAG                            IMAGE ID            CREATED             SIZE
cuda-test                                                              0.2                            1cc6f1613121        6 weeks ago         2.24GB

上記例では、nvidia/cuda:latest のイメージを削除しているが、その後にdocker imagesを確認すると cuda-testが残っていることがわかる。 削除したイメージとリンクしているイメージがあったとしても、指定したイメージのみが削除されるため、安心できる。 ログに「Deleted」ではなく「Untagged」と出ていることからも理解できる。

Dockerコンテナの生成、起動、停止

コンテナの「表示」「生成」「起動」「停止」「削除」という基本的な使い方に加えて、ネットワークやボリュームの設定を付与して起動する方法についても記載しています。

コンテナの表示(状態確認)

起動しているコンテナを表示

$ docker ps

起動停止関係なく生成されているコンテナを表示

$ docker ps -a

生成されているコンテナのIDのみ表示

$ docker ps -aq

コンテナの生成

[使い方]

 docker create イメージID もしくは リポジトリ:タグ

$ docker create cuda-test:0.2
f28e686dc171ddeb493928f0a118c0d1c64fce58a14aa330d70c9a84915b39ad
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
f28e686dc171        cuda-test:0.2       "/bin/bash"              7 seconds ago       Created                                        kind_khorana

文字通り生成(create)するだけなので、プロセスの実行(run)はしない。STATUSがcreatedになっており、runningではないことからも判断できる。

コンテナの生成と起動

runコマンドでは上記のcreateとは異なり、コンテナの生成とプロセスの起動まで実施する。

[使い方]

 docker run -it --name=コンテナ名 コンテナイメージ名 実行したいコマンド(任意)

$ docker run -it --name="test-login" ubuntu:16.04 /bin/bash

上記の例では、bashを実行してコンテナの環境にログインできる。 オプションの意味は以下。

  • -i : コンテナの標準入出力を有効にする
  • -t:擬似ターミナルを有効にする(ttyの確保)
  • --name:コンテナに好きな名前をつける


実行したいコマンドは任意であるため指定しなくてもOK。指定しなかった場合は、Dockerfileで指定したコマンドが実行されるなど別の動きとなる。Dockerfileでもコマンドを指定していなかった場合は何も稼働しないので注意。

また、実行したいコマンドをバックグラウンドで実行するには -d オプションをつける。たとえばwebサーバなどを起動しておきたい時に使う。

$ docker run -d httpd

停止したコンテナの起動

createにて生成しただけでプロセスを起動していないコンテナなどを起動する場合に使う。

[使い方]

 docker start コンテナID もしくは コンテナ名

稼働しているコンテナの停止

[使い方]

 docker stop コンテナID もしくは コンテナ名

コンテナの削除

[使い方]

 docker rm コンテナ名 もしくは コンテナID

$ docker rm kind_khorana

コンテナの全消しする場合は以下のコマンドを実行する。

$ docker rm $(docker ps -aq)

ネットワーク関連の設定をしてコンテナ実行

docker run によってコンテナを起動する時に以下のオプションを利用してネットワークの設定を付与できる。

  • -p ホストポート:コンテナポート

  ホストとコンテナのポートを紐付けるポートフォワードの設定

  • --expose=ポート番号

  指定したコンテナポートを解放

  コンテナのhostsファイルにホスト名とIPアドレスを設定

  • --hostname=ホスト名

  コンテナ自身のホスト名を指定

  • --net=host

  コンテナがホストOSのネットワークを使う。この設定によりホストOSに接続できる端末はコンテナにもアクセスできるようになる。

設定例は以下。ホストポート8080とコンテナポート80をポートフォワードし、外部からのアクセスを通す。

$ docker run -p 8080:80 httpd

共有ディレクトリを指定してコンテナ実行

ホストとコンテナでディレクトリを共有するためには-vオプションを利用する。

[使い方]

 docker run -v ホストのディレクト:コンテナのディレクトリ イメージ名

実行例は以下。

docker run -v /home/testprod/:/home/docker_test/ ubuntu

この設定でホストの/home/testprod/以下のファイルを編集すると、コンテナの/home/docker_test/以下のファイルも更新されるようになる。ディレクトリではなくファイルを指定して共有することも可能。

そのほかの便利コマンド

稼働しているコンテナでプロセスの実行

稼働中のコンテナに対して追加のプロセスを実行したいときに使う。

[使い方]

 docker exec -it コンテナIDもしくはコンテナ名 実行したいプロセス


たとえば稼働中のコンテナにsshでアクセスしログやリソース状況を確認したい時に使える。

$ docker exec -it コンテナ名 /bin/bash

コンテナの状況を確認

[使い方]

 docker top コンテナIDもしくはコンテナ名

コンテナ名を変更

[使い方]

 docker rename 元のコンテナ名 新しいコンテナ名

コンテナ差分を確認

diffコマンドによってコンテナイメージで生成されたときと現在のコンテナの環境の差分を表示できる。

[使い方]

 docker diff コンテナIDもしくはコンテナ名

$ docker diff test_container
C /root
A /root/.bash_history
C /usr
C /usr/local
C /usr/local/etc

左側のラベルは、Aが追加(Add)、Dが削除(Delete)、Cが変更(Change)を表している。 何も差分がないときは何も表示されない。

このdiffを定期的に監視し、差分を検知したらイメージを作成する、とすれば環境の変更に対して自動でイメージ作成することができる。

生成したコンテナをイメージとして保存する

[使い方]

 docker commit コンテナIDもしくはコンテナ名 イメージ名:タグ

最後に

以上がDockerの基本的なコマンドの一覧とその使い方になります。 まだまだいろんなコマンドと使い方があり奥が深いので、他の記事を確認いただいたり、下記の参考文献を見ていただければと思います。

参考文献

Docker

Docker

  • Docker実践ガイド

Docker実践ガイド 第2版 (impress top gear)

Docker実践ガイド 第2版 (impress top gear)

  • Dockerの日本語ドキュメント

docs.docker.jp