Un ghid pentru începători către Docker - cum să creați o parte client / server cu docker-compose

Sunteți dezvoltator și doriți să descoperiți docker-compose? Acest articol este făcut pentru dvs.

După o scurtă introducere pe Docker-Compose, veți putea crea prima aplicație client / server cu Docker.

Acest articol ia în considerare faptul că știți elementele de bază ale Docker. Dacă nu, nu intrați în panică! Vă sugerez să citiți primul meu articol pentru a descoperi Docker și să aflați cum să creați prima aplicație.

Un ghid pentru începători către Docker - cum să creați prima aplicație Docker

Sunteți dezvoltator și doriți să începeți cu Docker? Acest articol este făcut pentru dvs. După o scurtă introducere despre ce este Docker și de ce să îl utilizați, veți putea crea prima aplicație cu Docker.

Ce este Docker-Compose?

Docker-Compose este un instrument furnizat de Docker. Pentru a simplifica acest instrument, acest instrument este implementat pentru a rezolva problemele arhitecturale din proiectele dvs.

După cum probabil ați observat în articolul meu anterior, am creat un program simplu care afișa „Docker is magic!” când a fost lansat.

Din păcate, când ești dezvoltator, creezi rar un program autonom (un program care nu necesită alte servicii pentru a rula, cum ar fi o bază de date).

Cu toate acestea, de unde știi dacă ai nevoie de Docker-Compose? Este foarte simplu - dacă aplicația dvs. necesită mai multe servicii pentru a rula, aveți nevoie de acest instrument. De exemplu, dacă creați un site web care trebuie să se conecteze la baza de date pentru a autentifica utilizatorii (aici 2 servicii, site și bază de date).

Docker-compose vă oferă posibilitatea de a lansa toate aceste servicii într-o singură comandă.

Diferența dintre Docker și Docker-Compose

Docker este utilizat pentru a gestiona un container (serviciu) individual pentru aplicația dvs.

Docker-Compose este utilizat pentru a gestiona mai multe containere în același timp pentru aceeași aplicație. Acest instrument oferă aceleași caracteristici ca și Docker, dar vă permite să aveți aplicații mai complexe.

Un caz de utilizare tipic

Acest instrument poate deveni foarte puternic și vă permite să implementați foarte rapid aplicații cu arhitecturi complexe. Vă voi oferi un studiu de caz concret care va demonstra că aveți nevoie de el.

Imaginați-vă, sunteți mândrul creator al software-ului dvs. web.

Soluția dvs. oferă două site-uri web. Primul permite magazinelor să își creeze magazinul online în doar câteva clicuri. Al doilea este dedicat asistenței pentru clienți. Aceste două site-uri interacționează cu aceeași bază de date.

Începi să ai succes și serverul tău nu mai este suficient. Deci, decideți să vă migrați întregul software pe o altă mașină.

Din păcate, nu ați folosit docker-compose. Așa că va trebui să migrați și să vă reconfigurați serviciile unul după altul, sperând că nu va fi uitat nimic.

Dacă ați fi folosit un docker-compose, în doar câteva comenzi ați fi implementat întreaga dvs. arhitectură pe noul dvs. server. Tot ce trebuie să faceți acum este să faceți câteva configurații și să încărcați copia de rezervă a bazei de date pentru a finaliza migrarea.

Acum, să creăm prima dvs. aplicație client / server cu Docker-Compose

Acum, că știți pentru ce va fi utilizat docker-compose, este timpul să vă creați prima aplicație client / server!

Obiectivul acestui tutorial este de a crea un mic site web (server) în Python care va conține o propoziție. Această propoziție trebuie recuperată de un program (client) din Python care va afișa propoziția.

Notă: Acest tutorial ia în considerare faptul că ați instalat deja Docker pe computer și că aveți elementele de bază. Dacă nu este cazul, vă invit să vă referiți la articolul meu anterior.

1. Creați-vă proiectul

Pentru a crea prima aplicație client / server, vă invit să creați un folder pe computer. Acesta trebuie să conțină la rădăcină următoarele fișiere și foldere:

  • Un fișier „ docker-compose.yml ” (fișier docker-compose care va conține instrucțiunile necesare pentru a crea diferitele servicii).
  • Un folder „ server ” (acest folder va conține fișierele necesare configurării serverului).
  • Un folder „ client ” (acest folder va conține fișierele necesare pentru configurarea clientului).

În mod normal, ar trebui să aveți această arhitectură de foldere:

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

2. Creați-vă serverul

Pentru a începe cu memento-uri de bază ale lui Docker, vom începe prin crearea serverului.

2a. Creați fișiere

Mutați-vă în folderul „ server ” și creați următoarele fișiere:

  • Un fișier „ server.py ” (fișier python care va conține codul serverului).
  • Un fișier „ index.html ” (fișier html care va conține propoziția care trebuie afișată).
  • Un fișier „ Dockerfile ” (fișier docker care va conține instrucțiunile necesare pentru a crea mediul serverului).

În mod normal, ar trebui să aveți această arhitectură de folder în următoarea cale „ server / ”:

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

2b. Editați fișierul Python

Puteți adăuga următorul cod în fișierul „ 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()

Acest cod vă va permite să creați un server web simplu în acest folder. Acesta va prelua conținutul fișierului index.html pentru al partaja pe o pagină web.

2c. Editați fișierul HTML

Puteți adăuga următoarea propoziție în fișierul „ index.html ”:

Docker-Compose is magic!

Acest fișier va fi partajat de server la pornire și va fi afișată această propoziție.

2d. Editați fișierul Docker

Aici vom crea un fișier Docker de bază care va fi însărcinat cu executarea fișierului nostru Python. Vom folosi imaginea oficială creată pentru a executa 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. Creați-vă clientul

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

În ceea ce privește serverul, vom crea un fișier Docker de bază care va fi însărcinat cu executarea fișierului nostru Python.

# 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. Înapoi la Docker-Compose

După cum probabil ați observat, am creat două proiecte diferite, serverul și clientul, ambele cu un fișier Docker.

Până acum nu s-a schimbat nimic din elementele de bază pe care le cunoașteți deja.

Acum vom edita „ docker-compose.yml ” la rădăcina depozitului.

Notă: Docker-Compose fiind foarte complet, acest articol își propune să vă ofere un exemplu concret și tipic. De aceea nu veți vedea toate cuvintele cheie.
# 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. Construiți Docker-Compose

Odată ce docker-compose este configurat, aplicația dvs. client / server trebuie să fie construită. Acest pas corespunde comenzii „docker build” dar aplicat diferitelor servicii.

$ docker-compose build

6. Rulați Docker-Compose

Docker-compunerea dvs. este construită! Acum este timpul să începem! Acest pas corespunde comenzii „docker run”, dar aplicat diferitelor servicii.

$ docker-compose up

Uite, gata. În mod normal, ar trebui să vedeți „Docker-Compose is magic!” afișat în terminalul dvs.

Notă: După cum se indică în tutorial, serviciul dvs. „server” folosește portul 1234 al computerului pentru a distribui conținutul acestuia. Dacă deschideți pagina „// localhost: 1234 /” pe computer, ar trebui să vedeți „Docker-Compose is magic!”.

Codul este disponibil

Dacă doriți să recuperați codul complet pentru a-l descoperi mai simplu sau pentru a-l executa, l-am pus la dispoziția dvs. pe Github.

-> GitHub: Exemplu Client Server Docker-Compose

Comenzi utile pentru Docker

Ca de obicei, am pregătit o listă de comenzi care vă pot fi utile cu 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.