Dockerをしばらく使用している場合は、お気に入りのDockerコマンド(技術的に正しいサブコマンド)を含む、シンプルで効果的なワークフローがすでに用意されているはずです。
たとえば、 docker container rm $(docker container ps -qf status =exited)
のような長いコマンドを使用して、実行されていないコンテナーを削除していました。 、それは機能し、ぶら下がっているコンテナがない場合は明らかにエラーをスローしました。ある日、 prune
もあることがわかったときにこれは止まりました コンテナのサブコマンド!これで、長いコマンドは単純な<code> docker container pruneになりました。 。
重要なのは、私たちの多くがDockerをしばらく使用しているにもかかわらず、いくつかのことが見落とされたり、時間の経過とともに忘れられたりする可能性があるということです。
この記事では、3つのdockerサブコマンドを紹介します。これは、初めての場合もあれば、あまり使用していない場合もありますが、そうすべきだと思います。
これらのサブコマンドには、独自のサブコマンドが含まれる場合もあります。
1。システムサブコマンド
Dockerにはシステム
があります いくつかを与えるコマンド Dockerに関連するシステムレベルの情報。あなたは実際にしばらくの間そのサブコマンドの1つを使用しています。 docker info
を覚えておいてください ?このコマンドは実際にはdockersystem info
。
このサブコマンドとその機能について詳しくは、-help
を実行してください。 その上のオプション。
➟ docker system --help
Usage: docker system COMMAND
Manage Docker
Commands:
df Show docker disk usage
events Get real time events from the server
info Display system-wide information
prune Remove unused data
Run 'docker system COMMAND --help' for more information on a command.
これらのサブコマンドはすべて非常に重要だと思うので、それぞれを見ていきましょう。
サーバーのディスクスペースがほぼいっぱいになっているように見える状況になったことはありますか?それがコンテナ(実行中/ボリューム)であるかどうかを調べるには、おそらく du
を使用しています。 データルートで直接コマンドを実行します。
du
を使用する データルートにはsudo
が必要です アクセス。
✗ du -h --max-depth=1 /var/lib/docker
du: cannot read directory '/var/lib/docker': Permission denied
4.0K /var/lib/docker
それだけでなく、ボリュームまたはイメージが割り当てられている量を明示的に知るには、コマンドを数回実行する必要があります。
➟ sudo du -h --max-depth=0 /var/lib/docker/volumes && \
sudo du -h --max-depth=0 /var/lib/docker/image && \
sudo du -h --max-depth=0 /var/lib/docker/
より良い代替手段は、 docker system df
を呼び出すことです。 指図。これにより、データルートが自動的に検出され、Dockerコンテナ、イメージ、ボリュームによるディスク使用量に関するすべての情報が出力されます。
これが私の現在のシステムが示しているものです(これは新規インストールです)
➟ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 10 1 84.17MB 84.17MB (100%)
Containers 1 1 8.219MB 0B (0%)
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B
(1)すべての未使用のネットワーク、(2)ぶら下がっているイメージ、(3)停止したコンテナー、(4)すべての未使用のボリュームを削除したい場合は、使用した可能性が高いか、4つの別々のコマンドを使用して仕事。
docker network prune && \
docker image prune && \
docker volume prune && \
docker container prune
container prune
について以前に知らなかった場合 私のように、コマンドはさらに大きくなります。幸運なことに、これはすべて、 docker system prune --volumes
という単純なコマンドを使用して実行できます。 。
デフォルトでは、 docker system prune
ボリュームは削除されません。そのため、-volumes
を使用する必要があります。 オプション。このコマンドはさらに、ビルドキャッシュもクリアします。
-f
を使用できます (時々)迷惑なプロンプトを回避するためのオプション。以下の例を参照してください:
➟ docker system prune --volumes -f
Deleted Containers:
672d39c1a78969887f411ce9139e74e5b21c31fccf2bcf8c1190a9e166089ede
Deleted Networks:
Example
SSHnet
Dummy
Deleted Volumes:
dummy
Total reclaimed space: 0B
その他のオプションには、 -a
が含まれます ぶら下がっている画像だけでなく、未使用の画像もすべて削除されます。
このコマンドは常に役立つとは限りませんが、誰もが知っておくべきことだと思います。
dockerシステムイベント
またはdockerevents
略して、dockerデーモン( dockerd
)のリアルタイムイベントを直接提供します )。これは、たとえば、画像が削除されたときなどの特定のイベントを監視するのに役立ちます。
これをよりよく理解するには、以下のスクリーンショットを参照してください。
2。コンテキストサブコマンド
これは、私が知る限り、多くの人が気付いていないもう1つの美しいサブコマンドです。 Dockerコマンドの実行のコンテキストは、いくつかのキーと値のペアです。これには、エンドポイント、ホスト、場合によっては構成ファイルなどが含まれますが、これらに限定されません。
コンテキストを作成したら、後で再利用できます。
特に私にとって最大の実用的なユースケースの1つは、Dockerを実行している個々のサーバーに対して個別のコンテキストを作成することです。私の仕事のほとんどはそれを中心に展開しているので、毎回サーバーにログインする代わりに、SSH経由でdockerサーバーを削除するローカルクライアントを使用します。
Dockerデーモンへのリモートアクセスを設定する方法[詳細ガイド]リモートサーバーにSSHで接続してから、dockerコマンドを実行したくないですか?他の利点もあるリモートDockerアクセスを設定できます。 Linux HandbookDebdut ChakrabortyDockerコンテキストでこれを実現する方法を紹介します。
まず、Dockerを実行しているサーバーをLinodeにデプロイします。コンテキストなしでリモートDockerデーモンにアクセスする場合は、次のようなコマンドを使用します
➟ docker --host ssh://[email protected]:7770 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb4fa8390ab7 jrcs/letsencrypt-nginx-proxy-companion "/bin/bash /app/entr…" 2 hours ago Up 2 hours reverse-proxy_letsencrypt_1
ccdda507facb jwilder/nginx-proxy "/app/docker-entrypo…" 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp reverse-proxy_reverse_proxy_1
したがって、リモートデーモンにアクセスするには、 docker
のエイリアスを作成する必要があります。 docker --host ssh://[email protected]:7770
へ 、または環境変数 DOCKER_HOST
を使用します 。しかし、これらは他のホストへの切り替えを非常に困難にします。より簡単な代替手段は、コンテキストを作成することです。
次のコマンドは、 remote
という名前のコンテキストを作成します 、ローカルとは異なるホストを持つDockerエンドポイントの場合。
docker context create remote --description "Remote docker server" --docker "host=ssh://[email protected]:7770"
出力は次のようになります:
➟ docker context create remote --description "Remote docker server" --docker "host=ssh://[email protected]:7770"
remote
Successfully created context "remote"
これで、 -c
を使用できます docker
のオプション 何かをすばやくチェックしたり、繰り返し操作したりする場合は、コンテキストをこの新しいコンテキストに変更してください。
-c
を使用 オプション:
➟ docker -c remote ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb4fa8390ab7 jrcs/letsencrypt-nginx-proxy-companion "/bin/bash /app/entr…" 2 hours ago Up 2 hours reverse-proxy_letsencrypt_1
ccdda507facb jwilder/nginx-proxy "/app/docker-entrypo…" 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp reverse-proxy_reverse_proxy_1
docker contextでは、[CONTEXT_NAME]
を使用します :
➟ docker context use remote
remote
Current context is now "remote"
~
➟ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb4fa8390ab7 jrcs/letsencrypt-nginx-proxy-companion "/bin/bash /app/entr…" 2 hours ago Up 2 hours reverse-proxy_letsencrypt_1
ccdda507facb jwilder/nginx-proxy "/app/docker-entrypo…" 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp reverse-proxy_reverse_proxy_1
コンテキストから抜け出すには、 use
を使用します default
のサブコマンド コンテキスト名の場合:
➟ docker context use default
default
Current context is now "default"
~
➟ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3。一時停止と一時停止解除のサブコマンド
現在、大規模な展開(アプリケーション)は、マイクロサービスとしてよく知られている複数のコンポーネントに分割されています。 docker-composeのようなものを使用してそれらをデプロイすると、依存するコンポーネントの前に1つのコンポーネントが起動することがあります。依存関係(または複数の依存関係)がまだ開始されていないため、このコンポーネントは開始に失敗するため、これは問題です。
Dockerで再起動ポリシーを使用することでこの問題を軽減できますが、失敗した試行でログがフラッディングするのを防ぐことはできません。私が最初に行っていたのは、依存関係が完全に開始されるまでコンテナ/サービスを停止することでした。
より良い方法は、コンテナをしばらく一時停止することです。必要なサービスが正常に起動したら、コンテナの一時停止を解除すると、そこからすべてが正常に進みます。
コンテナは高速で起動しますが、これはそのような問題に対処するためのさらに高速な方法です。
pause
の構文 およびunpause
とてもシンプルです。
docker pause [CONTAINER_NAME|ID]
docker unpause [CONTAINER_NAME|ID]
これで、今のところこの記事は終わりです。そのようなコマンドが有用または興味深いものであることがわかった場合は、それに応じてこの記事を更新します。
このリストに含めるべきだと思うDockerコマンドはありますか?下のコメントで知らせてください。