この記事を読んだ後でも、あなたのお母さんはあなたが Docker を使い始められないのではないかと心配し続けるでしょうか?

この記事を読んだ後でも、あなたのお母さんはあなたが Docker を使い始められないのではないかと心配し続けるでしょうか?

[51CTO.com からのオリジナル記事] 先週、ガールフレンドが突然ペットを飼いたいと言いました。彼女にどんなペットが欲しいか聞いたところ、それは問題じゃない、あなた次第だと言われました。 ! !

これは私にとって本当に難しいです!しかし、私たちプログラマーにとってパートナーがいれば十分なので、すぐに甘やかしてみませんか?あなたの言う通りにするしかないよ!

ペットショップに行ったのですが、なかなか適当なものが見つかりませんでした。迷っていたところ、上司の玄関前の水槽で金魚が泳いでいるのが見えて、とても目を楽しませてくれました!

そこで私は上司に尋ねました。

私:ボス、金魚はいくらですか?

上司:水槽込みで100元です、値引きは無しです!

私:これは...少し安いですね!

ボス:若者よ、君は素晴らしいね。君は魚の養殖の天才に違いない。 2ドルで売りますよ!でも、水槽はあげられないよ!

私:じゃあ、私の分も詰めて、それを入れる袋を用意するのを手伝ってね!

それで私は喜んでその小さな金魚を家に持ち帰り、それを保管するための大きな瓶を見つけました!パートナーは私が買った小さな金魚を見て嬉しそうに笑っていました〜

翌朝、パートナーが私を起こして「ああ、ああ、ああ、私の小さな魚は動けないから、お金を払わないといけないよ~~~」と言いました。

それで私は怒りながらペットショップに駆け込み、飼い主に賠償を求めました。

私:あなたが売っている魚には何か問題があるようです。もう取り返しがつかないよ!

ボス:ありえない、彼は昨日ここで元気いっぱいだったよ!

私:あなたの魚は何かおかしいですよ!

上司:君が買った水槽に何か問題があるに違いない!

私:足かせを2つ握って、「熱い、熱い、熱い!」と叫びました。

ボス:何千もの花を足で踏みしめながら、世界中のあらゆるものを笑顔で眺めているんですか?

このシーンは見覚えがある!私たちが開発しているシーンと非常によく似ています:

テスト: xx、実稼働環境で実行されているコードに問題があります。

私:無理です。ローカルでは問題なく動作します。

テスト:実稼働環境で自分でテストします。

私:見ませんよ。ローカルのコードには問題はありません。それは操作とメンテナンスのせいに違いありません。操作とメンテナンスを探しに行く必要があります!

おそらく多くの開発者が、プログラムはローカルでは正常に実行されるが、本番環境に移行するとクラッシュするという上記のような経験をしたことがあるでしょう。

これは、金魚のようなプログラムが地域の気候に適応できないためです。プログラムがローカル環境に適応されない理由は、通常、環境と構成の違いです。

さらに、インターネットでは同時実行性が高く、アクセストラフィックが多いため、アプリケーションをクラスター内の複数のマシンに展開する必要があり、クラスターの拡張と縮小の要求も比較的頻繁に発生します。

従来の方法で展開する場合、各サーバーにさまざまなソフトウェアをインストールする必要があります...その後、さまざまな構成を実行する必要があります...「仕事の場合は 996、病気の場合は ICU」が運用および保守エンジニアに手を振っているように見えます。

環境の違いを遮断するだけでなく、迅速な導入を可能にするソリューションはあるでしょうか?

ローカル環境に慣れていないため、プログラムとローカル環境全体をパッケージ化して移行し、満足できるか確認します。 Docker はあなたを納得させるテクノロジーです!

あ、上のオブジェクトは私が新しく作成したものです(* ̄︶ ̄)。

こんにちは、Docker

Dockerとは何ですか? Baidu 百科事典は私にこう言いました:

Docker はオープンソースのアプリケーション コンテナ エンジンであり、開発者はアプリケーションと依存パッケージをポータブル イメージにパッケージ化し、それを一般的な Linux または Windows マシンに公開できるほか、仮想化も実現できます。コンテナーは完全なサンドボックス メカニズムを使用し、相互にインターフェイスを持ちません。


この段落では、Docker とは何か、Docker で何ができるか、そして Docker の基本的な機能について、非常に一般的な方法ですでに説明しました。

Docker を初めて使用する場合は、何度か読んでも私と同じように混乱すると思います。それは問題ではありません。全文を読んでからこの段落を見返すと、違った体験ができるかもしれません。

まずは Docker が公開した公式の「メイクアップ写真」を見てみましょう。

この写真を一言で説明するとしたら、幼稚園児だった私はこう言うでしょう。「背中にたくさんの容器を載せて海を泳ぐかわいいクジラ」!

そして今、私はこう言います。「Docker は、複数の分離されたコンテナを実行できるオペレーティング システム上で実行されるソフトウェアです。」

表現は違っても意味は同じです!このかわいいクジラは Docker、海はオペレーティング システム、そして複数のコンテナは Docker 上で実行されているコンテナです。コンテナとは何かについては後ほどお話しますね〜

もし海を渡って私に会いに行きたいなら、自分で船を作ることもできます。ですから出発する前に、たくさんの乾いた食べ物やその他たくさんの必需品を準備しなければなりません!

しかし今、クジラが泳いで来て、あなたにこう言います。「ここにはたくさんの容器があって、必要なものはすべて入っています。あなたに合ったものを一つ選んで入ってください。風と波に乗れる場所に連れて行ってあげますよ。」

これを読んで、Docker についての予備的な印象はありましたか?少なくとも私は知っています:

  • Dockerとは何ですか?

  • なぜ Docker が必要なのでしょうか?

従来の仮想マシンと比較して


以前、Docker は仮想化を実現できると述べました。では、Docker と私たちが普段使用している仮想マシンの違いとつながりは何でしょうか?

クラウド サーバーを購入する余裕がなかった当時は、Linux を学習するには、まずソフトウェアをインストールして仮想マシンを作成する必要がありました。

次に、ソフトウェア上に仮想マシンを作成し、メモリを割り当て、ディスクを割り当て、Linux オペレーティング システムをインストールし、一連の操作を実行します。最後に、仮想マシンが実行されるまで数分間待ちます。

従来の仮想マシンの起動が遅いのはなぜですか?従来の仮想マシン技術では、ハードウェア セットを仮想化し、その上で完全なオペレーティング システムを実行し、システム上で必要なアプリケーションを実行するため、仮想マシンのリソースを事前に割り当てる必要があり、割り当てられると、これらのリソースはすべて占有されてしまいます。

ただし、Docker コンテナ内のアプリケーションはホストのカーネル上で直接実行されます。コンテナには独自のカーネルがなく、ハードウェアを仮想化しません。

したがって、Docker コンテナは従来の仮想マシンよりも移植性に優れています。ただし、Docker コンテナ テクノロジも、仮想マシンを参照して反復的に段階的に最適化されます。

Docker コンテナと従来の仮想マシンの公式比較表を見てみましょう。

写真からわかるように、Docker はオペレーティングシステム上で動作するソフトウェアです。

将来、Windows 上で Linux を学習したい場合は、Windows 版の Docker をローカルにインストールし、この記事の残りの部分を読むだけで、簡単に Linux を操作できるようになります。

ただし、WindowsにDockerをインストールするには、まず仮想マシンをインストールする必要があります。

基本コンポーネント


これまで Docker の基本的な概念について大まかな印象をつかんできましたが、これまでのところ、Docker に対する理解はまだ比較的漠然としているかもしれません。次のパートでは、Docker の基本的なコンポーネントから Docker について詳しく見ていきます。 Docker はクライアントサーバー構造です。

まず、公式ウェブサイトに掲載されているアーキテクチャ図を見てみましょう。

この図は Docker のすべての要素をまとめたものです。 Dockerクライアント、Dockerサービス、ウェアハウス、イメージ、コンテナなどの概念を一つずつ分析してみましょう。

Dockerクライアント

一番左にあるのは Docker クライアントです。これは、MySQL を操作するために使用する Navcat ツールに似ていますが、グラフィカル インターフェイスのないコマンド ターミナルである点が異なります。

Docker クライアントは、ユーザーが Docker サービスと対話するためのウィンドウです。さまざまな操作のコマンドを画像で確認できます。

Docker サービス

中央には、Docker がバックグラウンドで実行するサービス、Docker Daemon と呼ばれるデーモン プロセスがあります。これは当社の MySQL サービスとして理解でき、操作コマンドはこの部分で処理されます。

Docker デーモンはクライアントの要求をリッスンし、Docker イメージ、コンテナ、ネットワーク、ディスク (図にはイメージとコンテナのみがリストされています) などのオブジェクトを管理します。

同様に、Docker クライアントとサービスを同じマシン上で実行することも、あるマシン上のクライアントを使用して別のマシン上の Docker サービスにリモートで接続することもできます。これは MySQL と同じです。

倉庫

右側の部分が登録されたリポジトリです。昔の開発者は皆、サードパーティのパッケージが必要になったときに、対応する Jar パッケージをインターネットからダウンロードしなければならなかったことを知っています。面倒なだけでなく、ダウンロードしたパッケージが不安定なバージョンになる可能性も高かったです。

Maven を使用すると、Maven 構成ファイルに対応する依存関係を導入するだけで、リモート リポジトリから対応するバージョンの Jar パッケージを直接ダウンロードできます。

Docker のウェアハウスは、Maven のウェアハウスと同じ概念です。よく使用するイメージをリモートでダウンロードし、パッケージをリモート ウェアハウス (図の Redis、Nginx、その他のイメージなど) にプッシュできます。同じイメージには複数のバージョンが存在する可能性があり、Docker ではこれをタグと呼びます。

画像とコンテナ

イメージとコンテナについてはこれまで何度も言及してきました。これらは Docker の 2 つの中核概念です。では、イメージとコンテナとは何でしょうか?イメージとコンテナの関係は何ですか?

①ミラー

公式の定義は次のとおりです: Docker イメージは、Docker コンテナを作成するために使用できる読み取り専用テンプレートです。

イメージは、ソフトウェア ランタイム環境と、ランタイム環境に基づいて開発されたソフトウェアをパッケージ化するために使用される、軽量で実行可能な独立したソフトウェア パッケージです。

コード、ランタイム、ライブラリ、環境変数、構成ファイルなど、ソフトウェアを実行するために必要なものがすべて含まれています。

私たちが開発する Web アプリケーションには、JDK 環境、Tomcat コンテナ、Linux オペレーティング システムが必要です。必要なものすべてを 1 つにパッケージ化できます (独自の Web アプリケーション + JDK + Tomcat + CentOS/Ubuntu + さまざまな構成ファイルを含む)。

パッケージ化されたイメージが特定のマシンで実行できる場合、Docker がインストールされているどのマシンでも実行できます。

イメージの作成は他の親イメージに基づいて行われます。つまり、イメージは階層化されます。たとえば、Tomcat イメージは CentOS/Ubuntu で実行する必要があります。

次に、CentOS/Ubuntu イメージに基づいて Tomcat イメージが作成されます (次の操作セクションのコマンドを使用して表示できます)。

この構造は私たちが食べるタマネギに似ています。私の心を一枚一枚剥がしてくれるなら〜

[[267935]]

②コンテナ

公式の定義は次のとおりです: Docker コンテナは、イメージを使用して作成された実行中のインスタンスです。 Docker はコンテナを使用して、1 つのアプリケーションまたはアプリケーション グループを個別に実行できます。

クライアントまたは API を使用して、コンテナの起動、開始、停止、削除を制御できます。各コンテナは互いに分離されています。

前の手順で作成したイメージは単なる静的ファイルです。このファイルを実行するには、コンテナに変換する必要があります。コンテナは、Linux システムとその中で実行されるアプリケーションの簡略化されたバージョンと考えることができます。

これらは先ほど見たクジラの背中にあるコンテナで、それぞれのコンテナは独立しています。

③画像とコンテナの関係

上記の概念は非常に抽象的です。コンテナはイメージのインスタンスであることがわかります。誰もが次のようなコードを書いたことがあると思います。

  1. 公共  void DogはAnimalを拡張します{
  2. ......
  3. }
  4. ......
  5. 犬 犬 =新しい犬()

コード内で Dog クラスを定義します。このクラスはミラーに相当します。このクラスに基づいて多くのインスタンスを作成できます。新しく作成されたインスタンスはコンテナと同等です。画像は静的なファイルですが、コンテナは生きたエンティティです。

Dog クラスは親クラス Animal を継承できます。継承関係が明示的に指定されていない場合、Dog クラスはデフォルトで Object クラスを継承します。

前述のように、Docker 内のイメージにも継承関係があります。イメージは他のイメージを継承して新しい機能を作成および追加できます。

これを読んで、Docker についての理解が深まりましたか? Baidu 百科事典の Docker の説明を振り返ってみると、より深い印象を抱くかもしれません。

Docker はオープンソースのアプリケーション コンテナ エンジンであり、開発者はアプリケーションと依存パッケージをポータブル イメージにパッケージ化し、それを一般的な Linux または Windows マシンに公開できるほか、仮想化も実現できます。コンテナーは完全なサンドボックス メカニズムを使用し、相互にインターフェイスを持ちません。

コンテナデータボリューム


前述のように、コンテナは Linux システムとその中で実行されるアプリケーションの簡略化されたバージョンです。アプリケーションによって生成されたデータ(操作ログ、例外ログ、データなど)もコンテナ内のシステムに保存されます。デフォルトでは永続化されません。コンテナ内に入って確認することができます。

しかし、ある日、クジラのドッカーが人間の抑圧に不満を抱き、反乱を起こしたら...私はあなたのコンテナを粉砕します!

[[267936]]

コンテナが閉じられると、コンテナ内のデータも失われ、再度開かれたコンテナには元のデータは読み込まれません (簡単に言えば、コンテナが再起動され、別のインスタンスになります)。

コンテナ内のデータをホストマシンに永続化する必要があるため、コンテナのデータ量を把握する必要があります。

コンテナ データ ボリュームの設計目的は、コンテナ間のデータの永続性とデータ共有を実現することです。データ ボリュームはコンテナーのライフ サイクルから完全に独立しているため、コンテナーが閉じられたり削除されたりしても、データは失われません。

簡単に言うと、ホストディレクトリをコンテナにマウントし、コンテナ内で適用されたデータをホストディスクに同期させることで、コンテナ内で生成されたデータを永続化できるようになります。コンテナボリュームコマンドに関しては、後ほど操作例を紹介します。

コマンド操作

ここまでいろいろと述べてきましたが、いよいよ実践的な部分に移ります。このセクションでは、いくつかの一般的なコマンドを通じて Docker をより深く理解するのに役立ちます。知らせ!ここでは、コマンドの完全なリストではなく、理解を深めるためによく使用されるコマンドをいくつか示します。

Docker がインストールされていない場合は、公式 Web サイトのドキュメントに従って自分でインストールできます。この記事ではこの部分は取り上げません。つまり、サーバーに Docker がインストールされていると想定します。

ヘルプコマンド

①docker version: Dockerクライアントとサービスのバージョンを確認します。

②docker info:コンテナ数、イメージ数、Dockerルートディレクトリなど、Dockerの基本情報を表示します。

③docker --help: Dockerのヘルプ情報を表示します。このコマンドはDockerでサポートされているすべてのコマンドを表示できます。

これらのコマンドは非常にシンプルなので、基本的な Linux の知識があれば誰でも簡単に理解できるはずです。

ミラーコマンド

①docker images:ローカルホスト上のすべてのイメージを表示します。ローカルホストであることに注意してください。ここでは、名前、バージョン、ID、サイズなどのイメージの基本情報を確認できます。ここでの imageID はイメージの一意の識別子であることに注意してください。

また、docker images tomcat を通じて特定のイメージを指定して、対応する情報を表示することもできます。

また、CentOS イメージのサイズはわずか 200 MB であり、これは物理マシンにインストールされている CentOS よりもはるかに小さいことにも注意してください。これは、CentOS イメージが Linux コアのみを保持しているためです。そのため、Docker 仮想化テクノロジは仮想マシンよりも効率的に実行されます。

では、なぜ Tomcat のイメージはこんなに大きいのでしょうか?それは、前に言ったように、私たちのイメージは層を重ねたタマネギのようなものだからです。

Tomcat の動作は CentOS、JDK などのイメージに基づいている必要があります。 Tomcat は上位層にあるため、サイズが比較的大きいです!

②docker rmi:下図のようにローカルイメージを削除します。強制的に削除するには -f パラメータを追加できます。

ここでの rmi コマンドは、イメージを表すために i が追加されていることを除いて、Linux の delete コマンドと非常によく似ています。

③docker search:イメージ名を元にリモートリポジトリ内のイメージを検索!

④docker pull:特定のイメージを検索した後、リモート側からイメージをプルすることができます。これは、GitのPullコマンドに少し似ています。もちろん、対応する docker push コマンドもあります。

上記のように、タグを指定しない場合は、デフォルトで最新バージョンがプルされます。 docker pull tomcat:1.7! を通じて指定されたバージョンをプルすることもできます。

イメージを取得すると多くの情報が印刷されることに注意してください。これも前に言ったことですが、画像はレイヤー化されており、画像をプルするということは、レイヤーごとにプルするということです。

コンテナコマンド

image コマンドを使用すると、イメージを取得したり、イメージを削除したり、その他の操作を行うことができます。イメージができたので、当然、イメージ (コンテナー) を通じて対応するインスタンスを作成する必要があります。 Tomcat を例に挙げてみましょう。

①docker run [OPTIONS] IMAGE [COMMAND] [ARG...]:特定のイメージを元にコンテナを実行できます。指定されたイメージがローカルで使用可能な場合は、ローカル イメージが使用されます。そうでない場合は、対応するイメージがリモートから取得され、起動されます。

このコマンドは非常に重要なので、いくつかの重要なパラメータを以下にリストします。

  • -d:コンテナを起動し、バックグラウンドで実行します (Docker コンテナをバックグラウンドで実行するには、フォアグラウンド プロセスが必要です。コンテナによって実行されるコマンドが中断されたコマンドでない場合、コンテナは起動後に自動的に終了します)。

  • -i:コンテナを対話モードで実行します。通常は -t と一緒に使用されます。

  • -t:コンテナの疑似入力端子を再割り当てします。通常は -i (コンテナの起動後にコンテナ内のコマンド ウィンドウに入る) と一緒に使用されます。

  • -P:ランダムポートマッピング。コンテナの内部ポートは、ホストの上位ポートにランダムにマッピングされます。

  • -p:ホスト ポート: コンテナ ポートの形式でポート マッピングを指定します。

  • -v:ホストとコンテナのディレクトリを同期します。

  • --name="myTomcat":コンテナの名前を指定します (指定しない場合はランダムな名前が付けられます)。

上記の例では、コマンドを使用して Tomcat コンテナを起動しました。 -t パラメータを使用したため、コンテナの起動後にコンテナ内のコマンド ウィンドウに入り、Tomcat の起動ログが大量に出力されました。

また、-p パラメータを使用してポート マッピングを指定します。つまり、コンテナ内で Tomcat を実行しているポートは 8080 であり、ホスト マシン上のポート 8888 にマッピングされるため、コンテナ内で Tomcat によってデプロイされたサービスに、サーバーの ip+8888 ポートを介して外部からアクセスできるようになります。

先ほど、コンテナを閉じるとコンテナ内のデータは失われると述べました。次に、コンテナ内のデータをホスト マシンに永続化するためのコンテナ データ ボリューム テクノロジが必要になります。ここでは -v パラメータを使用する必要があります。

次のスクリーンショットを見てみましょう。

ここで最初に注意すべきことは、-d パラメータを使用したことです。起動後、コンテナには入らず、ホストマシン上に残りました。 (上記の -it パラメータとの違いを比較できます)

2 つ目に注目すべき点は、コンテナー内の -v /host:/directory により、ホストとコンテナー内の指定されたディレクトリ間でデータが同期されることです。

コンテナを起動した後、Linux ll コマンドを使用して、コンテナに同期されたホスト上のファイルを表示できます。

3 番目に注意すべき点は、ここでの同期は双方向であるということです。つまり、ホスト上のファイルへの変更はコンテナーにも同期されます。

複数の異なるコンテナをホストマシン上の同じディレクトリにマッピングすることで、異なるコンテナ間でのデータ共有が可能になります。

② コンテナに入った後は、exit コマンドを使用してコンテナを終了するか、Ctrl+P+Q ショートカット キーを使用してコンテナを終了することができます。これら 2 つの方法の違いは、exit はコンテナーを終了して閉じますが、Ctrl+P+Q ショートカット キーは単に終了するだけで、コンテナーは引き続き実行されており、再度入ることができることです。

③docker ps:このコマンドを使用すると、実行中のコンテナの情報を表示できます。コンテナの一意のID、開始時刻などを確認できます。

これは Linux の ps コマンドに似ているため、コンテナーは Docker 上で実行されているプロセスとしても理解できます。

docker ps -a は実行中および停止中のコンテナをすべて表示できます。

④docker attach [OPTIONS] CONTAINER:前述の通り、Ctrl+P+Q ショートカットを使用してコンテナを終了した後も、コンテナはバックグラウンドで実行されたままになります。コンテナに再度入りたい場合はどうすればいいですか?アタッチ コマンド + コンテナ ID を使用して、コンテナに再度入ることができます。

⑤docker exec [OPTIONS] CONTAINER:このコマンドはattachと同様にバックグラウンドで実行中のコンテナに再入することができますが、このコマンドはコンテナに入らずに実行中のコンテナ内でコマンドを実行できます!アタッチよりも強力!

⑥docker stop、docker kill docker restart:これら 3 つのコマンドは、Linux でプロセスを停止、強制停止、再起動するのと同じように、それぞれコンテナを停止、強制停止、再起動するために使用されます。ここでは説明しません!

⑦docker rm:コンテナを削除するにはこのコマンドを使用します。これと画像を削除することの違いは、ここでは i が 1 つ少ないことです。

Stop および Kill によって停止されたコンテナは Docker 内にまだ存在しますが、rm コマンドによって操作されたコンテナは存在しなくなることに注意してください。

⑧docker inspect:コンテナの詳細を表示します(イメージの詳細も表示できます)。

Dockerファイル


これまで、Docker と関連する概念および一般的なコマンドについて基本的な理解をしてきました。また、リモートの場所からイメージを取得できることもわかっていました。では、リモート画像はどこから来るのでしょうか?自分で画像を作成したい場合はどうすればよいでしょうか?

はい、Dockerfileです! Dockerfile は、ユーザーがイメージを構築するために使用できるすべてのコマンドが含まれるテキスト ドキュメントです。独自の構文とコマンドがあります。 Docker は Dockerfile から指示を読み取り、イメージを自動的にビルドできます。

独自の Dockerfiler を記述してイメージを構築する場合は、Dockerfile の構文とコマンドを理解する必要があります。ルールを理解することによってのみ、物事をより良く行うことができます。

関連する指示

から

  1. <画像> から [<名前> として]
  2. FROM <画像>[:<タグ>][AS <名前>]
  3. FROM<画像>[@<ダイジェスト>] [AS <名前>]

Java のクラス継承に似た、現在のイメージの作成元となるベース イメージを指定します。 FROM 命令は Dockerfile の最初のコマンドである必要があります。

メンテナー

  1. メンテナー <名前>

イメージ管理者からの情報: このコマンドは非推奨としてマークされています。

ラベル

  1. LABEL<キー>=<値><キー>=<値><キー>=<値> ...

イメージにメタデータを追加するには、MAINTAINER コマンドを LABEL コマンドに置き換えます。著者、メールアドレスなどの情報を指定します。

環境

  1. ENV <キー><値>
  2. ENV <キー>=<値> ...

環境変数を設定します。設定された変数は後続の命令で使用できます。 Java で変数を定義するのと似ています。

ワークディレクトリ

  1. WORKDIR /path/to/workdir

作業ディレクトリを設定します。この命令に続く RUN、CMD、ENTRYPOINT、COPY、および ADD 命令は、このディレクトリで実行されます。ディレクトリが存在しない場合は作成されます。

走る

  1. RUN <コマンド>
  2. RUN [ "実行可能ファイル" , "パラメータ1" , "パラメータ2" ]

RUN は現在のイメージの上に新しいレイヤーを作成し、任意のコマンドを実行して、実行結果をコミットすることができます。送信後の結果イメージは、Dockerfile の後続のステップで使用できます。

追加

  1. ADD[--chown=<ユーザー>:<グループ>] <ソース>... <宛先>
  2. ADD[--chown=<ユーザー>:<グループ>] [ "<ソース>" ,... "<宛先>" ]

ホストからイメージにファイルまたはフォルダーをコピーするか、ネットワーク ファイルをコピーします。コピーしたファイルが圧縮ファイルの場合は自動的に解凍されます!

コピー

  1. COPY[--chown=<ユーザー>:<グループ>] <ソース>... <宛先>
  2. COPY[--chown=<ユーザー>:<グループ>] [ "<ソース>" ,... "<宛先>" ]

ホストからイメージにファイルまたはフォルダーをコピーします。ネットワーク ファイルはコピーできず、自動的に解凍されません。

音量

  1. ボリューム [ "/data" ]

VOLUME は、通常、実行コマンドの -v パラメータと組み合わせてマウント ポイントを作成するために使用されます。

さらす

  1. EXPOSE <ポート>[<ポート>/<プロトコル>...]

コンテナの実行時に公開されるポートを指定しますが、この指定では実際にポートは公開されません。イメージビルダーとコンテナランナー間の記録ファイルとして機能します。

コンテナ コマンドの実行コマンド部分に戻ると、実行コマンドには -p と -P という 2 つのパラメーターがあります。

-P の場合はランダム ポート マッピングとなり、コンテナは EXPOSE で指定されたポートにランダムにマッピングします。 -p の場合はポート マッピングが指定され、コンテナー内でマッピングする必要があるポート番号を運用および保守担当者に伝えます。

CMDF

  1. CMD[ "実行可能ファイル" , "パラメータ1" , "パラメータ2" ]
  2. CMD[ "パラメータ1" , "パラメータ2" ]
  3. CMD コマンド パラメータ1 パラメータ2

コンテナの起動時に実行するデフォルトのコマンドを指定します。 Dockerfile ファイル内に複数の CMD コマンドがある場合、最後のコマンドだけが有効になります。

コマンドを実行することもできます。上記の RUN 命令と非常によく似ていることに気づくかもしれません。 RUN 命令はイメージをビルドするときに実行されますが、CMD 命令はコンテナが実行されるたびに実行されます。 docker run コマンドは CMD コマンドを上書きします。

エントリーポイント

  1. ENTRYPOINT[ "実行可能ファイル" , "param1" , "param2" ]
  2. ENTRYPOINT コマンド パラメータ1 パラメータ2

この命令は CMD 命令に似ています。どちらもコンテナの起動時に実行されるコマンドを指定します。 ENTRYPOINT が指定された場合、CMD で指定されたコマンドは実行されません。

Dockerfile ファイル内に複数の ENTRYPOINT コマンドがある場合、最後のコマンドのみが有効になります。違いは、docker run コマンドが CMD コマンドを上書きすることです。

実行されたコマンドは ENTRYPOINT を上書きせず、docker run コマンドで指定されたパラメーターは ENTRYPOINT へのパラメーターとして渡されます。

RUN、CMD、ENTRYPOINT の違い:

  • RUN 命令はイメージがビルドされるときに実行され、最後の 2 つはコンテナが起動されるときに実行されます。

  • CMD 命令によって設定されたコマンドは、コンテナの起動時に実行されるデフォルトのコマンドです。 docker run でコマンドが指定されておらず、Dockerfile で ENTRYPOINT が指定されていない場合は、コンテナの起動時に CMD で指定されたコマンドが実行されます。コード内のデフォルト パラメータに少し似ています。

  • ENTRYPOINT ディレクティブが設定されている場合は、それが優先されます。そして、この命令で設定されたコマンドにdockerrunを介してパラメータを渡すこともできます。

  • CMD は、コード内のデフォルト パラメータに少し似ています。

ユーザー

  1. USER <ユーザー>[:<グループ>]
  2. ユーザー <UID>[:<GID>]

イメージを実行するユーザーを指定するために使用されます。

ARGB

  1. ARG <名前>[=<デフォルト値>]

イメージをビルドするときに渡すことができる変数を指定します。定義された変数は、dockerbuild --build-arg = を介してビルド時に設定できます。

オンビルド

  1. ONBUILD [手順]

ビルドされたイメージが他のイメージのベースイメージとして使用される場合、ONBUILD で指定されたコマンドがトリガーされます。

停止信号

  1. STOPSIGNAL信号

コンテナが停止したときに送信されるシステムコールシグナルを設定します。

ヘルスチェック

  1. HEALTHCHECK [OPTIONS] CMDコマンド(コンテナ内でコマンドを実行してコンテナの実行状態を確認する)
  1. HEALTHCHECK NONE (親イメージからのチェックの継承を無効にする)

この命令は、コンテナの実行状態を検出する方法を Docker に指示します。

シェル

  1. SHELL [ "実行可能ファイル" , "パラメータ" ]

コマンドを実行するために使用されるデフォルトのシェル タイプを設定するために使用されます。このコマンドは、Windows オペレーティング システムでより便利です。Windows には通常、CMD と Powershell、さらには SH という 2 つのシェルがあるためです。

建てる

Dockerfile は上から下へ順番に実行されます。各命令は新しいイメージ レイヤーを作成し、イメージをコミットします。

Dockerfile ファイルを書き込んだ後、dockerbuild コマンドを使用してイメージをビルドする必要があります。

docker build の形式は次のとおりです。

  1. docker build [オプション] パス | URL | -

-f:使用する Dockerfile パスを指定します。指定しない場合は、現在の作業ディレクトリで Dockerfile ファイルが検索されます。

-t:イメージの名前とタグ。通常は name:tag または name の形式です。 1 回のビルドでイメージに複数のタグを設定できます。

たとえば、 docker build -t myApp:1.0.1 を実行して独自のイメージをビルドできます。に注意してください。最後に、イメージ構築プロセス中にコンテキスト環境のディレクトリを指定するために使用されます。

これらの公式イメージの Dockerfile ファイルがどのように記述されているかを知りたい場合は、https://hub.docker.com/ で検索できます。

Tomcat イメージを例に挙げます。

Tomcat イメージの親イメージは OpenJDK イメージであることがわかります。 OpenJDKのDockerfileファイルを検索してみましょう。

OpenJDKイメージの親イメージは OracleLinux イメージです。 OracleLinuxのDockerfileファイルを検索してみましょう。

OpenJDKイメージの親イメージは、ルート イメージである Scratch です。コード内のすべてのオブジェクトの親クラスが Object であるのと同じように、すべてのイメージはこのイメージに依存します。

Tomcat イメージはレイヤーごとに構築されていることがわかります。これが、先ほど docker イメージで表示した Tomcat イメージが 400 MB を超えている理由です。

これを読んで、Docker が何であるか分かりましたか?なぜ Docker が必要なのでしょうか? Docker イメージと Docker コンテナの概念は何ですか? Docker でよく使われるコマンドは何ですか? Dockerfile にはどのような指示がありますか?独自のイメージを構築するにはどうすればいいですか?これらの質問を理解していますか?

[51CTO オリジナル記事、パートナーサイトに転載する場合は、元の著者とソースを 51CTO.com として明記してください]

<<:  Microsoft Azure SQL Database Managed Instance は、SQL Server から PaaS サービスへのシームレスな移行の時代を切り開きます。

>>:  マルチクラウド環境におけるデータ保護と管理の複雑さを排除するにはどうすればよいでしょうか?

推薦する

デル、仮想化技術を採用した新しいサーバーストレージを発表

デルは新しいサーバーおよびストレージ製品を発売すると発表した。デル製品と競合他社製品の違いは、競合他...

SEO が緑色のパイナップルに遭遇した場合、SEO は何をすべきでしょうか?

百度緑大根アルゴリズム1.0のリリース発表は2013年2月19日に行われ、このアルゴリズムの発効日は...

クラウドコンピューティングとは何ですか?理解するための1つの記事

[[381397]]この記事はWeChatの公開アカウント「Wireless Deep Sea」から...

BurstNet は倒産したのですか? BurstNet は買収されたのですか?

最近話題になっているニュースは、米国国内トップ500企業(世界トップ500ではない)の1つであるBu...

分散システムアーキテクチャの1つであるマスターワーカーアーキテクチャ

[[409063]]この記事はWeChatの公開アカウント「Mu Niao雑記」から転載したもので、...

百度の業界資格認証がオンラインで公開され、偽造ウェブサイトの取り締まり強化につながる可能性

5月25日、一部のネットユーザーは、Baiduを使用してWebページを検索すると、図に示すように、一...

中小規模の電子商取引ウェブサイトのトラフィックを増やす方法: SEO 最適化の詳細

電子商取引サイトには独自の特徴があります。コンテンツを通じて人気を蓄積できるフォーラムや情報ポータル...

中国生鮮食品電子商取引業界レポート

2005年、中国初の生鮮食品電子商取引プラットフォーム「Yiguo.com」が設立され、生鮮食品電子...

微博は前進の道を模索している

1995年以降に生まれたユーザーであるMiaomiaoさんは、最近のWeiboが少し変わったことに気...

WeChat Yixinマーケティングを行う人やチームにとって必読の記事

みなさんこんにちは、私はXiaosiです。上級インターネット実践者として、もちろんダウンロードしてで...

オンラインビデオ業界、テレビドラマの購入に価格上限を設ける計画

ビジネスデイリー(記者 江夢偉)動画サイトが購入するドラマや映画の価格は今年も引き続き下落しているが...

Baidu の統計ツールを使用して、ウェブサイトを SEO 向けに最適化します。

誰もがバイドゥ統計、ウェブマスタークエリ、51LAなどに精通している統計ツールのいくつかは、主に私た...

chicagovps-$36.95/E3-1240/16g メモリ/500g ハードディスク/5IP/10T トラフィック/1Gbps

コロクロッシングコンピュータルームは、サブブランドchicagovpsで特別価格の独立サーバーをリリ...

redswitches-$6/KVM/Onapp/2g メモリ/50g ハードディスク/1T トラフィック/オランダ

redswitchesさん、私はこの会社についてよく知りません。担当者は、この会社には6年間の業界経...

初のインターネット独占禁止法訴訟:360対テンセント独占訴訟が明日審理される

新浪科技新聞11月25日朝のニュースによると、最高人民法院は11月26日午前9時に最高裁判所第一法院...