1. ホーム
  2. ドッカー

Docker共通コマンド

2022-03-03 10:13:38
<パス

記事目次


私自身は、Dockerのイメージは私たちのJavaのClassのようなもので、コンテナはこのイメージを基に構築されたインスタンスであり、私たちのJavaがCLassに従って構築されたインスタンスオブジェクトであるのと同様だと理解していますが、私は初心者なので間違いがあれば許してください、また、お互いに学ぶためにあなたの意見を聞かせてください...

私の理解では、要するに

docker image: ---- class in java

docker container: ---- class new out of the instance object in java


(i) dockerの基本コマンド

dockerの起動

systemctl start docker


dockerをシャットダウンする

systemctl stop docker


dockerを再起動する

systemctl restart docker


サービスが開始されると同時にドッカーも起動するように設定されている

systemctl enable docker


dockerの実行状況を見る

------ 実行中であれば、コマンドを入力したときに緑色のアクティブが表示されます。

systemctl status docker


dockerのバージョン番号情報を見る

docker version

docker info


docker --help


<イグ

ドッカーヘルプコマンド

コマンドを忘れたときに確認するために使用します。

docker pull --help


たとえば、pullコマンドを忘れてしまって、どんな引数を取ればいいのかわからないときは、次のように使うことができます。

docker images


<イグ

(ii) docker イメージコマンド

サーバー上のdockerイメージの一覧を表示する

docker search mirror name
docker search --filter=STARS=9000 mysql Search for mysql mirrors with STARS >9000


画像の検索

docker pull mirror name 
docker pull mirror name:tag


<イグ

プルミラーリング タグなし(バージョン番号)の場合、Docker リポジトリにあるイメージの最新バージョンを取得します latest with :tag 指定されたバージョンを取得します

docker run image name
docker run image name:Tag


mysql の最新バージョンを取得する

別のイメージを特定のバージョン番号で引っ張ってみましょう。バージョン番号に関しては、docker hubで確認することができます

ドッカー公式画像検索

例えば、mysql 5.7.30を引っ張る ------------------ ここに出てくるちょっとしたことで、かなり新しいと感じることがあります。もっと学ぶために、戻ってそれらを見てください。

なぜファイルが存在するのか >>>突いてください。 dockerファイルの階層化とデータボリュームのマウント

実行イメージ ---- tomcatを引っ張ってきて試してみましょう。

docker pull tomcat

docker run tomcat


ex.

Ctrl+C

<イグ

実行すると、デフォルトのポート8080がtomcatで使用され、画像がすでに起動していることがわかりましたが、サーバーにマウスが戻っていないようなので、どうしたらいいでしょうか。

使用方法 #delete a docker rmi -f mirror name/mirror ID #delete multiple mirror IDs or mirrors separated by spaces docker rmi -f mirror name/mirror ID mirror name/mirror ID mirror name/mirror ID #delete all mirrors -a means show all, -q means show only IDs docker rmi -f $(docker images -aq) ( 注:この方法はコンテナを終了させることができますが、このコマンドは間違っています、詳細は以下のコンテナコマンドをご覧ください )

docker の run コマンドは、持続的な実行、ポートのマッピング、コンテナエイリアスの設定、データボリュームのマウントなど、非常に複雑なものです。


簡単なテストでは、今すぐ必要でもないミラーをたくさん引っ張ってきたことが分かりました。これらの無駄なミラーを削除するにはどうしたらよいでしょうか?

ミラーの削除 ------ 現在のミラーがどのコンテナによっても使用されていない場合、削除することができます。

docker image rm image name/image ID


画像の強制削除

docker save image name/mirror ID -o where to save the image with the name


イメージ用の基本コマンドは以上です。以下、より複雑な docker run コマンドを使用して、イメージに基づくコンテナを起動します。

画像の保存
転送と保存を簡単にするために、私たちのイメージを tarball として保存します。そうすれば、docker がインストールされている任意のサーバーでイメージを読み込むことができます。

コマンドを実行します。

docker save tomcat -o /myimg.tar


の例です。

docker load -i image save file location


<イグ

画像の保存タスクが完了したので、指定した場所にtarがあるかどうか見てみましょう。

ミラーを読み込む
dockerがインストールされている場所ならどこでも、イメージ保存ファイルを読み込んでイメージとして復元することができます

docker ps


<イグ

ファイルのロード ミラーへのリストア

ビューミラーリング ミラーリング機能が適切に動作するかどうかのテスト

解凍したイメージを実行してみましょう。

(iii)ドッカーコンテナコマンド

冒頭で述べたように、ドッカーコンテナはjavaの新しいオブジェクトのようなものであり(docker run imageはイメージの特定のコンテナインスタンスを生成する)、ドッカーコンテナの起動にはイメージのサポートが必要である

まずはdocker container viewコマンドを実行してみましょう

実行中のコンテナの一覧を表示する

docker ps -a


すべてのコンテナを表示する ----- 実行中と停止中を含む

# -it means start interactively with the container -d means you can run the container in the background (daemonically) --name name of the container to run /bin/bash Interactive path
docker run -it -d --name alias to take image name:Tag /bin/bash 


コンテナはどのように入手するのですか?コンテナインスタンスを構築するには、以下のイメージを実行します。

コンテナの実行

#1. pull the redis image
docker pull redis:5.0.5
#2. Start the command
docker run -it -d --name redis001 redis:5.0.5 /bin/bash


#3. View running containers
docker ps


例えば、redisを起動し、redis001というエイリアスを付けて対話的に実行したい場合、必要なコマンドは - ここではバージョン5.0.5を指定しています。

# netstat is a console command that is a very useful tool for monitoring TCP/IP networks, showing the routing table, the actual network connections, and the status of each network interface device
netstat -untlp


<イグ
container port mapping

<イグ

redisは6379番ポートを使っているようですが、ファイアウォールをオフにしても、セキュリティグループをオンにしてもアクセスできるのでしょうか?

その違いを見分けるために、linuxのコマンドで見てみましょう。

# Stop our previously running redis container first 
docker stop container name/container ID


<イグ

**Surprised to find that the port 6379 netstat occupied by our redis container startup is not showing up? どうなってるんだ?redis desktop mangerの接続でテストしてみましょう **。

なぜうまくいかないのでしょうか?dockerのredisコンテナはすでに起動しており、6379番ポートを占有していることが確認されているのですが?

なぜなら、6379番ポートはコンテナ自体の内部ポートであり、ホストの6379番ポートには接続されていないため、ホストのIp:6379を通してredisサンプルにアクセスしても、見つけることができないからです

ここで、Dockerコンテナについての知識を少し追加します

各Dockerコンテナは、独立した安全なアプリケーションプラットフォームです(各Dockerコンテナは、私たちのサーバー上のリソースを取り、それ自身の空間(サーバーとも理解できます)を開くことと同等であると理解できます)

これはDockerの大きな特徴で、各コンテナ間で環境が分離されるのです!!!!

docker イメージを使用して、1 台のサーバーで N 個の mysql インスタンスを実行することもできます(ただし、デフォルトのポートはすべて同じですが、それでもコンテナ間では環境が分離されます)。コンテナAの3306とコンテナBの3306は同じ世界ではないので、何の関係もない!)

デフォルトでは、ホスト(Dockerがインストールされているサーバー)のポートから直接コンテナにアクセスすることはできません。なぜなら、Dockerコンテナはホストポートに接続しないポートで独自の空間を開くからです。

外部からコンテナにアクセスする場合、コンテナ内のポートをホストポートにバインドする必要があります。 #delete a container docker rm -f container name/container ID #Delete multiple containers Separate the container names or container IDs to be deleted with a space docker rm -f container name/container ID container name/container ID container name/container ID # Delete all containers docker rm -f $(docker ps -aq)

ポートマッピングを使えば、ホストのポートとコンテナのポートを結びつけることができる。例えば、ホストポート6379をコンテナredis6379にバインドすると、ホストIp:6379にアクセスすることでコンテナにアクセスすることができるようになります!

次に、次のようにします。 コンテナポートマッピング デモ

はじめに コンテナを停止する

-p host port:container port


<イグ

次に コンテナを削除する ----- そして、たくさんのコンテナを実行したことに気づき、それらを整理することにします。

docker run -itd --name redis002 -p 8888:6379 redis:5.0.5 /bin/bash


<イグ

これでコンテナは削除されたので、先程のポートマッピングに移りましょう

コンテナポートとサーバーポートのマッピング

コマンドを実行します。

docker exec -it container name/container ID /bin/bash

#Go to the previous redis001 container   
docker exec -it redis001 /bin/bash


先ほどのredisイメージのまま、ポート6379をサーバーの8888にマッピングしてみて、うまくいったら、サーバーのポート8888にアクセスして、dockerのコンテナredis002にアクセスします。

-コンテナ内のポート6379をドッカーホスト(ドッカーがインストールされているサーバー)のポート8888にマッピングすれば、外部からホストのポート8888にアクセスすることで、ドッカーコンテナのポート8888にアクセスできるようになります。

docker attach container name/container ID


<イグ

実行後、サーバーのポート8888がdocker-proxyで占拠されていることがわかりました。

では、コンテナのポートマッピングには何か制約があるのでしょうか?

そうですね、各コンテナ間では、環境は隔離されていますが、ホストはポートごとに1つで、ポート8888はredis002コンテナが束縛し、他のすべてのコンテナはポート8888を使用できません!!!!


コンテナの内部に入り、その設定ファイルを変更する必要がある場合がありますが、どのようにすれば内部に入ることができるのでしょうか?

コンテナに入る方法1 ここで前回のredis001のコンテナに移動します

#----- exit directly without -d (persistent running container) Execute this parameter and the container will be closed  
exit

# Elegantly proposed --- the container will not be closed with or without the -d parameter
Ctrl + p + q


<イグ

ご覧の通り、ホストの aliyleileilei から /data に対応するコンテナ ID にジャンプし、すでにコンテナの中に入っています。

コンテナへの入り方2 -exec方式を推奨

docker stop container id/container name


コンテナから出るには?

コンテナから自分のサーバに抜ける 2つのexitコマンドの違いに注意してください

docker restart container id/container name


docker start container id/container name


コンテナを停止する

docker kill container ID/container name


コンテナを再起動する

#docker cp container id/name:file path path to copy to outside | path to copy to outside container id/name:file path
#copy from inside the container
docker cp container id/name: path inside container path outside container
#Copy the file from outside to inside the container
docker cp path outside container container ID/name: path inside container



コンテナを起動する

docker logs -f --tail=How many lines to see at the end Default all Container ID


キルコンテナ

--restart=always

コンテナファイルのコピー -コンテナが開いているかどうかに関わらずコピー可能

docker run -itd --name redis002 -p 8888:6379 --restart=always redis:5.0.5 /bin/bash


コンテナログの表示

-v host file storage location: file location in container


<イグ

我々はメンテナンスを実行しているとき、我々は通常、テスト環境のサーバーの再起動は、O&amp;Mの時間コストの多くを保存できるように、mysql、redisなど、から起動するいくつかのソフトウェアを設定したい、我々はドッカーコンテナであれば、またコンテナから起動を設定することができます?

答えは、OKKKKK!

コンテナの起動時に、docker runコマンドでパラメータを追加します。 -v host file storage location:container file location -v host file storage location:container file location -v host file storage location:container file location dockerサービスの開始時にコンテナが自動的に開始されることを示すためです。

の例です。

# Run a docker redis container, port mapping, two data volume mounts, set up a bootstrap
docker run -d -p 6379:6379 --name redis505 --restart=always -v /var/lib/redis/data/:/data -v /var/lib/redis/conf/:/usr/local/etc/redis/redis. conf redis:5.0.5 --requirepass "password"


今回、私の友人の一部は、私は長い間、コンテナを起動し、多くのデータを実行している、今だけ私は自己起動を設定することができると言うのですか?コンテナを削除して、もう一度起動したら、データはどうなるのでしょうか?

おっとっと! 少年汁、この際慌てないで!2つの方法をお伝えします。

方法1:データの消失が心配ということは、コンテナを実行する際にデータマウントを行わなかったということですよね?

データマウントとは何かというと

簡単に言うと、コンテナ内のデータは外部のホストファイルにバインドされており、二重の永続性に似ています。コンテナを削除しても、ホストファイルのデータディレクトリは残っているので、次にコンテナを起動するときは、データディレクトリをホストデータの場所に向けるだけで回復できます!

詳細はこちらをご覧ください。 ドッカーファイル階層化およびデータボリュームマウント

コマンドを実行します。

docker update --restart=always containerId or containerName

or

docker container update --restart=always containerId or container name


v コマンドは複数回使用できます。つまり、コンテナは複数のファイルを同時にマウントできます。

docker rename container ID/container name new container name


docker commit -m="commit message" -a="author message" container name/container ID name of the committed image:Tag


このメソッドで言葉が出ない?では、まだコンテナを削除する必要があるのですか?はい!そうです。そうなんです! 次に、なぜあなたは、データ復旧のニーズを持っており、データの永続性、データ復旧のバックアップ、データボリュームのマウントを考えなかったのでしょうか?独自のDEMOの損失は、以下のバックル脳よりタッチ魚の通常の開発のためのものです

方法2:コンテナを削除したくないが、ブートするように設定したい場合、そのブート構成を変更します!コンテナのブート構成を変更するには、次のようにします。

コマンドを実行します。

docker pull tomcat

docker run -itd -p8080:8080 --name tom tomcat /bin/bash


上記のように、コンテナを削除せずに自己起動要件を満たすように設定されていますが、危険かどうかは別として、このコンテナにデータ復旧の必要性はあるのでしょうか?ご自身で検討してみてください

コンテナ名の変更

コンテナにクールでカッコイイ名前を付けたい?

docker commit -a="leilei" -m="First time packing image, will it still 404 when you access it directly after packing" 231f2eae6896 tom:1.0


ex:

(iv) 自分でミラーを提出する

実行中のコンテナがイメージに変更を加えている可能性があり、それを保存して更新されたイメージにラップしたい場合があるので、コミットコマンドを使って新しいイメージを構築する必要があるのです

docker run -d -it -p6500:8080 --name lei tom:1.0 /bin/bash


tomcat イメージを取得し、それを永続化し、ホストとのポートマッピングを設定します。

docker: write /var/lib/docker/tmp/GetImageBlob325372670: no space left on device

これは、Aliyunのイメージを設定した後、取り出したイメージは最も基本的なもので、コンテナに必要なデータしか入っていないからです。例えば、vim vi ll コマンドは、コンテナには存在しません。

webappsの下にファイルがないので、404が表示されることは間違いありません。

webapps.distの下にファイルがあることがわかったので、それをコピーし、訪問後に新しい画像にパッケージして、404ページでなくホームページに飛ぶかどうか確認します。

exit コンテナを終了する

コミットコマンドを使用して、実行中の tomcat コンテナを新しいイメージとして、tom Tag 1.0 という名前でパッケージ化します。

sudo docker info | grep "Docker Root Dir"


<イグ
区別するために、前の tomcat コンテナを停止して削除してみましょう。

次に、私たち自身のパッケージイメージ tom:1.0 を実行します。

コンテナ名をleiとし、ポートを6500:8080にマッピングします。

du -hs /var/lib/docker/ 


<イグ

6500 番ポートにアクセスすると、tomcat のホームページが表示され、イメージのコミットに成功したことになります。

(v)ドッカー操作コマンド

時々、このようなエラーが発生することがあります。

docker system df

このエラーは、Dockerが書き込み時にデバイスに空き容量がないことを報告した場合に発生します。

dockerの作業ディレクトリを表示する

# Delete exceptionally stopped containers
docker rm `docker ps -a | grep Exited | awk '{print $1}'` 
 
# Delete mirrors with name or label of none
docker rmi -f `docker images | grep '
' | awk '{print $3}'`

<イグ

docker 全体のディスクフットプリントを表示する

docker system prune -a


Dockerのディスク使用量の明細を見る

find / -type f -size +100M -print0 | xargs -0 du -h | sort -nr


<イグ

無駄なコンテナやミラーの削除

find / -type f -size +100M -print0 | xargs -0 du -h | sort -nr |grep '/var/lib/docker/overlay2/*'


コンテナで使用されていないミラーをすべて消去します。

このコマンドは、使用中のコンテナがない(コンテナが正常に動作している)限り、一時的に停止しているコンテナを含め、すべてのミラーを削除することに注意してください。

docker system prune -a


大容量ファイルの検索

find / -type f -size +100M -print0 | xargs -0 du -h | sort -nr


<イグ

指定されたdocker usageディレクトリにある指定サイズより大きなファイルを検索します。

find / -type f -size +100M -print0 | xargs -0 du -h | sort -nr |grep '/var/lib/docker/overlay2/*'


例:/var/lib/docker/overlay2/*で始まるファイルで、100m以上のものを探しています。