Skip to content

Tutorial Docker

Note

Esse tutorial tem algumas informações sobre Docker sendo essas informações genéricas, elas trazem alguns conceitos e comandos básicos desconsiderando a utilização com ambiente de desenvolvimento Protheus.

A utilização do Docker para ambientes de desenvolvimento é muito útil permite que diversos sistemas possam ser instalados e executados de formas isoladas sem que possam um interferir na configuração do outro, porém ainda podem interagir um junto com o outro

Para o entendimento do Docker dois conceitos são fundamentais, o primeiro o que são imagens, segundo o que são containers. Além desses dois conceitos diversos comandos podem ser utilizados no Docker aqui na documentação iremos abordar apenas os comandos mais comuns do dia a dia do desenvolvimento utilizando Docker.

O que são imagens?

Imagens são o conjunto de programas, bibliotecas e configurações. A melhor forma de imaginar uma imagem Docker seria como um CD de instalação de determinado sistema / programa.

Aqui são alguns comandos para manipular as imagens Docker através da linha de comando.

# Download da image:
docker image pull docker.io/library/alpine:master

# Listando imagens:
docker image ls

# Removendo imagens
docker image rm docker.io/library/alpine:master

O que são containers?

Os container são a forma de executar as imagens, containers parecem com máquinas virtuais pois um container tem isolamento de outros containers, podemos ter um container com uma imagem baseada na distribuição do Debian, OraclLinux ou Alpine, todas utilizando o mesmo kernel Linux do host. Containers são processos em execução no próprio host, apesar de dentro do container a visão do sistema ser diferente da visão externa do container.

Toda execução de container consiste da escolha de uma imagem que é como o CD com os dados que aquele container vai ter, e a escolha de um programa para executar dentro daquele container. Uma vez que o container estiver em execução ele altera seu estado interno, alterando osistema de arquivos e o contexto da execução, uma vez terminado todas essas alterações são perdidas.

Quando executamos um container é possível passar alguns caminhos específicos que mantem seu estado de execução, dessa forma caso executemos por exemplo um banco de dados dentro de um container, podemos utilizar um volume para que apenas esse local do sistema de arquivos seja persistido.

1
2
3
4
5
6
docker container run \
    --rm \
    -it \
    -v ${PWD}:/local
    docker.io/library/alpine:master \
    ls -la /local

Como exemplo esse comando lista um diretório por dentro do container, onde o diretório /local é um diretório compartilhado entre o host e o container. Analisando linha a linha:

Linha 1 é o comando que chama a execução do container no docker.

Linha 2 informa ao docker para não guardar o histórico dessa execução, quando o docker executa um container ele mantem uma lista dos container em execução e já executados, com esse parâmetro assim que o container termina sua execução é removido dessa lista.

Linha 3 o -t informa para o docker para alocar um tty para o container permitindo que o programa possa interagir com o terminal, o -i faz com que a entrada de comandos sejam direcionadas para o terminal alocado.

Linha 4 mapeia uo diretório local (a variável ${PWD} tem o nome do diretório local) para o caminh /local dentro do container

Linha 5 informa qual imagem será utilizada como base para o container, sendo que alpine é uma imagem que possui um mini linux.

Linha 6 o comando que será executado dentro do container, esse comando esta sendo executado dentro do container então esse comando ls esta dentro do container e não no host, caso o container não possua o comando ls o mesmo iria retornar um erro.

Desenvolvendo com docker-compose.yml

Apesar desses conceitos que foram mostrados a forma mais comum de utilizar o Docker é criando conjunto de containers, por exemplo container com o banco da aplicação mais container com a aplicação, utilizando docker compose podemos criar um arquivo de configuração que descreve o ambiente então podemos com um comando iniciar todos os containers necessários.

version: "3.8"

services:
  postgres-iniciado:
    image: "totvsengpro/postgres-dev"

  dbaccess-postgres:
    image: "totvsengpro/dbaccess-postgres-dev"
    volumes:
      - "${PWD}/dbaccess.ini:/opt/totvs/dbaccess/multi/dbaccess.ini"
    ports:
      - "7890:7890"

A linha 1 descrever qual a versão do compose.

As linhas 4 e 7 são o nome dos serviços que vão ser criados.

As linhas 5 e 8 descrevem a imagem de cada um dos serviços.

As linhas 9 e 10 informam onde o arquivo dbaccess.ini no diretório local deve ser colocado dentro do container no caminho /opt/totvs/dbaccess/multi

As linhas 11 e 12 descrevem quais são as postas que vão ser exportadas de dentro do container do dbaccess para o host docker.

Esse arquivo é apenas um arquivo de exemplo e deve ser salvo como docker-compose.yml. ele cria dois serviços, o banco de dados e o dbaccess que vai comunicar internamento com o banco de dados, para criar os containers, os seguintes comandos devem ser utilizados:

# Criando containers em primeiro plano (CTRL+c para finalizar) 
docker compose up

# Criando containers em segundo plano
docker compose up -d

# Removendo containers
docker compose down

O comando docker compose up pode ser passado sem o parâmetro -d nesse caso todos os container são criados e iniciadas assim que iniciado o comando fica "travado" esperando o término da execução.

Caso o parâmetro -d seja passado os containers são deattached (separados) do terminal, nesse caso os container permanecem executando em segundo plano dentro do docker

Verificando Problemas

Uma vez que o container estiver rodando é possível ver os logs do container (saída) e também executar outros comandos dentro do container para verificar arquivos de configuração entre outros problemas.

Antes de verificar os logs dos arquivos é necessário saber qual o container que quer ser visualizado / acessado para isso é necessário listar os containers.

# Listando containers
docker container ls

# Verificando os logs do containers
docker container logs [nome/id]

# Acessando container
docker container exec -it [nome/id] /bin/sh