LoginSignup
3
5

【docker】dockerのキワミ

Last updated at Posted at 2023-11-04

はじめに

この記事では数年で飽きるほどコマンドを使ってみて「実際にこのコマンド重要だよね」とか「このコマンドはあまり使わない。。かも」など、いろんな体験を交えて必要なコマンドを書いていく記事です。

まずは準備体操

プロセスチェック

コンテナのプロセスをチェックするコマンドです。

docker ps

単純にpsしても良いのですが、実際には-aの方をよく使うかなと思います。

docker ps -a

レジストリからイメージを取得

nginxのイメージを取得するコマンドです。

docker pull nginx

pullするときはタグを指定してpullすることが多いです。これはDockerfileでも同様です。

保存されているイメージ一覧を表示

保存されているイメージの一覧を取得します。

docker images

dockerイメージからコンテナを起動

ポート80番でnginxを起動するコマンドです。

docker run -p 80:80 -d --rm --name nginx_web nginx

オプションがたくさんついていますが、以下のような意味があります。

  • -p
    • ポートを指定する
  • -d
    • コンテナをバックグラウンドで実行し、コンテナIDを表示
  • --rm
    • コンテナ終了時にコンテナを削除する
  • --name
    • コンテナ起動時にコンテナに名前をつける

ボリュームマウントをして起動する場合

--volumeをつけるとホストのストレージボリュームを関連付けます。

docker run -d --volume "$(pwd)":/usr/share/nginx/html -p 80:80 --rm --name nginx_web nginx

コンテナからイメージを作成

起動中のコンテナからイメージを作成します。コンテナからイメージを作成しておくと
万が一Dockerfileを消失してしまった場合でもコンテナの情報をもとにDockerfileを再構成できます。

docker commit nginx_web oreno

コンテナに対してコマンドを実行

指定したコンテナに対してコマンドを実行します。コンテナの後ろに実行するコマンドを入力します。下記の例では shを実行しています。

docker exec -it nginx_web sh

メタデータを見る

イメージおよびまたはコンテナがどのような構成になっているかを参照するコマンドです。

イメージを見る場合

docker inspect nginx

コンテナを見る場合

docker inspect nginx_web

コンテナのログを表示 (Log)

コンテナで発生したログを参照するコマンドです。コンテナのデバッグでお世話になります。

docker logs nginx_web

dockerコンテナを停止

指定されたコンテナを停止するコマンドです。

docker stop nginx_web

コンテナを削除する

コンテナIDを指定してコンテナを削除します。

docker rm {コンテナID}

イメージを削除する

イメージIDを指定してイメージを削除します。

docker rmi {イメージID}

ここからが本番

実際にはこうじゃね?って話を書いていきます。
もちろん、dockerコマンドは使いようです。

(たぶんこう)レジストリからイメージを取得

pullするときはタグもしくはダイジェストを指定します。そうでないと何を持ってきたかわかりません。

なお、latestタグについては何を持ってきているのかを把握できていれば問題ないと思います。
たとえば、ご自分で管理しているAmazon ECRにある最新のイメージを常にlatestと名付けており、イメージの修正を担当している場合はlatestでも問題ありません。

タグで指定する場合

docker pull nginx:latest

ダイジェストで指定する場合

docker pull nginx@sha256:81be38025439476d1b7303cb575df80e419fd1b3be4a639f3b3e51cf95720c7b

別の観点ではありますが、昨今ではさまざまなアーキテクチャの端末が流通しています。

すべてのdocker buildを特定のコンピュート基盤で統一している。つまりはCI/CDの工程で統一できているのであれば問題ありませんが、そうでないことがよくあります。

つまり、統一されていないのでビルドしてプッシュしたイメージがアーキテクチャレベルで異なる場合が発生するということです。よって、正常に動作しない可能性があります。

(たぶんこう)保存されているイメージ一覧を表示

何も指定せずに実行すると下記のように出力されると思います。

REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE

思うにIMAGE IDはイメージ削除などには使えるIDなので情報量がゼロとは言いませんが、常に見るものかというと見ないと思います。

また、仮に見る必要があったとしてどういうときに使うか想像するとあまり利用用途は浮かばないと思います。とくに端末に保存されているイメージを削除するときはIMAGE IDを意識する必要はありません。※理由は後で説明します。

ではどうしたら良いか。必要な部分だけを表示するようにします。
下記の例ではCSV形式でdocker imagesを表示します。

docker images --digests --format='{{.ID}},{{.Repository}},{{.Tag}},{{.Digest}},{{.Size}}'

出力結果

451bf5358040,nginx,<none>,sha256:18deb42e6d79c664b3fc231d60a44c8b017b0a61ecd288fab431b5ca63696481,182MB
81be38025439,nginx,1,sha256:565211f0ec2c97f4118c0c1b6be7f1c7775c0b3d44c2bb72bd32983a5696aa6a,192MB
81be38025439,nginx,1,sha256:86e53c4c16a6a276b204b0fd3a8143d86547c967dc8258b3d47c3a21bb68d3c6,192MB
81be38025439,nginx,latest,sha256:565211f0ec2c97f4118c0c1b6be7f1c7775c0b3d44c2bb72bd32983a5696aa6a,192MB
81be38025439,nginx,latest,sha256:86e53c4c16a6a276b204b0fd3a8143d86547c967dc8258b3d47c3a21bb68d3c6,192MB

上記の書き方はデータとして持っておく用途では有益ですが、実際には特定のdockerイメージを使って
dockerfileを作ると思います。

dockerfileの書き方について別の記事でおさらいしたいと思いますが
dockerfileのベースイメージはタグもしくはSHA256で始まるダイジェストで指定すると思います。
dockerイメージのダイジェストを表示する場合は下記のコマンドで表示できます。

docker images --digests --format='{{.Digest}}'

タグを表示する場合

docker images --format='{{.Tag}}'

Tips --filter=referenceを使って該当のイメージのみ表示

該当のイメージ名だけ取得したい場合は下記のコマンドでできます。

docker images --format='{{.Repository}}' --filter=reference='nginx'

特定のイメージだけピンポイントに取得した時に便利なコマンドです。
--filterを使うことでIMAGE IDを意識することなく、IMAGE IDを特定してイメージを操作できます。
これが前述の削除するイメージのIMAGE IDを意識する必要がない理由です。

Tips <none>となっているイメージのみ表示

中間イメージにも使われていないような不要なイメージ、Tagが<none>となっているものについて
表示したい場合は下記のコマンドが有効です。

docker images -f "dangling=true"

上記のコマンドはイメージの削除コマンドと組みわせると便利です。

(たぶんこう)イメージを削除する

まずは基本コマンドを見てみましょう。
docker rmiコマンドはイメージIDを指定して特定のイメージを削除するコマンドです。

docker rmi {イメージID}

実際のところ、「削除対象のイメージIDを見て削除」って難しいと思うんですよね。
つまりは他のコマンドと組み合わせるのが良いのではないかなと思います。

下記のコマンドは中間イメージにも使われていないような不要なイメージ
Tagが<none>となっているものだけ削除するコマンドです。

docker rmi -f `docker images -f "dangling=true" -q`

ちなみに保存したイメージをすべて削除するときは下記のコマンドは有効です。

docker rmi -f `docker images -q`

Tips prunermiの違い

下記のコマンドは24時間以内に使っていないイメージを削除します。

docker image prune -a --force --filter "until=24h"

docker rmiも同じイメージを削除するコマンドですが、何が違うのでしょうか。
結論を述べると削除するという文脈で言えば同じコマンドです。

ですが、pruneの場合は不要なものを削除するというところにフォーカスしてします。

(たぶんこう)コンテナを削除する

まずは基本コマンドを見てみましょう。docker rmコマンドはコンテナIDを指定して特定のコンテナを削除するコマンドです。

docker rm {コンテナID}

実際のところ、「削除対象のコンテナIDを見て削除」というのは煩雑だと思います。

そこでdocker rmコマンドはdocker psコマンドと組み合わせて利用するのがベストだと考えています。

下記の例はすべてのコンテナを削除するコマンドです。

docker rm -f $(docker ps -a -q)

停止済みのコンテナだけ削除したい場合は下記のコマンドが有効です。

docker rm $(docker ps -a -q --filter "status=exited")

削除した後に実行されているコンテナがないかを確認したいので上記のコマンドを一工夫すると下記の通りになります。

docker rm $(docker ps -a -q --filter "status=exited") && docker ps -a

コンテナIDではなく、コンテナ名で対応できるとやりやすいのかなと思います。

Docker環境の掃除

まずは現状を確認します。

docker system df

Images,Containers,Local Volumes,Build Cacheの4つの状態が表示されます。
それぞれイメージの容量、コンテナの容量、コンテナのボリューム容量、ビルド時に利用するキャッシュが表示されます。

これらの中で不要となるデータを掃除する場合は下記のコマンドを使いましょう。

docker system prune

まとめ

今回は改めてDockerの使い方を振り返りました。
よくよく考えてみるとdocker imagesdocker psなどイメージやコンテナの情報を表示するコマンドをうまく使うと
他のコマンドの味も出るのかなと思うところです。

Docker環境の情報を出力してどこかに保存しておきたいなどの要件があれば、docker imagesdocker psの使い方、とくにオプションを使えるようにしておきましょう。

今回はビルドコマンドについて細かくみてこなかったため、次はDockerfileの書き方と一緒に見ていきたいと思います。

参考

おわり

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5