Guia Docker Compose para iniciantes

O autor do artigo, que publicamos hoje, diz que ele é destinado a desenvolvedores que desejam aprender Docker Compose e estão prestes a criar sua primeira aplicação cliente-servidor usando Docker. Supõe-se que o leitor deste material esteja familiarizado com os fundamentos do Docker. Se este não for o caso, você pode dar uma olhada em este série de materiais este uma postagem cobrindo os fundamentos do Docker junto com os fundamentos do Kubernetes, e este artigo para iniciantes.

Guia Docker Compose para iniciantes

O que é Docker Compose?

Docker Compose é uma ferramenta incluída no Docker. Ele foi projetado para solucionar problemas relacionados à implantação de projetos.

Ao aprender o básico do Docker, você já deve ter se deparado com a criação de aplicações mais simples que funcionam de forma autônoma, não dependendo, por exemplo, de fontes de dados externas ou de determinados serviços. Na prática, tais aplicações são raras. Projetos reais geralmente envolvem todo um conjunto de aplicações colaborativas.

Como saber se você precisa usar o Docker Compose ao implantar um projeto? Na verdade, é muito simples. Se você estiver usando vários serviços para executar este projeto, o Docker Compose pode ser útil. Por exemplo, numa situação em que você cria um site que, para realizar a autenticação do usuário, precisa se conectar a um banco de dados. Tal projeto pode consistir em dois serviços - um que garante o funcionamento do site e outro que é responsável pelo suporte da base de dados.

A tecnologia Docker Compose, se descrita de forma simplificada, permite iniciar muitos serviços com um único comando.

Diferença entre Docker e Docker Compose

Docker é usado para gerenciar os contêineres (serviços) individuais que compõem um aplicativo.

Docker Compose é usado para gerenciar vários contêineres que fazem parte de um aplicativo ao mesmo tempo. Esta ferramenta oferece os mesmos recursos do Docker, mas permite trabalhar com aplicações mais complexas.

Guia Docker Compose para iniciantes
Docker (contêiner único) e Docker Compose (vários contêineres)

Caso de uso típico do Docker Compose

Docker Compose é, nas mãos certas, uma ferramenta muito poderosa que permite implantar rapidamente aplicações com arquiteturas complexas. Agora veremos um exemplo de uso prático do Docker Compose, cuja análise permitirá avaliar os benefícios que o uso do Docker Compose lhe proporcionará.

Imagine que você é o desenvolvedor de um projeto web. Este projeto inclui dois sites. A primeira permite que empresários criem, com apenas alguns cliques, lojas online. O segundo é voltado para o suporte ao cliente. Esses dois sites interagem com o mesmo banco de dados.

Seu projeto está se tornando cada vez mais popular e acontece que a capacidade do servidor em que ele funciona não é mais suficiente. Como resultado, você decide transferir todo o projeto para outra máquina.

Infelizmente, você não usou algo como Docker Compose. Portanto, você terá que migrar e reconfigurar os serviços um de cada vez, esperando não esquecer de nada no processo deste trabalho.

Se você estiver usando o Docker Compose, migrar seu projeto para um novo servidor é um problema que pode ser resolvido executando alguns comandos. Para concluir a transferência do projeto para um novo local, basta fazer algumas configurações e fazer upload de uma cópia de backup do banco de dados para o novo servidor.

Desenvolvendo uma aplicação cliente-servidor usando Docker Compose

Agora que você sabe para que usaremos o Docker Compose, é hora de criar seu primeiro aplicativo cliente/servidor usando esta ferramenta. Ou seja, estamos falando do desenvolvimento de um pequeno site (servidor) em Python, que pode produzir um arquivo com um fragmento de texto. Este arquivo é solicitado ao servidor por um programa (cliente), também escrito em Python. Após receber o arquivo do servidor, o programa exibe na tela o texto nele armazenado.

Observe que presumimos que você tenha o básico do Docker e que já tenha a plataforma Docker instalada.

Vamos começar a trabalhar no projeto.

▍1. Crie um projeto

Para construir sua primeira aplicação cliente/servidor, sugiro que você comece criando uma pasta de projeto. Deve conter os seguintes arquivos e pastas:

  • arquivo docker-compose.yml. Este é um arquivo Docker Compose que conterá as instruções necessárias para iniciar e configurar os serviços.
  • Dobrador server. Ele conterá os arquivos necessários para fazer o servidor funcionar.
  • Dobrador client. É aqui que os arquivos do aplicativo cliente estarão localizados.

Como resultado, o conteúdo da pasta principal do seu projeto deverá ficar assim:

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

▍2. Criação de servidor

Aqui nós, no processo de criação de um servidor, abordaremos algumas coisas básicas sobre o Docker.

2a. Criando arquivos

Vá para a pasta server e crie os seguintes arquivos nele:

  • arquivo server.py. Ele conterá o código do servidor.
  • arquivo index.html. Este arquivo conterá um trecho de texto que o aplicativo cliente deverá exibir.
  • arquivo Dockerfile. Este é o arquivo Docker que conterá as instruções necessárias para criar o ambiente do servidor.

Esta é a aparência do conteúdo da sua pasta server/:

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

2b. Editando um arquivo Python.

Adicionar ao arquivo server.py o seguinte código:

#!/usr/bin/env python3

# Импорт системных библиотек python.
# Эти библиотеки будут использоваться для создания веб-сервера.
# Вам не нужно устанавливать что-то особенное, эти библиотеки устанавливаются вместе с Python.

import http.server
import socketserver

# Эта переменная нужна для обработки запросов клиента к серверу.

handler = http.server.SimpleHTTPRequestHandler

# Тут мы указываем, что сервер мы хотим запустить на порте 1234. 
# Постарайтесь запомнить эти сведения, так как они нам очень пригодятся в дальнейшем, при работе с docker-compose.

with socketserver.TCPServer(("", 1234), handler) as httpd:

    # Благодаря этой команде сервер будет выполняться постоянно, ожидая запросов от клиента.

   httpd.serve_forever()

Este código permite criar um servidor web simples. Ele dará aos clientes um arquivo index.html, cujo conteúdo será posteriormente exibido na página web.

2c. Editando um arquivo HTML

Arquivar index.html adicione o seguinte texto:

Docker-Compose is magic!

Este texto será enviado ao cliente.

2d. Editando o Dockerfile

Agora vamos criar um arquivo simples Dockerfile, que será responsável por organizar o ambiente de execução do servidor Python. Como base da imagem criada, usaremos de uma maneira oficial, projetado para executar programas escritos em Python. Aqui está o conteúdo do Dockerfile:

# На всякий случай напоминаю, что Dockerfile всегда должен начинаться с импорта базового образа.
# Для этого используется ключевое слово 'FROM'.
# Здесь нам нужно импортировать образ python (с DockerHub).
# В результате мы, в качестве имени образа, указываем 'python', а в качестве версии - 'latest'.

FROM python:latest

# Для того чтобы запустить в контейнере код, написанный на Python, нам нужно импортировать файлы 'server.py' и 'index.html'.
# Для того чтобы это сделать, мы используем ключевое слово 'ADD'.
# Первый параметр, 'server.py', представляет собой имя файла, хранящегося на компьютере.
# Второй параметр, '/server/', это путь, по которому нужно разместить указанный файл в образе.
# Здесь мы помещаем файл в папку образа '/server/'.

ADD server.py /server/
ADD index.html /server/

# Здесь мы воспользуемся командой 'WORKDIR', возможно, новой для вас.
# Она позволяет изменить рабочую директорию образа.
# В качестве такой директории, в которой будут выполняться все команды, мы устанавливаем '/server/'.

WORKDIR /server/

Agora vamos trabalhar no cliente.

▍3. Crie um cliente

Ao criar o lado cliente do nosso projeto, relembraremos alguns princípios básicos do Docker ao longo do caminho.

3a. Criando arquivos

Vá para a pasta do seu projeto client e crie os seguintes arquivos nele:

  • arquivo client.py. É aqui que estará o código do cliente.
  • arquivo Dockerfile. Este arquivo desempenha a mesma função que um arquivo semelhante na pasta do servidor. Ou seja, contém uma instrução que descreve como criar um ambiente para executar o código do cliente.

Como resultado, sua pasta client/ Nesta fase deve ficar assim:

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

3b. Editando um arquivo Python

Adicionar ao arquivo client.py o seguinte código:

#!/usr/bin/env python3

# Импортируем системную библиотеку Python.
# Она используется для загрузки файла 'index.html' с сервера.
# Ничего особенного устанавливать не нужно, эта библиотека устанавливается вместе с Python.

import urllib.request

# Эта переменная содержит запрос к 'http://localhost:1234/'.
# Возможно, сейчас вы задаётесь вопросом о том, что такое 'http://localhost:1234'.
# localhost указывает на то, что программа работает с локальным сервером.
# 1234 - это номер порта, который вам предлагалось запомнить при настройке серверного кода.

fp = urllib.request.urlopen("http://localhost:1234/")

# 'encodedContent' соответствует закодированному ответу сервера ('index.html').
# 'decodedContent' соответствует раскодированному ответу сервера (тут будет то, что мы хотим вывести на экран).

encodedContent = fp.read()
decodedContent = encodedContent.decode("utf8")

# Выводим содержимое файла, полученного с сервера ('index.html').

print(decodedContent)

# Закрываем соединение с сервером.

fp.close()

Graças a este código, a aplicação cliente pode baixar dados do servidor e exibi-los na tela.

3c. Editando o Dockerfile

Assim como no caso do servidor, criamos para o cliente um simples Dockerfile, responsável por moldar o ambiente no qual o aplicativo cliente Python será executado. Aqui está o código do cliente Dockerfile:

# То же самое, что и в серверном Dockerfile.

FROM python:latest

# Импортируем 'client.py' в папку '/client/'.

ADD client.py /client/

# Устанавливаем в качестве рабочей директории '/client/'.

WORKDIR /client/

▍4. Composição do Docker

Como você pode ver, criamos dois projetos diferentes: servidor e cliente. Cada um deles tem seu próprio arquivo Dockerfile. Até agora, tudo o que acontece não vai além do básico de trabalhar com Docker. Agora vamos trabalhar com o Docker Compose. Para fazer isso, consulte o arquivo docker-compose.ymllocalizado na pasta raiz do projeto.

Observe que aqui não pretendemos cobrir absolutamente todos os comandos que podem ser usados ​​no docker-compose.yml. Nosso principal objetivo é apresentar um exemplo prático que forneça conhecimentos básicos do Docker Compose.

Aqui está o código para colocar no arquivo docker-compose.yml:

# Файл docker-compose должен начинаться с тега версии.
# Мы используем "3" так как это - самая свежая версия на момент написания этого кода.

version: "3"

# Следует учитывать, что docker-composes работает с сервисами.
# 1 сервис = 1 контейнер.
# Сервисом может быть клиент, сервер, сервер баз данных...
# Раздел, в котором будут описаны сервисы, начинается с 'services'.

services:

  # Как уже было сказано, мы собираемся создать клиентское и серверное приложения.
  # Это означает, что нам нужно два сервиса.
  # Первый сервис (контейнер): сервер.
  # Назвать его можно так, как нужно разработчику.
  # Понятное название сервиса помогает определить его роль.
  # Здесь мы, для именования соответствующего сервиса, используем ключевое слово 'server'.

  server:
 
    # Ключевое слово "build" позволяет задать
    # путь к файлу Dockerfile, который нужно использовать для создания образа,
    # который позволит запустить сервис.
    # Здесь 'server/' соответствует пути к папке сервера,
    # которая содержит соответствующий Dockerfile.

    build: server/

    # Команда, которую нужно запустить после создания образа.
    # Следующая команда означает запуск "python ./server.py".

    command: python ./server.py

    # Вспомните о том, что в качестве порта в 'server/server.py' указан порт 1234.
    # Если мы хотим обратиться к серверу с нашего компьютера (находясь за пределами контейнера),
    # мы должны организовать перенаправление этого порта на порт компьютера.
    # Сделать это нам поможет ключевое слово 'ports'.
    # При его использовании применяется следующая конструкция: [порт компьютера]:[порт контейнера]
    # В нашем случае нужно использовать порт компьютера 1234 и организовать его связь с портом
    # 1234 контейнера (так как именно на этот порт сервер 
    # ожидает поступления запросов).

    ports:
      - 1234:1234

  # Второй сервис (контейнер): клиент.
  # Этот сервис назван 'client'.

  client:
    # Здесь 'client/ соответствует пути к папке, которая содержит
    # файл Dockerfile для клиентской части системы.

    build: client/

    # Команда, которую нужно запустить после создания образа.
    # Следующая команда означает запуск "python ./client.py".
 
    command: python ./client.py

    # Ключевое слово 'network_mode' используется для описания типа сети.
    # Тут мы указываем то, что контейнер может обращаться к 'localhost' компьютера.

    network_mode: host

    # Ключевое слово 'depends_on' позволяет указывать, должен ли сервис,
    # прежде чем запуститься, ждать, когда будут готовы к работе другие сервисы.
    # Нам нужно, чтобы сервис 'client' дождался бы готовности к работе сервиса 'server'.
 
    depends_on:
      - server

▍5. Construção do projeto

Depois em docker-compose.yml todas as instruções necessárias foram feitas, o projeto precisa ser montado. Esta etapa do nosso trabalho se assemelha ao uso do comando docker build, mas o comando correspondente está relacionado a vários serviços:

$ docker-compose build

▍6. Lançamento do projeto

Agora que o projeto está construído, é hora de executá-lo. Esta etapa do nosso trabalho corresponde à etapa em que, ao trabalhar com containers individuais, o comando é executado docker run:

$ docker-compose up

Após executar este comando, o texto carregado pelo cliente do servidor deverá aparecer no terminal: Docker-Compose is magic!.

Como já mencionado, o servidor usa a porta do computador 1234 para atender às solicitações dos clientes. Portanto, se você acessar o endereço no navegador http://localhost:1234/, ele exibirá uma página com texto Docker-Compose is magic!.

Comandos Úteis

Vamos dar uma olhada em alguns dos comandos que podem ser úteis ao trabalhar com o Docker Compose.

Este comando permite parar e excluir contêineres e outros recursos criados pelo comando docker-compose up:

$ docker-compose down

Este comando imprime os logs de serviço:

$ docker-compose logs -f [service name]

Por exemplo, em nosso projeto ele pode ser usado desta forma: $ docker-compose logs -f [service name].

Com este comando, você pode exibir uma lista de contêineres:

$ docker-compose ps

Este comando permite executar um comando em um contêiner em execução:

$ docker-compose exec [service name] [command]

Por exemplo, pode ser assim: docker-compose exec server ls.

Este comando permite exibir uma lista de imagens:

$ docker-compose images

Resultados de

Abordamos os fundamentos do trabalho com a tecnologia Docker Compose, cujo conhecimento permitirá que você utilize essa tecnologia e, se desejar, comece a estudá-la com mais profundidade. aqui é repositório com o código do projeto, que consideramos aqui.

Caros leitores! Você usa Docker Compose em seus projetos?

Guia Docker Compose para iniciantes

Fonte: habr.com

Adicionar um comentário