Docker チュートリアル: コンテナの使用 (簡単な例)

Docker チュートリアル: コンテナの使用 (簡単な例)

Docker を初めて使用する場合は、コンテナの管理を始めるために習得する必要がある基本的なコマンドをいくつか確認してください。

Docker はソフトウェア開発ライフサイクルに大きな影響を与え、大規模なソフトウェアの展開をシンプルかつ安全なものにしました。このチュートリアルでは、Docker コンテナの実行、起動、停止、削除の基本について説明します。

Docker を使用すると、同じホスト上の異なるオペレーティング システムで異なるプログラミング言語を簡単に使用できるようになります。

Docker の背後でソフトウェアを展開することがはるかに簡単になり、システム構成や前提条件を見落とす心配がなくなります。

Docker と仮想マシン

仮想化を使用してソフトウェアを実行している場合、代わりに Docker が必要になるのはなぜですか?

両者の主な違いは、Docker はネイティブ オペレーティング システム内で実行される別のプロセスであるのに対し、VM はホスト オペレーティング システム上で実行される完全に分離されたオペレーティング システムであり、読み込みに時間がかかることです。そのため、Docker には仮想マシンよりも次のような利点があります。

  • 読み込み速度は仮想マシンとは異なり、必要なハードウェア リソースはごくわずかです。
  • 同じオペレーティング システム上で複数の Docker コンテナを同時に実行します。
  • コンテナを変更してデプロイしたり、Docker ファイルの定義を友人に渡して同じ環境で作業させたりすることができます。

実際、Docker は仮想マシンの代替ではなく、特定の問題を解決します。

アプリケーションが異なるオペレーティング システムで実行される 3 つ以上のサービスを必要とする場合、同じホスト上で 3 つの仮想マシンを実行する代わりに、同じホスト上で 3 つのコンテナーをスムーズに実行できます。素晴らしいですね!

コンテナを実行する

始める前に、Docker が適切にインストールされ、コマンドを受け入れる準備ができていることを確認してください。新しいターミナル ウィンドウに次のコマンドを入力します。

$ docker -v

上記のコマンドは、PC にインストールされている Docker のバージョンを出力します。

Docker version 17.12.0-ce-rc2, build f9cde63

コンテナの実行を開始します。

$ docker container run alpine echo "Hello World"

上記のコマンドを初めて実行すると、ターミナル ウィンドウに次のような出力が表示されます。

それは簡単ですよね?同じコマンドをもう一度実行してみてください:

$ docker container run alpine echo "Hello World"

上記のコマンドを 2 回目、3 回目、または n 回目に実行すると、ターミナルに次の出力が表示されます。

Hello World

コンテナを正常に実行できたので、次は何が起こったのかを分析します。次のコマンドを参照してください。

$ docker container run alpine echo "Hello World"

このコマンドはいくつかの部分で構成されています。まず、「docker」という言葉があります。これは、コンテナの実行を担当する Docker エンジンと対話するために使用される Docker コマンドライン インターフェイス (CLI) の名前です。

次に、「コンテナ」という単語があります。これは、作業しているコンテキストを示します。

次のステップは、実際にコマンド run を実行することです。

ここで、どのコンテナを実行するかを Docker に伝える必要があります。ここでは、アルパインコンテナが動作しています。

最後に、コンテナの実行時にコンテナ内で実行されるプロセスまたはタスクのタイプを定義する必要があります。これはコマンドの最後の部分で、echo "Hello World" です。

コンテナ内でプロセスを実行する

コンテナを実行するコマンドの各部分を理解できたので、別のコンテナで別のプロセスを実行してみましょう。
$ docker container run centos ping -c 5 127.0.0.1

出力は次のようになります。

上記の例では、使用されているコンテナ イメージは CentOS であり、CentOS コンテナ内で実行されるプロセスは ping -c 5 127.0.0.1 であり、ループバック アドレスが停止するまで 5 回 ping を実行します。

最初の行は次のとおりです。

Unable to find image 'centos:latest' locally

これは、Docker がシステムのローカル キャッシュ内に centos:latest というイメージを見つけられなかったことを示しています。したがって、Docker は、コンテナが保存されているイメージ リポジトリからイメージをプルする必要があることを認識します。

デフォルトでは、Docker 環境は hub.docker.com の Docker Hub からイメージをプルするように構成されています。これは 2 行目で次のように表されます。

latest: Pulling from library/centos

次の 3 行の出力は次のとおりです。

85432449fd0f: Pull completeDigest: sha256:3b1a65e9a05...Status:

これは、Docker が Docker Hub からイメージ centos:latest を正常にプルしたことを示しています。

後続の出力は、コンテナ内で実行されているプロセス (この場合は ping ツール) によって生成されます。

また、「latest」というキーワードが数回出現していることに気付くかもしれません。各イメージにはバージョン (タグとも呼ばれます) があり、バージョンが明示的に指定されていない場合、Docker は自動的に最新バージョンであると想定します。

システム上でこのコンテナを再度実行すると、Docker がコンテナ イメージをローカルにキャッシュしているため、最初にダウンロードする必要がないため、前の 5 行は出力されません。これが事実かどうか確認してみてください。

ランダム参照コンテナを実行する

ランダム ステートメント コンテナーを実行するには、ランダム ステートメントを生成するアルゴリズムが必要です。これらのランダムなステートメントを生成するためのAPIはここにあります[1]。
ここでの目標は、コンテナ内で 5 秒ごとにランダムなステートメントを生成し、それを STDOUT に出力するプロセスを実行することです。


スクリプトを停止するには、Ctrl+C を押します。出力は次のようになります。


各応答は、引用、著者、およびそのカテゴリを含む JSON 形式の文字列です。
それでは、このコンテナをバックグラウンドで実行してみましょう。これを行うには、前のスクリプトを 1 行に縮小し、/bin/sh -c "..." を使用して実行する必要があります。 Docker の表現は次のとおりです。

$ docker コンテナ実行 -d --name quotes alpine \ /bin/sh -c "while :; do wget -qO- https://talaikis.com/api/quotes/random; printf '\n'; sleep 5; done"

上記の式では、-d と --name という 2 つのコマンド ライン パラメータを使用しました。 -d は、コンテナを Linux デーモンとして実行するように Docker に指示します。 -name パラメータは、コンテナの明示的な名前を指定するために使用されます。

明示的なコンテナ名を指定しない場合、Docker はコンテナにランダムかつ一意の名前を自動的に割り当てます。名前は有名な科学者の名前と形容詞で構成されます。

たとえば、「boring_borg」や「angry_goldberg」などです。かなり面白いですね。

重要な点は、コンテナ名が一意である必要があることです。引用コンテナが起動して実行されていることを確認します。

$ docker container ls -l

前の出力の重要な部分は STATUS 列で、この場合は UP 16 秒と表示されています。これは、コンテナが 16 秒間稼働していることを意味します。

リストコンテナ

時間の経過とともにコンテナを実行し続けていると、システムには多くのコンテナが存在するようになる場合があります。ホスト上で現在実行中のコンテナを見つけるには、次のように container ls コマンドを使用します。

$ docker container ls

これにより、現在実行中のすべてのコンテナが一覧表示されます。
デフォルトでは、Docker は次の意味を持つ 7 つの列を出力します。

システムで定義されているすべてのコンテナを一覧表示する場合は、次のようにコマンドライン パラメータ -a または -all を使用できます。

$ docker container ls -a

これにより、作成済み、実行中、終了済みなど、あらゆる状態のコンテナが一覧表示されます。

場合によっては、すべてのコンテナの ID を一覧表示したいこともあります。これには -q パラメータがあります:

$ docker container ls -q

これが何の役に立つのか疑問に思うかもしれません。次に例を示します。

$ docker container rm -f $(docker container ls -a -q)

上記のコマンドは、停止されたコンテナも含め、システム上で現在定義されているすべてのコンテナを削除します。 rm コマンドは削除を意味し、このチュートリアルでさらに詳しく説明します。
前のセクションでは、list コマンドで -l パラメータを使用しました。 -l パラメータの意味を確認するには、Docker ヘルプを使用してください。次のようにして、list コマンドのヘルプを呼び出すことができます。
$ dockerコンテナls -h

コンテナの停止と起動

場合によっては、実行中のコンテナを一時的に停止する必要があることがあります。このコンテナを試してください:

$ docker コンテナ実行 -d --name quotes alpine \ /bin/sh -c "while :; do wget -qO- https://talaikis.com/api/quotes/random; printf '\n'; sleep 5; done"

次のコマンドでこのコンテナを停止できます。

$ docker container stop quotes

コンテナを一時停止しようとすると、完了するまでにしばらく (約 10 秒) かかることがあります。なぜこのようなことが起こるのでしょうか? Docker は、コンテナ内で実行されているメイン プロセスに Linux SIGTERM シグナルを送信します。

上記のコマンドでは、コンテナの名前を使用して、停止するコンテナを指定します。コンテナIDも使用できます。

コンテナ ID を取得するにはどうすればよいですか?

これを行うにはいくつかの方法があります。手動の方法は、実行中のすべてのコンテナを一覧表示し、リストから探しているコンテナを見つけることです。そこからIDをコピーするだけです。
より自動化されたアプローチとしては、シェル スクリプトと環境変数を使用することです。たとえば、引用コンテナの ID を取得する場合の例を次に示します。

$ export CONTAINER_ID = $(docker container ls | grep quotes | awk '{print $1}')

ここでは、AWK を使用して最初のフィールド (コンテナ ID) を取得します。これで、コンテナ名を使用する代わりに、式で $CONTAINER_ID 変数を使用できるようになりました。

$ docker コンテナを停止 $CONTAINER_ID

コンテナが停止されると、そのステータスは「終了」に変わります。

停止したコンテナは、docker container start コマンドを使用して再起動できます。

コンテナの削除

docker container ls -a コマンドを実行すると、多数のコンテナが「Exited」状態になっていることがわかります。

これらのコンテナーが不要になった場合は、メモリから削除することをお勧めします。そうしないと、貴重なリソースが消費されてしまいます。コンテナを削除するコマンドは次のとおりです。

$ docker container rm <container ID>

あるいは、次のコマンドを使用することもできます。

$ docker container rm <container name>

実行中のコンテナを削除できない場合があります。強制的に削除する場合は、コマンドライン パラメータ -f または --force を使用できます。
コンテナ化により業界の運営方法が変わり、メンテナンスコストが 50% 以上削減され、市場投入までの時間が約 90% 短縮されました。さらに、コンテナを使用すると、コンテナ外で実行するよりもアプリケーションが安全になります。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。

以下もご興味があるかもしれません:
  • Dockerイメージ送信コマンドcommitの動作原理と使い方の詳細な説明
  • Dockerネットワークの仕組み
  • Dockerコンテナが使用するリソースを表示する方法の詳細な説明
  • Dockerの動作モードと原理の詳細な説明

<<:  Vue で変数式セレクターを実装する方法

>>:  MySQL サービスを起動できない問題の解決策を含む MySQL 5.7.17 インストール チュートリアル

推薦する

JavaScript はドラッグ可能なモーダルボックスを実装します

この記事では、ドラッグ可能なモーダルボックスを実装するためのJavaScriptの具体的なコードを参...

Ubuntu 18.04 でソースコードから Odoo14 をインストールするチュートリアル

目次このシリーズの背景概要PostgreSQL データベースの準備ソースからインストール仮想環境の作...

MySQL 変数宣言とストアド プロシージャの分析

変数の宣言グローバル変数の設定@a='新しい変数' を設定します。関数やストアドプロ...

JavaScript キャンバス テキスト クロック

この記事では、テキストクロックを実装するためのキャンバスの具体的なコードを例として紹介します。具体的...

HTML の一般的でないタグ optgroup、sub、sup、bdo のサンプルコード

Optgroup は、ドロップダウン リストのコンテンツをより整理するために、select タグで使...

セマンティックウェブページ XHTML セマンティックマークアップ

構造とプレゼンテーションを分離するもう 1 つの重要な側面は、セマンティック マークアップを使用して...

docker compose サービスの起動順序を制御する方法

まとめDocker-compose は複数の Docker コンテナ サービスを簡単に組み合わせるこ...

CentOS7 環境で gcc (バージョン 10.2.0) をアップグレードする詳細な手順

目次簡単な紹介1. 現在のgccバージョンを確認する2. gccインストールパッケージ(バージョン1...

jsはウォーターフォールフローのボトムアウトによるデータの動的ロードを実現します

この記事では、ウォーターフォールフローが底に達したときにデータを動的にロードするためのjsの具体的な...

Vueフロントエンドパッケージングの詳細なプロセス

目次1. パッケージ化コマンドを追加する2. パッケージ化されたコードを実行する3. パッケージ化し...

システムメンテナンスページにリダイレクトするように nginx を設定する

先週末、兄弟プロジェクトはより良いサービスを提供するためにサーバーを拡張する準備をしていました。兄弟...

入力[type=file]の起動が遅くて動かなくなる問題を素早く解決します

入力タグタイプがファイルで、タグ内にaccpet="image/*"属性が設定さ...

Linux は suid vim.basic ファイルを使用して権限昇格を実現します。

カリで再現まず、必要なvim.basicファイルにsuid権限を設定します。 chmod u+s /...

Quickjs は JavaScript サンドボックスの詳細をカプセル化します

目次1. シナリオ2. 基盤となるAPIを簡素化する2.1 自動的に破棄を呼び出す2.2 VM値を作...

複数のフィールドを変更するためのMysql更新の構文の詳細な分析

MySQL でレコードを更新すると、構文は正しいのですが、レコードが更新されません...質問文実行前...