JavaRush /Java Blog /Random-JA /Docker との初めての出会い
Viacheslav
レベル 3

Docker との初めての出会い

Random-JA グループに公開済み
コンテナ化は、実際によく使用されるメカニズムです。たとえば、headhunter で検索すると、今日の時点で Docker について言及している 477 件の求人が見つかります。したがって、それが何であるかをよく理解しておくことは悪いことではありません。この短いレビューが最初のアイデアを形成するのに役立つことを願っています。そうですね、彼は Udemy のコースなどの追加資料でそれをバックアップします。 Docker の初めての紹介 - 1

導入

この短いレビューでは、コンテナ化などのトピックについて触れたいと思います。そして、コンテナ化とは実際には何なのかを理解することから始める必要があります。Wikipedia によると、「コンテナ化」とは、オペレーティング システム カーネルが 1 つだけではなく複数の分離されたユーザー空間インスタンスを維持するオペレーティング システム レベル (つまり、ハードウェアではない) の仮想化です。「ユーザー空間」は、ユーザープログラム用に予約されているオペレーティングシステムの仮想メモリアドレス空間です。ユーザー空間インスタンス (一般にコンテナーと呼ばれます) は、ユーザーの観点からは単一のオペレーティング システム インスタンスと完全に同一です。カーネルはコンテナを完全に分離するため、異なるコンテナのプログラムが相互に影響を与えることはできません。コンテナ化はソフトウェア仮想化、つまりオペレーティング システム レベルでの仮想化であり、オペレーティング システム カーネルがその責任を負っていることがわかります。このアプローチの特徴の 1 つは、すべてのコンテナーがホスト オペレーティング システム (つまり、コンテナーが配置されているオペレーティング システム) と同じ共通のカーネルを使用することです。これにより、仮想ハードウェアをエミュレートし、オペレーティング システムの本格的なインスタンスを起動するオーバーヘッドを取り除くことができます。これは「軽量」な仮想化であると言えます。カーネルは、プロセッサ時間、メモリ、外部ハードウェア、外部入出力デバイスなどのコンピュータ リソースへの調整されたアクセスをアプリケーションに提供する OS の中心部分です。カーネルは通常、ファイル システムおよびネットワーク プロトコル サービスも提供します。一般に、これはシステム全体の中心です。追加情報については、資料「コンテナに関する一般情報」を参照すると役立つ場合があります。さらにいくつかの言葉を加えて、導入を完了します。これで、オペレーティング システムにはカーネルがあることが理解できました。ユーザー空間インスタンスを分離します。この文脈で、「 cgroup 」という用語に遭遇するかもしれません。これは、これを実現するための Linux カーネル メカニズムの名前です。したがって、コンテナ化の道は Linux システムから始まったと言えます。ただし、Windows 10 からはコンテナ化のサポートも登場しました。仮想化を使用するには、コンピュータの BIOS で仮想化サポートを構成する必要があります。これを行う方法はコンピュータによって異なります。たとえば、次のようになります。
Docker の初めての紹介 - 2
Windows では、さまざまな方法でこれを確認できます。たとえば、Microsoft Web サイトから特別なユーティリティ「Hardware-Assisted Virtualization Detection Tool」をダウンロードできます。さて、もう 1 つの重要な概念であるハイパーバイザーについて言及する価値があります。ハイパーバイザーは仮想マシン モニターであり、同じコンピューター上で複数のオペレーティング システムを並列実行するためのプログラムです。ハイパーバイザーは、オペレーティング システムが相互に分離されていることを保証し、実行中の OS 間でリソースを共有します。そのようなハイパーバイザーの 1 つがOracle VirtualBoxです。
Docker の初めての紹介 - 3

ドッカー

したがって、仮想化が何であるかは明らかです。しかし、どうやって使うのでしょうか?ここで Docker が私たちを助けてくれます。Docker は、コンテナ化された環境でのアプリケーションのデプロイと管理を自動化するソフトウェアです。Docker が Docker Enginge などの概念で表されるという事実から始める価値があります。そして、公式 Docker Web サイトと「Docker の概要」セクションから始める必要があります。
Docker の初めての紹介 - 4
ドキュメントには、docker は次のもので構成されていると記載されています。
  • Docker デーモン プロセス (dockerd) と呼ばれる Docker サーバー。
  • コマンド ライン インターフェイス。CLI (docker) とも呼ばれます。
  • プログラムがデーモンと「対話」し、デーモンに何をすべきかを伝える方法を記述する REST API。
さらに詳しく説明する前に、docker、つまり docker デーモンをインストールしましょう。Docker Web サイトには、「Docker for Windows」のインストール手順が記載されています。興味深いことに、Docker には独自のシステム要件があります。また、私と同じように、Windows 7 などの古い Windows を使用している場合は、Docker Toolbox を使用する必要があります。
Docker の初めての紹介 - 5

ドッカーツールボックス

システム要件を満たしていない古いマシンに Docker をインストールする。Web サイトには「レガシー デスクトップ ソリューション」と書かれています。「Docker Toolbox」ページにアクセスしてダウンロードしましょう。このセットの重さは約 211 メガバイトです。これをデフォルトとしてインストールします。つまり、フラグを再配置せずに、すべてに大人しく同意するだけです。インストール後、すべてが正常であることを確認します。将来、私たちの戦場は指揮系統になります。Windows コマンド ラインは、明らかでない問題が発生する可能性があるため、使用しないことをお勧めします。bash シェルを使用することをお勧めします。Windows では、これを入手する最も推奨される方法はgitバージョン管理システムをインストールすることです。これは依然として便利です。必要な bash が「バンドル」されるからです。このレビューでは git bash を使用します。CYGWINを使用して bash をインストールすることもできます。bash または git bash を起動しましょう。Docker マシンとしても知られる Docker マシンがインストールされていることを確認しましょう。docker-machine -version この Docker マシンは何ですか? Docker Machine は、 Docker 化されたホスト (Docker Engine がインストールされているホスト) を管理するためのユーティリティです。Docket Toolbox をインストールした直後に、 コマンドを使用して Docker マシンを表示するとdocker-machine ls、空のリストが表示されます。
Docker の初めての紹介 - 6
新しいマシンを作成しましょう。これを行うには、 createコマンドを実行する必要があります。docker-machine create -- driver virtualbox javarush: Docker マシンの作成ログが表示されます。
Docker の初めての紹介 - 7
ここで私たちが興味を持っているのは次の点です。Boot2Docker とは何ですか? これは、Docker エンジンを実行するための最小限の Linux ディストリビューションです (Docker が Linux 仮想化ツールのおかげで機能することは理解していますが、Windows では必要なメカニズムが Windows 10 以降でのみ登場しました)。このディストリビューションは「Tiny Core Linux」ディストリビューションに基づいています。VirtualBox VM についても言及しました。これは、 を指定したためです--driver virtualbox。Boot2Docker イメージから VirtualBox に新しい仮想マシンが作成されました。作成後、VirtualBox を起動して (VirtualBox は Docker Toolbox とともにインストールされているため)、Docker マシン用に作成された仮想マシンを確認できます。
Docker の初めての紹介 - 8
作成後、コマンド「 docker-machine env」を実行して、docker マシンに接続するために構成する必要がある環境変数を取得するように 求められます。
Docker の初めての紹介 - 9
docker-machine を使用してこのコマンドを実行した後、リモートの docker 化されたホスト (この場合、Virtual Box でホストされている仮想ホスト) に接続し、リモート ホスト上で実行しているかのように docker コマンドをローカルで実行できます。確認するには、「 docker info 」コマンドを実行します。Docker マシンへの接続が確立されていない場合は、エラーが発生します。すべてが順調であれば、Docker マシン上の Docker に関する情報。ここで、Docker の一般的な仕組みとその使用方法を理解します。
Docker の初めての紹介 - 10

Dockerコンテナ

そこで、docker を用意しました。そもそもこの港湾労働者は何ですか? Docker のドキュメントと「はじめに」セクションは、これを理解するのに役立ちます。このセクションの導入部では、Docker の概念を紹介します。Docker はコンテナ内でアプリケーションを開発、デバッグ、実行するためのプラットフォームであると述べられています。したがって、Docker にとって重要なのはコンテナです。dockerのロゴを見ても、背中にコンテナを抱えたクジラです。しかし、コンテナとは何でしょうか?次の「イメージとコンテナ」セクションでは、コンテナは実行中のイメージのインスタンスであると述べています。そして、Image はアプリケーションに必要なもの (コード、環境、ライブラリ、設定など) がすべて含まれた「パッケージ」です。さあ、自分たちで試してみましょう。Docker Web サイトには「Docker サンプル」というセクションがあり、「Docker for Beginners」が含まれています。ここの例の方が私にとっては興味深いように思えます。そこで、私たちは突然Alpine Linuxについて知りたいと思いました。これは Docker コンテナーを使用して行うことができます。イメージを得るには、イメージを「引き出す」か「引き出す」必要があります。したがって、docker pullコマンドを実行します。docker pull apline
Docker の初めての紹介 - 11
ご覧のとおり、どこかからダウンロードしています。デフォルトでは、Docker はネットワークhttps://hub.docker.com上のリポジトリを参照します。イメージを正常に取得したら、docker imageコマンドを実行して、利用可能なイメージのリストを確認できます。
Docker の初めての紹介 - 12
これで、apline イメージが完成しました。コンテナは実行中のイメージのインスタンスなので、このイメージそのものを起動してみましょう。コマンドを使用してコンテナを起動しましょうdocker run alpine。ご覧のとおり、何も起こりませんでした。すべてのアクティブなコンテナを表示するコマンドを実行してもdocker ps、何も得られません。しかし、実行すると、docker ps -aすべてのコンテナが表示されます。
Docker との出会い - 13
問題は、Docker を対話モードで起動しなかったことです。したがって、彼はコマンドを実行して停止しました。コマンドはターミナルを開くことでした。同じことを対話モード ( -itフラグを使用) で実行してみましょう。
Docker の初めての紹介 - 14
ご覧のとおり、1 つの間違いを克服し、ヒントを使用してコンテナーに到達し、その中で作業できるようになりました。操作を停止せずにコンテナを終了するには、 を押しますCtrl + p + q。now を実行するとdocker ps、アクティブなコンテナが 1 つ表示されます。すでに実行中のコンテナに入るには、docker execコマンドを実行します。
Docker との出会い - 15
これがどのように起こるかについての優れた説明については、Docker サンプルの説明「1.0 最初のコンテナーの実行」を読むことをお勧めします。すべてが非常にアクセス可能でわかりやすい方法で書かれているので、私はそれが好きです。簡単に言い換えると、docker-machine を使用して、Docker デーモンを実行している仮想マシンに接続します。REST API 経由で CLI を使用して、alpine イメージを起動するように求めます。Docker はそれを検出するため、ダウンロードしません。Docker は新しいコンテナを作成し、このコンテナで指定したコマンドを実行します。そしてもちろん、これらはすべて良いことです。しかし、なぜこれだけが必要なのでしょうか? ここで、docker がどのようにイメージを作成するかを理解する必要があります。そして、dockerfile に基づいてそれらを作成します。
Docker の初めての紹介 - 16

Dockerfile

Dockerfile リファレンスで説明されているように、dockerfile はイメージを取得するためのすべてのコマンドを含むテキスト ファイルです。実際、私たちが受け取るすべてのイメージ (上記の例では Alpine も含む) は dockerfile から作成されました。Java アプリケーションを使用してイメージを構築しましょう。まず、この Java アプリケーションが必要です。Gradle ビルド システムを使用することをお勧めします。これについては、この短いレビュー「Gradle の簡単な紹介」で詳しく読むことができます。プロジェクト「Gradle Build init plugin」の作成に役立ちます。Gradle を使用して新しい Java アプリケーションを作成しましょう。 gradle init --type java-application このコマンドはテンプレート Java プロジェクトを作成します。これはスタンドアロン アプリケーションですが、Web アプリケーションを作成したいと考えています。App クラスと AppTest クラスを削除しましょう (これらは Gradle Build Init Plugin によって自動的に生成されました)。Web アプリケーションをすばやく作成するには、Gradle のチュートリアル「 Java Web アプリケーションの構築」を使用します。チュートリアルによると、次のようにしましょう。 ここで注意が必要です。いつものように、例には間違いがある可能性があります。ここにあります:
Docker の初めての紹介 - 17
ここで、それをテストするために、「 gretty プラグインを追加してアプリを実行する」セクション で示されているように、gretty プラグインを build.gradle に追加しましょう。
plugins {
    id 'war'
    id 'org.gretty' version '2.2.0'
}
興味深いのは、Gretty が上記で説明した のエラーを認識していないことですHelloServlet。これは、アプリケーションが環境によって異なる動作をする可能性があることを証明しています。Gretty は、通常のスタンドアロン サーバーがエラーをスローするような場所でも機能します。残っているのは、アプリケーションが正しく動作していることを確認することだけです。やろう:gradle appRun
Docker との出会い - 18
すべて問題がなければ、コマンドを使用してgradle war拡張子 war が付いたアーカイブ (Web アーカイブ) を収集します。デフォルトでは、gradle は .xml にビルドします\build\libs。これで、dockerfile を作成する準備が整いました。「Dockerfile リファレンス」を使用して Dockerfile を作成します。Java プロジェクトのルート (ビルド スクリプトと同じ場所) に「Dockerfile」というファイルを作成しましょう。編集のために開いてみましょう。このファイルには独自の形式があり、「Dockerfile リファレンス: 形式」セクションで説明されています。すべての dockerfile は、「ベース イメージ」を示す FROM ステートメントで始まります。これは、イメージを作成する際の基礎となる親イメージであると言えます。親イメージを選択するのは非常に簡単です。Web アプリケーションには Web サーバーが必要です。たとえば、Tomcat Web サーバーを使用できます。docker Hubと呼ばれる公式の Docker リポジトリに移動します。そこに必要な画像があるかどうかを確認します。
Docker との出会い - 19
Tomcat イメージが呼び出されることも理解する価値があります。しかし、名前のほかにタグが付いています。タグはバージョンのようなものです。バージョンが異なる Tomcat イメージは、使用される Tomcat のバージョン、jre のバージョン、およびベース イメージが異なります。たとえば、docker pull tomcat:9-jre8-alpine Tomcat のバージョン 9、jre バージョン 8、およびベースとして alpine イメージを使用するイメージを取得できます。これは画像のサイズを小さくするために重要です。
初めての Docker 入門 - 20
ご覧のとおり、その違いは非常に大きいです。Tomcata alpine に基づいてイメージを構築する場合、600 メガバイトではなく、わずか 100 メガバイトから開始します。したがって、以前に作成した dockerfile に次のコンテンツを追加します。
# Базовый образ, "наследуемся" от него
FROM tomcat:9-jre8-alpine
# Копируем из Build Context'а собранный web archive в каталог томката
COPY build/libs/docker.war /usr/local/tomcat/webapps/docker.war
# Меняем рабочий каталог на томкатовский
WORKDIR /usr/local/tomcat
# Открываем порт 8080 для контейнера, т.к. его слушает томкат
EXPOSE 8080
次に、コマンドを実行してイメージを構築しましょうdocker build -t jrdocker .
Docker との出会い - 21
-t- これはタグ、つまり組み立てられた画像と呼ばれるものです。最後のドットは、現在のディレクトリ (dockerfile が配置され、コマンドを実行したディレクトリ) を に追加することを意味しますBuild contextBuild context- これは、dockerfile の作成時に使用できるファイルのコンテキストです。ご覧のとおり、これのおかげで、組み立てられた war ファイルをイメージの Web サーバー ディレクトリにコピーすることができました。次に、イメージを実行してみましょう。docker run -d --rm -p 8888:8080 jrdocker
Docker との出会い - 22
サーバーが起動したかどうかを確認するには、コンテナーのログを確認します。ログは、コンテナーを ID または名前で指定して docker logs コマンドを使用して取得できます。例えば:
Docker との出会い - 23
さて、次のコマンドを使用すると、いつでも実行中のコンテナに名前でアクセスできることを忘れないでください。winpty docker exec -it NameКонтейнера sh あとは接続するだけです。以前は、 EXPOSEを指定しました。つまり、コンテナ内からポート 8080 へのアクセスを許可しました。コンテナ自体を起動するときに、 -p (受信ポート) タグを指定して、コンテナ (Tomcat Web サーバー) 上のポート 8080 を関連付けました。そこでは接続を待機しています)、Docker デーモンを備えたマシン上のポート 8888 を使用します。覚えているとおり、docker デーモンは直接起動したのではなく、docker-machine を通じて起動しました。したがって、もう一度 docker-machine ls コマンドを使用して Docker マシン上のデータを要求し、コンテナ内のサーバーに接続しましょう。
Docker の初めての紹介 - 24
したがって、あなたと私は、Docker コンテナで Web アプリケーションを起動したところです。)以下の点にも注意したい。アクセスの問題が発生した場合に備えて、Docker マシンは何よりもまず Virtual BOx 仮想マシンであることを思い出してください。仮想マシンのネットワーク設定に問題がある可能性があります。動作する VMBox 構成は次のようになります。
Docker との出会い - 25
Docker との出会い - 26

レイヤー

イメージが dockerfile から作成され、dockerfile がコマンドのセットであることはすでに理解しました。また、dockerfile には親があることもわかりました。そして画像のサイズも違います。興味深いことに、 dockerhistoryコマンドを使用すると、イメージがどのように構築されたかの歴史を確認できます。例えば:
Docker との出会い - 27
本質的に、各画像は一連の画像であることを理解するために、これを言うことが重要です。イメージを変更するたびに (dockerfile 内の新しいコマンドごとに)、独自の ID を持つ新しいレイヤーが作成されます。レイヤーの詳細については、ドキュメント「Docker: イメージとレイヤー」を参照してください。また、Habré に関する記事「Docker イメージと写真のコンテナー」を読むことを強くお勧めします。

結論

この短い概要でコンテナ化に興味を持っていただければ幸いです。以下は、役立つ可能性のある追加資料へのリンクです。 #ヴィアチェスラフ
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION