Dockerの初心者向けガイド—docker-composeを使用してクライアント/サーバー側を作成する方法

あなたは開発者であり、docker-composeを発見したいですか?この記事はあなたのために作られています。

Docker-Composeの簡単な紹介の後、Dockerを使用して最初のクライアント/サーバー側アプリケーションを作成できるようになります。

この記事では、Dockerの基本を知っていることを考慮に入れています。そうでない場合でも、慌てる必要はありません。私の最初の記事を読んでDockerを発見し、最初のアプリケーションを作成する方法を学ぶことをお勧めします。

Dockerの初心者向けガイド—最初のDockerアプリケーションを作成する方法

あなたは開発者であり、Dockerから始めたいですか?この記事はあなたのために作られています。Dockerとは何か、なぜDockerを使用するのかについて簡単に紹介した後、Dockerを使用して最初のアプリケーションを作成できるようになります。

Docker-Composeとは何ですか?

Docker-Composeは、Dockerが提供するツールです。簡単にするために、このツールはプロジェクトのアーキテクチャ上の問題を解決するために実装されています。

前回の記事でお気づきかもしれませんが、「Dockerは魔法です!」と表示する簡単なプログラムを作成しました。それが発売されたとき。

残念ながら、開発者の場合、スタンドアロンプ​​ログラム(データベースなどの他のサービスの実行を必要としないプログラム)を作成することはめったにありません。

ただし、Docker-Composeが必要かどうかはどうやってわかりますか?非常に簡単です。アプリケーションの実行に複数のサービスが必要な場合は、このツールが必要です。たとえば、ユーザーを認証するためにデータベースに接続する必要があるWebサイト(ここでは2つのサービス、Webサイトとデータベース)を作成する場合です。

Docker-composeは、これらすべてのサービスを1つのコマンドで起動する可能性を提供します。

DockerとDocker-Composeの違い

Dockerは、アプリケーションの個々のコンテナー(サービス)を管理するために使用されます。

Docker-Composeは、同じアプリケーションの複数のコンテナーを同時に管理するために使用されます。このツールはDockerと同じ機能を提供しますが、より複雑なアプリケーションを使用できます。

典型的なユースケース

このツールは非常に強力になり、複雑なアーキテクチャのアプリケーションを非常に迅速にデプロイできるようになります。私はあなたがそれを必要としていることを証明する具体的なケーススタディをあなたに与えるでしょう。

あなたがあなたのウェブソフトウェアの誇り高い作成者であると想像してください。

あなたのソリューションは2つのウェブサイトを提供します。1つ目は、ストアが数回クリックするだけでオンラインストアを作成できるようにします。2つ目は、カスタマーサポート専用です。これらの2つのサイトは、同じデータベースと相互作用します。

あなたは成功し始めており、あなたのサーバーはもはや十分ではありません。そのため、ソフトウェア全体を別のマシンに移行することにしました。

残念ながら、docker-composeは使用していません。したがって、何も忘れられていないことを期待して、サービスを次々に移行および再構成する必要があります。

docker-composeを使用した場合、わずかなコマンドで、アーキテクチャ全体を新しいサーバーにデプロイできます。ここで行う必要があるのは、いくつかの構成を行い、データベースのバックアップをロードして移行を完了することです。

それでは、Docker-Composeを使用して最初のクライアント/サーバー側アプリケーションを作成しましょう。

docker-composeが何に使用されるかがわかったので、次は最初のクライアント/サーバー側アプリケーションを作成します。

このチュートリアルの目的は、文を含むPythonで小さなWebサイト(サーバー)を作成することです。この文は、文を表示するPythonのプログラム(クライアント)によって取得される必要があります。

注:このチュートリアルでは、コンピューターにDockerが既にインストールされており、基本事項があることを考慮しています。そうでない場合は、以前の記事を参照してください。

1.プロジェクトを作成します

最初のクライアント/サーバーアプリケーションを作成するには、コンピューター上にフォルダーを作成することをお勧めします。ルートに次のファイルとフォルダが含まれている必要があります。

  • ' docker-compose.yml 'ファイル(さまざまなサービスを作成するために必要な指示を含むdocker-composeファイル)。
  • 'サーバー'フォルダー(このフォルダーには、サーバーのセットアップに必要なファイルが含まれます)。
  • ' client 'フォルダー(このフォルダーには、クライアントのセットアップに必要なファイルが含まれます)。

通常、次のフォルダアーキテクチャが必要です。

. ├── client/ ├── docker-compose.yml └── server/ 2 directories, 1 file

2.サーバーを作成します

Dockerの基本を思い出させるために、サーバーを作成することから始めます。

2a。ファイルを作成する

' server 'フォルダーに移動し、次のファイルを作成します。

  • ' server.py 'ファイル(サーバーコードを含むPythonファイル)。
  • ' index.html 'ファイル(表示される文を含むhtmlファイル)。
  • ' Dockerfile 'ファイル(サーバーの環境を作成するために必要な指示を含むdockerファイル)。

通常、このフォルダアーキテクチャは次のパスにあるはずです ' server / ':

. ├── Dockerfile ├── index.html └── server.py 0 directories, 3 files

2b。Pythonファイルを編集する

' server.py 'ファイルに次のコードを追加できます。

#!/usr/bin/env python3 # Import of python system libraries. # These libraries will be used to create the web server. # You don't have to install anything special, these libraries are installed with Python. import http.server import socketserver # This variable is going to handle the requests of our client on the server. handler = http.server.SimpleHTTPRequestHandler # Here we define that we want to start the server on port 1234. # Try to remember this information it will be very useful to us later with docker-compose. with socketserver.TCPServer(("", 1234), handler) as httpd: # This instruction will keep the server running, waiting for requests from the client. httpd.serve_forever()

このコードを使用すると、このフォルダー内に単純なWebサーバーを作成できます。index.htmlファイルのコンテンツを取得して、Webページで共有します。

2c。Htmlファイルを編集する

' index.html 'ファイルに次の文を追加できます。

Docker-Compose is magic!

このファイルは、起動時にサーバーによって共有され、この文が表示されます。

2d。Dockerファイルを編集する

ここでは、Pythonファイルの実行を担当する基本的なDockerfileを作成します。Pythonを実行するために作成された公式イメージを使用します。

# Just a remember, dockerfile must always start by importing the base image. # We use the keyword 'FROM' to do that. # In our example, we want to import the python image (from DockerHub). # So, we write 'python' for the image name and 'latest' for the version. FROM python:latest # In order to launch our python code, we must import the 'server.py' and 'index.html' file. # We use the keyword 'ADD' to do that. # Just a remember, the first parameter 'server.py' is the name of the file on the host. # The second parameter '/server/' is the path where to put the file on the image. # Here we put files at the image '/server/' folder. ADD server.py /server/ ADD index.html /server/ # I would like to introduce something new, the 'WORKDIR' command. # This command changes the base directory of your image. # Here we define '/server/' as base directory (where all commands will be executed). WORKDIR /server/

3.クライアントを作成します

In order to continue with reminders of Docker’s basics, we will create the client.

3a. Create files

Move to your ‘client’ folder and create the following files:

  • A ‘client.py’ file (python file that will contain the client code).
  • A ‘Dockerfile’ file (docker file that will contain the necessary instructions to create the environment of the client).

Normally you should have this folder architecture in the following path ‘client/’:

. ├── client.py └── Dockerfile 0 directories, 2 files

3b. Edit the Python file

You can add the following code to the ‘client.py’ file:

#!/usr/bin/env python3 # Import of python system library. # This library is used to download the 'index.html' from server. # You don't have to install anything special, this library is installed with Python. import urllib.request # This variable contain the request on '//localhost:1234/'. # You must wondering what is '//localhost:1234'? # localhost: This means that the server is local. # 1234: Remember we define 1234 as the server port. fp = urllib.request.urlopen("//localhost:1234/") # 'encodedContent' correspond to the server response encoded ('index.html'). # 'decodedContent' correspond to the server response decoded (what we want to display). encodedContent = fp.read() decodedContent = encodedContent.decode("utf8") # Display the server file: 'index.html'. print(decodedContent) # Close the server connection. fp.close()

This code will allow you to get the content of the server web page and to display it.

3c. Edit the Docker file

サーバーに関しては、Pythonファイルの実行を担当する基本的なDockerfileを作成します。

# Same thing than the 'server' Dockerfile. FROM python:latest # Same thing than the 'server' Dockerfile. # We import 'client.py' in '/client/' folder. ADD client.py /client/ # I would like to introduce something new, the 'WORKDIR' command. # This command changes the base directory of your image. # Here we define '/client/' as base directory. WORKDIR /client/

4.Dockerに戻る-作成

お気づきかもしれませんが、サーバーとクライアントの2つの異なるプロジェクトを、どちらもDockerfileを使用して作成しました。

これまでのところ、あなたがすでに知っている基本から何も変わっていません。

次に、リポジトリのルートにある「docker-compose.yml」を編集します。

注:Docker-Composeは非常に完成度が高いため、この記事は具体的で典型的な例を示すことを目的としています。そのため、すべてのキーワードが表示されるわけではありません。
# A docker-compose must always start by the version tag. # We use "3" because it's the last version at this time. version: "3" # You should know that docker-composes works with services. # 1 service = 1 container. # For example, a service maybe, a server, a client, a database... # We use the keyword 'services' to start to create services. services: # As we said at the beginning, we want to create: a server and a client. # That is two services. # First service (container): the server. # Here you are free to choose the keyword. # It will allow you to define what the service corresponds to. # We use the keyword 'server' for the server. server: # The keyword "build" will allow you to define # the path to the Dockerfile to use to create the image # that will allow you to execute the service. # Here 'server/' corresponds to the path to the server folder # that contains the Dockerfile to use. build: server/ # The command to execute once the image is created. # The following command will execute "python ./server.py". command: python ./server.py # Remember that we defined in'server/server.py' 1234 as port. # If we want to access the server from our computer (outside the container), # we must share the content port with our computer's port. # To do this, the keyword 'ports' will help us. # Its syntax is as follows: [port we want on our machine]:[port we want to retrieve in the container] # In our case, we want to use port 1234 on our machine and # retrieve port 1234 from the container (because it is on this port that # we broadcast the server). ports: - 1234:1234 # Second service (container): the client. # We use the keyword 'client' for the server. client: # Here 'client/ corresponds to the path to the client folder # that contains the Dockerfile to use. build: client/ # The command to execute once the image is created. # The following command will execute "python ./client.py". command: python ./client.py # The keyword 'network_mode' is used to define the network type. # Here we define that the container can access to the 'localhost' of the computer. network_mode: host # The keyword'depends_on' allows you to define whether the service # should wait until other services are ready before launching. # Here, we want the 'client' service to wait until the 'server' service is ready. depends_on: - server

5.Dockerのビルド-作成

docker-composeをセットアップしたら、クライアント/サーバーアプリケーションを構築する必要があります。このステップは「dockerbuild」コマンドに対応しますが、さまざまなサービスに適用されます。

$ docker-compose build

6.Dockerの実行-作成

docker-composeが構築されました!さあ、始めましょう!このステップは「dockerrun」コマンドに対応しますが、さまざまなサービスに適用されます。

$ docker-compose up

さあ、それだけです。通常、「Docker-作成は魔法です!」と表示されます。ターミナルに表示されます。

注:チュートリアルに示されているように、「サーバー」サービスはコンピューターのポート1234を使用してコンテンツを配布します。コンピューターで「// localhost:1234 /」ページを開くと、「Docker-Compose ismagic!」と表示されます。

コードが利用可能です

完全なコードを取得して、より簡単に検出したり、実行したりしたい場合は、Githubで自由に使用できます。

-> GitHub:クライアントサーバーDocker-作成例

Dockerの便利なコマンド

いつものように、docker-composeで役立つ注文のリストを用意しました。

  • Stops containers and removes containers, images… created by ‘docker-compose up’.
$ docker-compose down
  • Displays log output from services (example: ‘docker-compose logs -f client’).
$ docker-compose logs -f [service name]
  • Lists containers.
$ docker-compose ps
  • Executes a command in a running container (example: ‘docker-compose exec server ls’).
$ docker-compose exec [service name] [command]
  • Lists images.
$ docker-compose images

Conclusion

You can refer to this post every time you need a simple and concrete example on how to create a client/server-side with docker-compose. If you have any questions or feedback, feel free to ask.

Don't miss my content by following me on Twitter and Instagram.

You can find other articles like this on my website: herewecode.io.

Want more?

  • Each week get a motivational quote with some advice, a short tutorial into a few slides, and one developer's picture on Instagram.
  • Sign-up for the newsletter and get the latest articles, courses, tutorials, tips, books, motivation, and other exclusive content.