O autor do artigo cuja tradução publicamos hoje afirma que ele é direcionado a desenvolvedores que desejam aprender sobre Docker Compose e estão em busca de criar seu primeiro aplicativo cliente-servidor usando Docker. Presume-se que o leitor deste material esteja familiarizado com os fundamentos do Docker. Se não estiver — sinta-se à vontade para conferir a série de materiais sobre a publicação onde os fundamentos do Docker são abordados junto com os fundamentos do Kubernetes, e o artigo para iniciantes.
O que é Docker Compose?
Docker Compose é uma ferramenta que faz parte do Docker. Ela é destinada a resolver questões relacionadas à implantação de projetos.
Ao estudar os fundamentos do Docker, você pode ter se deparado com a criação de aplicações simples, que funcionam de forma autônoma, sem depender, por exemplo, de fontes de dados externas ou de certos serviços. Na prática, no entanto, aplicações como essas são raras. Projetos reais geralmente envolvem um conjunto de aplicações que trabalham em conjunto.
Como saber se você precisa usar o Docker Compose ao implantar um projeto? Na verdade, é muito simples. Se vários serviços são necessários para o funcionamento deste projeto, o Docker Compose pode ser útil para você. Por exemplo, em uma situação onde se está criando um site que, para realizar a autenticação de usuários, precisa se conectar a um banco de dados. Um projeto como esse pode consistir em dois serviços — aquele que garante o funcionamento do site e aquele responsável pelo suporte ao banco de dados.
A tecnologia Docker Compose, de forma simplificada, permite que você inicie vários serviços com um único comando.
A diferença entre Docker e Docker Compose
Docker é utilizado para gerenciar contêineres individuais (serviços) que compõem uma aplicação.
Docker Compose é utilizado para gerenciar simultaneamente vários contêineres que fazem parte da aplicação. Esta ferramenta oferece as mesmas funcionalidades que o Docker, mas permite trabalhar com aplicações mais complexas.

Docker (contêiner individual) e Docker Compose (vários contêineres)
Cenário típico de uso do Docker Compose
Docker Compose é, nas mãos habilidosas, uma ferramenta bastante poderosa que permite implantar aplicações com arquiteturas complexas rapidamente. Agora, vamos ver um exemplo prático de uso do Docker Compose, cuja análise permitirá que você avalie as vantagens que o uso do Docker Compose pode oferecer.
Imagine que você é um desenvolvedor de um projeto web. Este projeto inclui dois sites. O primeiro permite que pessoas envolvidas em negócios criem, em apenas alguns cliques, lojas virtuais. 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 você percebe que a capacidade do servidor em que ele está funcionando já não é suficiente. Como resultado, você decide transferir todo o projeto para outra máquina.
Infelizmente, você não usou algo como o Docker Compose. Portanto, terá que mover e reconfigurar os serviços um por um, torcendo para que, durante esse trabalho, você não esqueça nada.
Se você usar o Docker Compose, então transferir seu projeto para um novo servidor é uma questão que pode ser resolvida com a execução de alguns comandos. Para concluir a transferência do projeto para o novo local, você só precisa fazer algumas configurações e carregar no novo servidor um backup do banco de dados.
Desenvolvendo uma aplicação cliente-servidor usando Docker Compose
Agora que você sabe para que vamos usar o Docker Compose, é hora de criar sua primeira aplicação cliente-servidor usando esta ferramenta. Em particular, vamos desenvolver um pequeno site (servidor) em Python, que é capaz de fornecer um arquivo com um trecho de texto. Esse arquivo é solicitado pelo programa (cliente), também escrito em Python. Após receber o arquivo do servidor, o programa exibe o texto contido nele na tela.
Observe que pressupomos que você possui o conhecimento básico de Docker e que já tem a plataforma Docker instalada.
Vamos começar a trabalhar no projeto.
▍1. Criando o projeto
Para construir sua primeira aplicação cliente-servidor, sugiro começar criando a pasta do projeto. Ela 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. - Pasta
servidor. Ela conterá os arquivos necessários para garantir o funcionamento do servidor. - Pasta
client. Aqui estarão os arquivos do aplicativo cliente.
Como resultado, o conteúdo da pasta principal do seu projeto deve ficar assim:
.
├── client/
├── docker-compose.yml
└── server/
2 diretórios, 1 arquivo▍2. Criando o servidor
Aqui, durante o processo de criação do servidor, abordaremos algumas noções básicas sobre Docker.
2a. Criando arquivos
Vá para a pasta servidor e crie os seguintes arquivos dentro dela:
- Arquivo
server.py. Ele conterá o código do servidor. - Arquivo
index.html. Neste arquivo estará um fragmento de texto que deve ser exibido pelo aplicativo cliente. - Arquivo
Dockerfile. Este é um arquivo Docker que conterá as instruções necessárias para criar o ambiente do servidor.
Veja como deve ser o conteúdo da sua pasta server/:
.
├── Dockerfile
├── index.html
└── server.py
0 diretórios, 3 arquivos2b. Editando o arquivo Python.
Vamos 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() Esse código permite criar um servidor web simples. Ele devolverá aos clientes o arquivo index.html, cujo conteúdo será exibido mais tarde na página web.
2c. Editando o arquivo HTML
No arquivo index.html vamos adicionar o seguinte texto:
Docker-Compose é magia!Esse texto será enviado ao cliente.
2d. Editando o arquivo Dockerfile
Agora vamos criar um arquivo simples Dockerfile, que será responsável pela organização do ambiente para o servidor Python. Como base para a imagem criada, utilizaremos , destinada à execução de 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. Criando o cliente
Ao criar a parte cliente do nosso projeto, vamos relembrar algumas noções básicas de Docker.
3a. Criando arquivos
Vá para a pasta do seu projeto client e crie os seguintes arquivos dentro dela:
- Arquivo
client.py. Aqui estará o código do cliente. - Arquivo
Dockerfile. Este arquivo desempenha a mesma função que o arquivo correspondente na pasta do servidor. Ou seja, ele contém as instruções que descrevem a criação do ambiente para a execução do código cliente.
Como resultado, sua pasta client/ nesta etapa do trabalho deve parecer assim:
.
├── client.py
└── Dockerfile
0 diretórios, 2 arquivos3b. Editando o arquivo Python
Vamos 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()Com esse código, o aplicativo cliente pode carregar dados do servidor e exibi-los na tela.
3c. Editando o arquivo Dockerfile
Assim como no caso do servidor, criamos um cliente simples Dockerfile, responsável por criar o ambiente onde o aplicativo Python do cliente funcionará. Aqui está o código do cliente Dockerfile:
# То же самое, что и в серверном Dockerfile.
FROM python:latest
# Импортируем 'client.py' в папку '/client/'.
ADD client.py /client/
# Устанавливаем в качестве рабочей директории '/client/'.
WORKDIR /client/▍4. Docker Compose
Como você pode notar, criamos dois projetos diferentes: servidor e cliente. Cada um deles possui seu próprio arquivo Dockerfile. Até agora, tudo que foi realizado está dentro das normas básicas de funcionamento do Docker. Agora, começamos a trabalhar com o Docker Compose. Para isso, vamos olhar o arquivo docker-compose.yml, localizado na pasta raiz do projeto.
Observe que aqui não estamos tentando abordar absolutamente todos os comandos que podem ser usados em docker-compose.yml. Nosso principal objetivo é examinar um exemplo prático que forneça a você conhecimentos básicos sobre o Docker Compose.
Aqui está o código que deve ser inserido 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
Após todos os comandos necessários estarem inseridos em docker-compose.yml , o projeto precisa ser construído. Essa etapa do nosso trabalho se assemelha ao uso do comando docker build, mas o comando correspondente se relaciona a vários serviços:
$ docker-compose build▍6. Execução do projeto
Agora que o projeto está construído, é hora de executá-lo. Esta etapa do nosso trabalho é equivalente ao passo em que, ao lidar com contêineres separados, o comando é executado docker run:
$ docker-compose up Após a execução deste comando, deve aparecer no terminal o texto carregado pelo cliente a partir do servidor: Docker-Compose é magia!.
Como já foi mencionado, o servidor utiliza a porta do computador 1234 para atender as solicitações do cliente. Portanto, se você acessar no navegador o endereço , a página mostrará o texto Docker-Compose é magia!.
Comandos úteis
Vamos considerar alguns comandos que podem ser úteis ao trabalhar com o Docker Compose.
Este comando permite parar e remover contêineres e outros recursos criados pelo comando docker-compose up:
$ docker-compose downEste comando exibe os logs dos serviços:
$ docker-compose logs -f [nome do serviço] Por exemplo, em nosso projeto, ele pode ser usado da seguinte forma: $ docker-compose logs -f [nome do serviço].
Com esse comando, é possível listar os contêineres:
$ docker-compose psEste comando permite executar um comando em um contêiner em execução:
$ docker-compose exec [nome do serviço] [comando] Por exemplo, ele pode ser assim: docker-compose exec server ls.
Esse comando permite listar as imagens:
$ docker-compose imagesResultados
Examinamos os fundamentos do uso da tecnologia Docker Compose, cujo conhecimento permitirá que você utilize essa tecnologia e, se desejar, comece a estudá-la de forma mais aprofundada. repositório com o código do projeto que analisamos aqui.
Prezados leitores! Você está usando Docker Compose em seus projetos?
Fonte: habr.com
