Ένας οδηγός για αρχάριους για το Docker - πώς να δημιουργήσετε μια πλευρά πελάτη / διακομιστή με βάση σύνθεσης

Είστε προγραμματιστής και θέλετε να ανακαλύψετε το docker-compose; Αυτό το άρθρο δημιουργήθηκε για εσάς.

Μετά από μια σύντομη εισαγωγή στο Docker-Compose, θα μπορείτε να δημιουργήσετε την πρώτη σας εφαρμογή πελάτη / διακομιστή με το Docker.

Αυτό το άρθρο λαμβάνει υπόψη ότι γνωρίζετε τα βασικά του Docker. Εάν όχι, μην πανικοβληθείτε! Προτείνω να διαβάσετε το πρώτο μου άρθρο για να ανακαλύψετε το Docker και να μάθετε πώς να δημιουργείτε την πρώτη σας εφαρμογή.

Ένας οδηγός για αρχάριους στο Docker - πώς να δημιουργήσετε την πρώτη σας εφαρμογή Docker

Είστε προγραμματιστής και θέλετε να ξεκινήσετε με το Docker; Αυτό το άρθρο δημιουργήθηκε για εσάς. Μετά από μια σύντομη εισαγωγή για το τι είναι το Docker και γιατί να το χρησιμοποιήσετε, θα μπορείτε να δημιουργήσετε την πρώτη σας εφαρμογή με το Docker.

Τι είναι το Docker-Compose;

Το Docker-Compose είναι ένα εργαλείο που παρέχεται από το Docker. Για να το καταστήσουμε απλό, αυτό το εργαλείο εφαρμόζεται για την επίλυση αρχιτεκτονικών προβλημάτων στα έργα σας.

Όπως ίσως έχετε παρατηρήσει στο προηγούμενο άρθρο μου, δημιουργήσαμε ένα απλό πρόγραμμα που έδειχνε "Το Docker is magic!" όταν κυκλοφόρησε.

Δυστυχώς, όταν είστε προγραμματιστής σπάνια δημιουργείτε ένα αυτόνομο πρόγραμμα (ένα πρόγραμμα που δεν απαιτεί την εκτέλεση άλλων υπηρεσιών, όπως μια βάση δεδομένων).

Ωστόσο, πώς ξέρετε εάν χρειάζεστε το Docker-Compose; Είναι πολύ απλό - εάν η εφαρμογή σας απαιτεί αρκετές υπηρεσίες για την εκτέλεση, χρειάζεστε αυτό το εργαλείο. Για παράδειγμα, εάν δημιουργήσετε έναν ιστότοπο που πρέπει να συνδεθεί στη βάση δεδομένων σας για έλεγχο ταυτότητας χρηστών (εδώ 2 υπηρεσίες, ιστότοπος και βάση δεδομένων).

Το Docker-compose σας προσφέρει τη δυνατότητα εκκίνησης όλων αυτών των υπηρεσιών με μία μόνο εντολή.

Διαφορά μεταξύ Docker και Docker-Compose

Το Docker χρησιμοποιείται για τη διαχείριση ενός μεμονωμένου κοντέινερ (υπηρεσία) για την εφαρμογή σας.

Το Docker-Compose χρησιμοποιείται για τη διαχείριση πολλών κοντέινερ ταυτόχρονα για την ίδια εφαρμογή. Αυτό το εργαλείο προσφέρει τις ίδιες δυνατότητες με το Docker, αλλά σας επιτρέπει να έχετε πιο περίπλοκες εφαρμογές.

Μια τυπική περίπτωση χρήσης

Αυτό το εργαλείο μπορεί να γίνει πολύ ισχυρό και σας επιτρέπει να αναπτύξετε εφαρμογές με πολύπλοκες αρχιτεκτονικές πολύ γρήγορα. Θα σας δώσω μια συγκεκριμένη μελέτη περίπτωσης που θα αποδείξει ότι τη χρειάζεστε.

Φανταστείτε, είστε ο περήφανος δημιουργός του λογισμικού ιστού σας.

Η λύση σας προσφέρει δύο ιστότοπους. Το πρώτο επιτρέπει στα καταστήματα να δημιουργήσουν το ηλεκτρονικό τους κατάστημα με λίγα μόνο κλικ. Το δεύτερο είναι αφιερωμένο στην υποστήριξη πελατών. Αυτοί οι δύο ιστότοποι αλληλεπιδρούν με την ίδια βάση δεδομένων.

Αρχίζετε να είστε επιτυχημένοι και ο διακομιστής σας δεν επαρκεί πλέον. Έτσι, αποφασίζετε να μεταφέρετε ολόκληρο το λογισμικό σας σε άλλο μηχάνημα.

Δυστυχώς, δεν χρησιμοποιήσατε το πρόγραμμα σύνθεσης. Έτσι θα πρέπει να μετεγκαταστήσετε και να διαμορφώσετε εκ νέου τις υπηρεσίες σας το ένα μετά το άλλο, ελπίζοντας ότι δεν έχει ξεχαστεί τίποτα.

Εάν είχατε χρησιμοποιήσει μια σύνταξη σύνδεσης, σε λίγες μόνο εντολές θα έχετε αναπτύξει ολόκληρη την αρχιτεκτονική σας στον νέο σας διακομιστή. Το μόνο που έχετε να κάνετε τώρα είναι να κάνετε μερικές διαμορφώσεις και να φορτώσετε το αντίγραφο ασφαλείας της βάσης δεδομένων σας για να ολοκληρώσετε τη μετεγκατάσταση.

Τώρα ας δημιουργήσουμε την πρώτη σας εφαρμογή πελάτη / διακομιστή με το Docker-Compose

Τώρα που γνωρίζετε τι πρόκειται να χρησιμοποιηθεί για σύνταξη σύνδεσης, ήρθε η ώρα να δημιουργήσετε την πρώτη σας εφαρμογή πελάτη / διακομιστή!

Ο στόχος αυτού του σεμιναρίου είναι να δημιουργήσει έναν μικρό ιστότοπο (διακομιστής) στο Python που θα περιέχει μια πρόταση. Αυτή η πρόταση πρέπει να ανακτηθεί από ένα πρόγραμμα (πελάτης) στο Python που θα εμφανίζει την πρόταση.

Σημείωση: Αυτό το σεμινάριο λαμβάνει υπόψη ότι έχετε ήδη εγκαταστήσει το Docker στον υπολογιστή σας και ότι έχετε τα βασικά. Εάν αυτό δεν ισχύει, σας καλώ να ανατρέξετε στο προηγούμενο άρθρο μου.

1. Δημιουργήστε το έργο σας

Για να δημιουργήσετε την πρώτη σας εφαρμογή πελάτη / διακομιστή, σας καλώ να δημιουργήσετε ένα φάκελο στον υπολογιστή σας. Πρέπει να περιέχει στο root το ακόλουθο αρχείο και φακέλους:

  • Ένα αρχείο « docker-compose.yml » (αρχείο σύνθεσης docker που θα περιέχει τις απαραίτητες οδηγίες για τη δημιουργία των διαφορετικών υπηρεσιών).
  • Ένας φάκελος « διακομιστής » (αυτός ο φάκελος θα περιέχει τα απαραίτητα αρχεία για τη ρύθμιση του διακομιστή).
  • Ένας φάκελος « πελάτης » (αυτός ο φάκελος θα περιέχει τα απαραίτητα αρχεία για τη ρύθμιση του προγράμματος-πελάτη).

Κανονικά θα πρέπει να έχετε αυτήν την αρχιτεκτονική φακέλων:

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

2. Δημιουργήστε τον διακομιστή σας

Για να ξεκινήσουμε με υπενθυμίσεις των βασικών στοιχείων του Docker, θα ξεκινήσουμε δημιουργώντας τον διακομιστή.

2α. Δημιουργήστε αρχεία

Μεταβείτε στο φάκελο " διακομιστής " και δημιουργήστε τα ακόλουθα αρχεία:

  • Ένα αρχείο " server.py " (αρχείο python που θα περιέχει τον κωδικό διακομιστή).
  • Ένα αρχείο « index.html » (αρχείο html που θα περιέχει την πρόταση που θα εμφανίζεται).
  • Ένα αρχείο « Dockerfile » (αρχείο docker που θα περιέχει τις απαραίτητες οδηγίες για τη δημιουργία του περιβάλλοντος του διακομιστή).

Κανονικά θα πρέπει να έχετε αυτήν την αρχιτεκτονική φακέλων στην ακόλουθη διαδρομή « διακομιστής / »:

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

2β. Επεξεργαστείτε το αρχείο 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()

Αυτός ο κωδικός θα σας επιτρέψει να δημιουργήσετε έναν απλό διακομιστή ιστού μέσα σε αυτόν το φάκελο. Θα ανακτήσει το περιεχόμενο του αρχείου index.html για να το μοιραστεί σε μια ιστοσελίδα.

2γ. Επεξεργαστείτε το αρχείο Html

Μπορείτε να προσθέσετε την ακόλουθη πρόταση στο αρχείο " index.html ":

Docker-Compose is magic!

Αυτό το αρχείο θα κοινοποιηθεί από τον διακομιστή κατά την εκκίνησή του και θα εμφανιστεί αυτή η πρόταση.

2δ. Επεξεργαστείτε το αρχείο Docker

Here we will create a basic Dockerfile that will be in charge of executing our Python file. We will use the official image created to execute 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. Create your client

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()

Αυτός ο κωδικός θα σας επιτρέψει να λάβετε το περιεχόμενο της ιστοσελίδας του διακομιστή και να το εμφανίσετε.

3γ. Επεξεργαστείτε το αρχείο Docker

Όσο για τον διακομιστή, θα δημιουργήσουμε ένα βασικό Dockerfile που θα είναι υπεύθυνο για την εκτέλεση του αρχείου 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. Επιστροφή στο Docker-Compose

Όπως ίσως έχετε παρατηρήσει, έχουμε δημιουργήσει δύο διαφορετικά έργα, τον διακομιστή και τον πελάτη, και τα δύο με ένα 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-Compose

Μόλις ρυθμιστεί η σύνταξη σύνδεσης, πρέπει να δημιουργηθεί η εφαρμογή πελάτη / διακομιστή. Αυτό το βήμα αντιστοιχεί στην εντολή "docker build" αλλά εφαρμόζεται στις διάφορες υπηρεσίες.

$ docker-compose build

6. Εκτελέστε το Docker-Compose

Η σύνθεσή σας είναι κατασκευασμένη! Τώρα ήρθε η ώρα να ξεκινήσετε! Αυτό το βήμα αντιστοιχεί στην εντολή "docker run" αλλά εφαρμόζεται στις διάφορες υπηρεσίες.

$ docker-compose up

Ορίστε, αυτό είναι. Θα πρέπει κανονικά να βλέπετε "Το Docker-Compose είναι μαγικό!" εμφανίζεται στο τερματικό σας.

Σημείωση: Όπως αναφέρεται στο σεμινάριο, η υπηρεσία «διακομιστής» χρησιμοποιεί τη θύρα 1234 του υπολογιστή σας για τη διανομή του περιεχομένου του. Εάν ανοίξετε τη σελίδα "// localhost: 1234 /" στον υπολογιστή σας, θα πρέπει να δείτε "Το Docker-Compose is magic!".

Ο κωδικός είναι διαθέσιμος

Εάν θέλετε να ανακτήσετε τον πλήρη κώδικα για να τον ανακαλύψετε πιο απλά ή να τον εκτελέσετε, τον έχω θέσει στη διάθεσή σας στο Github μου.

-> GitHub: Client Server Docker-Compose example

Useful commands for Docker

As usual, I have prepared a list of orders that may be useful to you with 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.

Μπορείτε να βρείτε άλλα άρθρα όπως αυτό στον ιστότοπό μου: herewecode.io.

Θέλουν περισσότερα?

  • Κάθε εβδομάδα λαμβάνετε ένα παρακινητικό απόσπασμα με κάποιες συμβουλές, ένα σύντομο σεμινάριο σε μερικές διαφάνειες και μια εικόνα ενός προγραμματιστή στο Instagram.
  • Εγγραφείτε στο ενημερωτικό δελτίο και λάβετε τα πιο πρόσφατα άρθρα, μαθήματα, σεμινάρια, συμβουλές, βιβλία, κίνητρα και άλλο αποκλειστικό περιεχόμενο.