はじめに
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=ポート番号
指定したコンテナポートを解放
- --add-host=ホスト名:IPアドレス
コンテナの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本
- 作者: Adrian Mouat,Sky株式会社玉川竜司
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/08/17
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
- Docker実践ガイド
Docker実践ガイド 第2版 (impress top gear)
- 作者: 古賀政純
- 出版社/メーカー: インプレス
- 発売日: 2019/02/18
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
- Dockerの日本語ドキュメント