Посібник для початківців для Docker - як створити сторону клієнта / сервера за допомогою docker-compose

Ви розробник і хочете відкрити docker-compose? Ця стаття створена для вас.

Після короткого вступу в Docker-Compose ви зможете створити свій перший додаток на стороні клієнта / сервера за допомогою Docker.

Ця стаття враховує, що ви знаєте основи Docker. Якщо ні, не панікуйте! Я пропоную вам прочитати мою першу статтю, щоб відкрити Docker і навчитися створювати свою першу програму.

Посібник для початківців для Docker - як створити свою першу програму Docker

Ви розробник і хочете почати з Docker? Ця стаття створена для вас. Після короткого вступу про те, що таке Docker і чому його використовувати, ви зможете створити свою першу програму за допомогою Docker.

Що таке Docker-Compose?

Docker-Compose - це інструмент, який надає Docker. Для спрощення цей інструмент реалізований для вирішення архітектурних проблем у ваших проектах.

Як ви могли помітити в моїй попередній статті, ми створили просту програму, яка відображала "Docker - це магія!" коли він був запущений.

На жаль, коли ви розробник, ви рідко створюєте окрему програму (програму, яка не потребує будь-яких інших служб, таких як база даних).

Однак звідки ви знаєте, чи потрібен вам Docker-Compose? Це дуже просто - якщо для вашої програми потрібні кілька служб, вам потрібен цей інструмент. Наприклад, якщо ви створюєте веб-сайт, який повинен підключитися до вашої бази даних для автентифікації користувачів (тут 2 служби, веб-сайт та база даних).

Docker-compose пропонує вам можливість запустити всі ці служби однією командою.

Різниця між Docker та Docker-Compose

Docker використовується для управління окремим контейнером (службою) для вашої програми.

Docker-Compose використовується для керування декількома контейнерами одночасно для одного додатка. Цей інструмент пропонує ті самі функції, що і Docker, але дозволяє мати більш складні програми.

Типовий варіант використання

Цей інструмент може стати дуже потужним і дозволити дуже швидко розгорнути програми зі складною архітектурою. Я дам вам конкретне тематичне дослідження, яке доведе, що воно вам потрібно.

Уявіть, ви гордий творець веб-програмного забезпечення.

Ваше рішення пропонує два веб-сайти. Перший дозволяє магазинам створити свій Інтернет-магазин лише за кілька кліків. Другий присвячений підтримці клієнтів. Ці два сайти взаємодіють з однією базою даних.

Ви починаєте успішно працювати, і вашого сервера вже недостатньо. Отже, ви вирішили перенести все програмне забезпечення на іншу машину.

На жаль, ви не використовували docker-compose. Тож вам доведеться мігрувати та переналаштовувати свої послуги одна за одною, сподіваючись, що нічого не забуто.

Якби ви використовували docker-compose, лише за декілька команд ви б розгорнули всю свою архітектуру на новому сервері. Все, що вам потрібно зробити зараз, - це зробити кілька конфігурацій та завантажити резервну копію бази даних для завершення міграції.

Тепер давайте створимо вашу першу програму на стороні клієнта / сервера за допомогою Docker-Compose

Тепер, коли ви знаєте, для чого буде використовуватися docker-compose, настав час створити свій перший додаток на стороні клієнта / сервера!

Завдання цього посібника - створити невеликий веб-сайт (сервер) на Python, який міститиме речення. Це речення має отримати програма (клієнт) на Python, яка відображатиме речення.

Примітка: Цей посібник враховує, що ви вже встановили Docker на свій комп’ютер і що у вас є основи. Якщо це не так, я пропоную вам звернутися до моєї попередньої статті.

1. Створіть свій проект

Щоб створити свій перший клієнт / сервер, я запрошую вас створити папку на своєму комп’ютері. Він повинен містити в корені наступний файл та папки:

  • Файл ' docker-compose.yml ' (файл docker-compose.yml, який міститиме необхідні інструкції для створення різних служб).
  • Папка " сервер " (ця папка буде містити файли, необхідні для налаштування сервера).
  • Папка " клієнт " (ця папка буде містити файли, необхідні для налаштування клієнта).

Зазвичай у вас повинна бути така архітектура папок:

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

2. Створіть свій сервер

Для того, щоб розпочати з нагадування про основи Docker, ми почнемо із створення сервера.

2а. Створюйте файли

Перейдіть до папки " сервер " і створіть такі файли:

  • Файл ' server.py ' (файл python, який міститиме код сервера).
  • Файл ' index.html ' (файл html, який міститиме пропозицію для відображення).
  • Файл " Dockerfile " (файл docker, який міститиме необхідні інструкції для створення середовища сервера).

Зазвичай ця архітектура папки повинна бути в такому шляху ' server / ':

. ├── 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

Тут ми створимо базовий файл Docker, який буде відповідальним за виконання нашого файлу Python. Ми використаємо офіційний образ, створений для запуску 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

Що стосується сервера, ми створимо базовий файл Docker, який буде відповідальним за виконання нашого файлу 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-compose потрібно створити програму клієнт / сервер. Цей крок відповідає команді 'docker build', але застосовується до різних служб.

$ docker-compose build

6. Запустіть Docker-Compose

Ваш докер-композит створений! Тепер пора починати! Цей крок відповідає команді 'docker run', але застосовується до різних служб.

$ docker-compose up

Ось, ось і все. Зазвичай ви повинні бачити "Docker-Compose - це магія!" відображається у вашому терміналі.

Примітка: Як зазначено у навчальному посібнику, служба "сервер" використовує порт 1234 вашого комп'ютера для розповсюдження його вмісту. Якщо ви відкриєте сторінку '// localhost: 1234 /' на своєму комп'ютері, ви побачите "Docker-Compose - це магія!".

Код доступний

Якщо ви хочете отримати повний код, щоб виявити його простіше або виконати, я передав його у ваше розпорядження на моєму Github.

-> GitHub: Приклад складання докер-сервера клієнта

Корисні команди для 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.