これは、段階的に作業しながら Docker がどのように機能するかを基本的に理解するための簡単なデモンストレーションにすぎません。私はこのように docker を学び、学習中に直面したいくつかの問題を解決し、他の初心者に役立つようにこのリポジトリを作成しました。楽しく学んでいただければ幸いです。気に入ったら GitHub にあげて私の仕事をサポートしてください。
重要:- Readme のサイズを見て考え直すかもしれませんが、正直に言うと、最初から作業すれば問題は発生せず、途中で学習できるでしょう。
ウィキペディアでは Docker を次のように定義しています
は、OS レベルの仮想化を使用してソフトウェアをコンテナと呼ばれるパッケージで配信する、サービスとしてのプラットフォーム (PaaS) 製品のセットです。コンテナは相互に分離されており、そのソフトウェア、ライブラリ、構成ファイルがバンドルされています。明確に定義されたチャネルを通じて相互に通信できます。すべてのコンテナーは単一のオペレーティング システム カーネルによって実行されるため、仮想マシンよりも使用するリソースが少なくなります。
Docker は、アプリケーションをサンドボックス (コンテナーと呼ばれる) により効率的にデプロイして、ホスト オペレーティング システム (Mac) 上で実行するのに役立ちます。 docker の主な利点は、ソフトウェアとそのすべての依存関係を単一の標準化されたユニットにパッケージ化できることです。
コンテナーは、あるコンピューティング環境から別のコンピューティング環境に移動するときにソフトウェアを問題なく実行するためのソリューションです。これは、ステージング環境から本番環境への移行、あるいはラップトップから別のオペレーティング システムを搭載した別のラップトップへの移行である可能性があります。
コンテナーは、アプリケーションを実行環境から抽象化できる論理パッケージ化メカニズムを提供します。主な違いは、すべてのコンテナが本格的な OS を必要としないことです。単一ホスト上のすべてのコンテナが単一の OS を共有します。これは、CPU、RAM などの大量のシステム リソースを解放するのに役立ちます。
Docker のインストールが完了したら、以下を実行して Docker のインストールをテストします。
docker run hello-world
Hello from Docker.
This message shows that your installation appears to be working correctly.
...
Dockerfile
は、イメージを作成するためにコマンド ラインで呼び出すことができるすべてのコマンドを含むテキスト ドキュメントです。ファイルhello.js
を作成し、このコードをそこにコピーします。ここでは、 localhost:8888
に Hello World を表示する簡単な JS コードを作成しました。 var http = require( " http " ) ;
http.createServer(function (request, response) {
response.writeHead(200, { ' Content-Type ' : ' text/plain ' }) ;
response.end( ' Hello Worldn ' ) ;
}).listen(8888) ;
// Console will print the message
console.log( ' Server running at http://127.0.0.1:8888/ ' ) ;
Dockerfile
という名前のファイルを作成し、このコードをそこにコピーします。 FROM node:8
LABEL maintainer= " [email protected] "
RUN npm install
ADD hello.js /hello.js
EXPOSE 8888
ENTRYPOINT [ " node " , " hello.js " ]
たとえこれが初めて見た Dockerfile であっても、ここで何が起こっているかは十分に推測できると思います。 Dockerfile 命令は、 FROM、 ENV、 LABEL、 RUN 、 ADD 、 EXPOSE、および ENTRYPOINT です。大文字で表記されていますが、これは慣例であり、必須ではありません。
大まかに言うと、この Dockerfile は、ノード イメージから開始する、メンテナとして“[email protected]”
を追加する、 npm install
実行して依存関係をインストールする、アプリケーション コードにファイルをコピーする、アプリのネットワーク ポートを文書化する、などの指示を与えます。そして、実行するデフォルトのアプリケーションとして hello.js を設定します。
次に、ローカル マシンに Docker イメージを作成します。現在のプロジェクトのフォルダーでターミナルを開き、実行します
docker build -t helloworld .
ここでは、現在のディレクトリの内容に基づいてhelloworld
というイメージをビルドするように Docker に指示しています (ビルド コマンドの末尾のドット (.)に注意してください)。 Docker はディレクトリ内で Dockerfile を検索し、ファイル内の指示に基づいてイメージを構築します。
Docker イメージを構築した後の次のステップは、イメージを実行して動作するかどうかを確認することです。
docker run -p 8888:8888 helloworld
実行したコマンドはコンテナ内のサーバーにポート 8888 を使用し、これをポート 8888 で外部に公開しました。ポート 8888 の URL に移動します。
おめでとうございます!最初の Docker イメージが正常に作成されました。
Docker イメージは仮想マシン テンプレートのようなもので、コンテナーを起動するために使用されます。内部では、これらは 1 つ以上の読み取り専用レイヤーで構成されており、これらを積み重ねることで全体のイメージを構成します。 Docker は、これらのレイヤーを積み重ねて、単一の統合されたオブジェクトとして表現します。注: Docker イメージは不変であるため、Docker イメージは決して変更できません。作成したら削除できますが、変更することはできません。
Docker イメージには、パッケージ化したすべてのファイルが含まれており、これがコンテナーのファイルシステムになります。また、イメージ自体に関する多くのメタデータも含まれています。これには、イメージがどのように構築されたかについての簡単な履歴が含まれます。これを使用して、画像の各レイヤーと、レイヤーを構築したコマンドを確認できます。以下を使用して、 helloworld
イメージの履歴を確認できます。
docker image history helloworld
IMAGE CREATED CREATED BY COMMENT
cb84eb33ca20 58 seconds ago /bin/sh -c # (nop) ENTRYPOINT ["node" "hello…
7d652a817a9f 58 seconds ago /bin/sh -c # (nop) EXPOSE 8888
334575e947c9 59 seconds ago /bin/sh -c # (nop) ADD file:b9606ef53b832e66e…
CREATED BY
コマンドは Dockerfile の命令です。1 対 1 の関係があるため、Dockerfile の各行はイメージ レイヤーを作成します。
まず、dockerhub アカウントでログインする必要があります。
docker login --username $dockerId
ログインしたので、自分のアカウントまたはアクセスできる組織に画像をプッシュできます。どの組織のメンバーでもない場合は、自分のアカウント内のリポジトリにのみイメージをプッシュできます。
helloworld
という Docker イメージを構築しました。このイメージ参照にはアカウント名がないため、レジストリにプッシュできません。新しい参照を与えるためにイメージを再構築する必要はありませんが、イメージには複数の参照を持つことができます。次のように画像にタグを付けます。
docker image tag helloworld $dockerId /helloworld:v1
これで、アカウント名に Docker ID を含むイメージ参照が作成され、Docker Hub にログインしたので、イメージを共有する準備が整いました。 docker image Push コマンドは pull コマンドに相当し、ローカル イメージ レイヤーをレジストリにアップロードします。
docker image push championshuttler/helloworld:v1
The push refers to a repository [docker.io/championshuttler/helloworld]
9519a21ac374: Pushed
Docker イメージ タグには任意の文字列を入れることができ、すでに見たように、同じイメージに複数のタグを含めることができます。これを使用してイメージ内のソフトウェアのバージョンを管理し、ユーザーが使用しないものについて情報に基づいた選択ができるようにします。また、他の人のイメージを使用する場合にも、情報に基づいた選択ができるようにします。
多くのソフトウェア プロジェクトでは、小数点を含む数値バージョン管理スキームを使用して、バージョン間の変更の大きさを示しており、イメージ タグでそれを追跡できます。基本的な考え方は [メジャー].[マイナー].[パッチ] のようなもので、暗黙の保証がいくつかあります。パッチ番号を増やすだけのリリースにはバグ修正が含まれている可能性がありますが、最後のバージョンと同じ機能が含まれている必要があります。マイナー バージョンを増やすリリースでは機能が追加される可能性がありますが、削除されるべきではありません。メジャー リリースにはまったく異なる機能が含まれる可能性があります。
ほとんどのアプリケーションは、単一のコンポーネントで実行されるわけではありません。大規模な古いアプリであっても、通常はフロントエンド コンポーネントとバックエンド コンポーネントとして構築されており、これらは物理的に分散されたコンポーネントで実行される個別の論理レイヤーです。 Docker は、n 層モノリスから最新のマイクロサービスまで、分散アプリケーションの実行に最適です。各コンポーネントは軽量コンテナ内で実行され、Docker は標準のネットワーク プロトコルを使用してコンポーネントを接続します。このようなマルチコンテナー アプリを定義および管理するには、Docker Compose を使用します。 Docker Compose は、複数コンテナーの Docker アプリケーションを定義および実行するためのツールです。 Compose では、 YAML
ファイルを使用してアプリケーションのサービスを構成します。次に、単一のコマンドで、構成に基づいてすべてのサービスを作成して開始します。
Docker Compose ファイルは、アプリの望ましい状態、つまりすべてが実行されているときにどのように見えるべきかを記述します。これは、Docker コンテナーの実行コマンドに含めるすべてのオプションを Compose ファイルに取り込む単純なファイル形式です。次に、Docker Compose ツールを使用してアプリを実行します。必要な Docker リソース (コンテナー、ネットワーク、ボリュームなど) を判断し、それらを作成するリクエストを Docker API に送信します。 Compose YAML ファイルのデフォルト名はdocker-compose.yml
です。ただし、 -fフラグを使用してカスタム ファイル名を指定できます。
始めましょう。
以下のコードは、2 つのサービス (Web フロントエンドと Redis) を持つ小さな Flask アプリを定義する非常に単純なDocker Compose
ファイルを示しています。このアプリは、訪問数をカウントし、その値を Redis に保存する単純な Web サーバーです。
version: " 3.5 "
services:
web-frontend:
build: .
command: python app.py
ports:
- target: 8888
published: 8888
networks:
- counter-net
volumes:
- type: volume
source: counter-vol
target: /code
redis:
image: " redis:alpine "
networks:
counter-net:
networks:
counter-net:
volumes:
counter-vol:
version
キーは必要であり、常にファイルの最初の行に置く必要があります。これは、 Compose file
形式 (基本的には API) のバージョンについて説明します。
最上位のservices
キーは、さまざまなアプリケーション サービスを定義する場所です。私たちが使用している例では、2 つのサービスを定義しています。 web web-frontend
エンドと、Redis と呼ばれるメモリ内データベースです。 Compose は、これらの各サービスをコンテナとしてデプロイします。
最上位のnetworks
キーは、Docker に新しいネットワークを作成するように指示します。デフォルトでは、Compose はブリッジ ネットワークを作成します。これらは、同じホスト上のコンテナーのみに接続できる単一ホスト ネットワークです。
Web フロントエンド サービスの定義内で、Docker に次の指示を与えます。
前のセクションの Compose ファイルで定義されたアプリをデプロイします。これを行うには、https://github.com/championshuttler/counter-app から次の 4 つのファイルが必要です。
Git リポジトリのクローンをローカルに作成します。
git clone https://github.com/championshuttler/counter-app.git
各ファイルについて簡単に説明しましょう。
app.py
アプリケーション コード (Python Flask アプリ) です。docker-compose.yml
は、Docker がアプリをデプロイする方法を記述した Docker Compose ファイルです。Dockerfile
Web フロントエンド サービスのイメージを構築する方法が記述されています。requirements.txt
アプリに必要な Python パッケージがリストされています。 Compose を使用してアプリを起動しましょう。次のコマンドはすべて、 counter-app
ディレクトリ内から実行する必要があります。
docker-compose up &
アプリが起動するまでに数秒かかり、出力は非常に冗長になる場合があります。
アプリケーションが正常にデプロイされたら、Web ブラウザーでport 5000
の Docker ホストを指定すると、アプリケーションのすべての栄光を確認できます。
チュートリアルは完全に混乱していると思いましたか、それとも楽しくて何かを学ぶことができましたか?ご意見を私に直接送っていただくか、問題を作成してください。 Twitter でも私を見つけて、疑問があればお気軽に質問してください。
このチュートリアルの体験についてぜひお聞かせください。学習を楽しんでいただければ幸いです。気に入っていただけましたら、GitHub で評価して私の仕事をサポートしてください。