Docker: Comandos basicos

O processo de instalação no Ubuntu e derivados você pode encontrar aqui e para Windows aqui.

Sintaxe do comando Docker: 

usuario@host# docker [OPTIONS] COMMAND [ARG...]

O docker é uma CLI (comand-line interface).

usuario@host# docker --version
Docker version 19.03.5, build 633a0ea838

O –version é uma opção. Para ver outras opções execute o comando man docker

usuario@host# docker run hello-world

O run é um comando do docker. Ao executar esse comando, caso a imagem hello-world não exista na sua máquina, o docker solicita ao docker hub e baixa a imagem

Listar os containers em execução

docker ps

Listar todos os containers da máquina

docker ps -a

Na saída do comando, cada coluna tem seu significado:
IMAGE -> imagem que esse container utilizou 
COMMAND -> O comando que foi executado
PORTS -> Se o container estiver respondendo em uma porta, aparecerá aqui.
NAMES -> Se não for dado um nome ao container o docker dará um nome a ele.

Listar as imagens da minha máquina

docker images

Na saída do comando, cada coluna tem seu significado:
REPOSITORY -> Nome da imagem
TAG -> versão da imagem

Criar um container com interatividade, terminal e dando um nome

docker run -ti --name [nome] [nome-da-imagem] /bin/bash

Exemplo: docker run -ti –name desenvolvimento ubuntu /bin/bash

O /bin/bash é um comando que eu posso executar ao rodar o container.

O –name [nome] é um nome que você pode dar para o container.

Criar e executar um container em background (demon)

docker run -d [imagem]

Criar um container com limitação de memória

docker run -ti --memory 512m --name teste ubuntu 

Criar um container a partir de uma versão específica de imagem

docker run [nome-da-imagem]:[versao]
Exemplo: docker run centos:7

Finalizar o container por dentro

CTRL+D

Esse atalho finaliza o  processo principal do container e por conseguinte encerra o finaliza.

Sair do container sem finalizar

CTRL+P+Q

Entrar em um container já em execução

docker attach [CONTAINER ID | NOME-CONTAINER]

Dar um STOP no container

docker stop [CONTAINER ID | NOME-CONTAINER]

Dar um START em um container ‘stopado’

docker start [CONTAINER ID | NOME-CONTAINER]

Dar um PAUSE no container

docker pause [CONTAINER ID | NOME-CONTAINER]

Despausar um container

docker unpouse  [CONTAINER ID | NOME-CONTAINER]

Saber o consumo de recursos do container

docker stats  [CONTAINER ID | NOME-CONTAINER]

Saber o consumo dos processos rodando no container

docker top [CONTAINER ID | NOME-CONTAINER]

Listar os logs do container

docker logs [CONTAINER ID | NOME-CONTAINER]

Remover um container

docker rm [CONTAINER ID | NOME-CONTAINER]

Se o container estiver em execução você precisa acrescentar o parametro -f:

docker rm -f [CONTAINER ID | NOME-CONTAINER]

Saber todas as informações sobre um container

docker inspect [CONTAINER ID | NOME-CONTAINER]

Criar um container passando um volume

docker run -ti -v /volume [nome-da-imagem] [comando]

Descobrir onde está o diretório no HOST-DOCKER que foi criado o volume

docker inspect -f {{.Mounts}} [CONTAINER ID | NOME-CONTAINER]

Criar um container mapeando um diretório local para um volume dentro do container

docker run -ti -v /diretorio-no-host-docker:/volume [nome-da-imagem] [comando]

Referências

Descomplicando o docker v1 (Linux Tips)

Como instalar o Postgre e pgAdmin no Linux (Ubuntu e derivados)

Passo a passo não muito detalhado da instalação do SGBD PostgreSQL 9.5 e a ferramenta gráfica da administração pgAdmin 4. Para mais informações leia a documentação do Postgresql e pgAdmin.

Adicionando o repositório do PostGreSQL para a versão Bionic (18.04) do Ubuntu:

– Crie o arquivo /etc/apt/sources.list.d/pgdg.list e adicione a linha abaixo:

deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main

– Importe a chave de assinatura do repositório e atualize as listas de pacotes

wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update

Instalando o PostgreSQL 12

– Execute a linha abaixo

sudo apt-get install postgresql-12

Instalando o pgAdmin 4

– Execute a linha abaixo

sudo apt-get install pgadmin4

Criando o banco de dados pelo terminal

Primeiro precisamos acessar o prompt de comando do usuário postgres. Este usuário foi criado automaticamente na instalação do PostgresSQL.

sudo su - postgres

– Para criar o banco de dados:

createdb bancoTeste

– Entrando no cliente de linha de comando do PostgreSQL e manipulando o BD criado:

psql -d bancoTeste

Nesse estágio você pode manipular o banco utilizando a linguagem SQL do Postgres.

– Atribuindo uma senha o usuário postgres.

É importante destacar que esse senha é para o usuário postgres e não para o DB.

Ainda dentro do client de linha de comando do Postgre digite:

\password postgres

Ele vai pedir que você digite a nova senha duas vezes.

Para mais informações digite:

help

Acessando o pgAdmin 4

– Você pode pesquisar no menu de aplicativos do seu S.O por: pgadmin4

– Ou acessar pelo navegador a url  http://127.0.0.1:46245/browser/

– A partir do usuário postgres você consegue criar e logar nos bancos.

O servidor será iniciado e a partir daí é com você.

Referências

Organizando uma base de dados de logradouros usando PHP e LibreOffice Calc

Em uma das minhas tarefas do dia a dia, me deparei com esse problema: Como organizar uma base de dados de logradouros(endereços) ?Como eu poderia fazer isso de maneira prática e utilizando ferramentas já disponíveis?

Foi então que resolver usar o PHP e o LibreOffice Calc.

Contexto

Existe um S.I (ERP+CRM) onde é feito a gerência de todos os clientes. Nesse sistema todas as informações do cadastro de pessoa física/jurídica são utilizadas em outras partes do mesmo sistema. O módulo de CRM desse sistema utiliza, em uma de suas funcionalidades, os dados de endereço (cidade, bairro, logradouro) para posicionar o cliente em um mapa.

Hoje tenho acesso ao BD do sistema mas não tenho permissão de escrita. Preciso corrigir os problemas, enviar por ticket para o suporte do sistema e um arquivo CSV para eles fazerem as alterações no BD.

Problemas

Os logradouros cadastrados estão fora do padrão utilizado no mapa onde precisam ser exibidos, com isso é impossível posicionar o cliente no mapa.

Essa é uma lista dos itens que serão corrigidos:

  • Os logradouros que se referem a mesma rua precisam ter a mesma grafia;
  • Abreviações no nome do logradouro;
  • Na grafia dos logradouros que tem números, precisam estar por extenso;
  • Logradouros que tem a numeração de início e fim no nome;
  • Logradouros com números Romanos;

Solução desenvolvida

No primeiro momento, conversando com a equipe do Comercial, me deram a ideia de utilizar o LibreOffice Calc para organizar os dados e fazer as correções.

Obtendo os dados, organizando e fazendo as primeiras correções

Utilizando o LibreOffice Calc:

Obtive os dados acessando o BD PostgreSQL do sistema e executando um SQL. Copiei os resultados para o LibreOffice Calc.

Dei nome as colunas facilitar a  identificação e manipulação, ficou assim:

ID LOGRADOURO CODBAIRRO CEP CODCIDADE

Dar nome as colunas me ajudou na hora de usar a opção Classificar do Calc. Selecionei toda área da tabela onde estava os dados, dentro da opção CLASSIFICAR eu selecionei a coluna LOGRADOURO na opção Chave de classificação 1.

Ainda no Calc, utilizando a opção Localizar e substituir alterei todos os registro que se enquadra nas condições:

TERMO SUBSTITUÍDO POR
R. Rua
R+ESPAÇO Rua
Tv. +ESPAÇO Travessa
RUA+ESPAÇO Rua
Av+ESPAÇO Avenida
Av.+ESPAÇO Avenida
Cel.+ESPAÇO Coronel
Dr.+ESPAÇO Doutor
Gen.+ESPAÇO General
Brig.+ESPAÇO Brigadeiro
Pre.+ESPAÇO Presidente

Obs: Em alguns casos, existe discordância se o logradouro é Rua, Avenida ou Travessa. Isso teve que ser corrigido também.

Utilizando PHP:

Depois de fazer todas as correções manuais comecei a analisar os problemas para identificar quais seriam possíveis de serem resolvidos usando programação em tempo hábil.

O resultado do código desenvolvido está abaixo:

<?php
//ativando os erros
ini_set(‘display_errors’, ‘On’);
//Exibindo todos os erros
error_reporting(E_ALL);

$caminho_do_csv = '/var/www/html/lista-enderecos-mk.csv';
//O parâmetro FILE_TEXT especifica que o arquivo é retornado na codificação UTF-8.
$array_csv = file($caminho_do_csv, FILE_TEXT);
$map_csv = array_map('str_getcsv', $array_csv);

////////// PROBLEMAS PARA RESOLVER
//(Feito) 1- Encontrar um padrão e tudo que estiver a direita desse padrão deve ser apagado. Ex: numeração de inicio e fim no nome da rua.
//(Feito) 2- Retirar os numeros do nome do logradouro. Geralmente os numeros errados estão no final do nome.

//Função para exibir os dados de um mapa de array
// @return Sem terno
function exibe_mapa(Array $mapa_de_array)
{
if($mapa_de_array != NULL)
{
foreach ($mapa_de_array as $key => $valor)
{
print("Posição do Array exteno: ".$key."<br/>");
print("------ID: ".$valor[0]."<br/>");
print("------Logradouro: ".$valor[1]."<br/>");
print("------CODBAIRRO: ".$valor[2]."<br/>");
print("------CEP: ".$valor[3]."<br/>");
print("------CODCIDADE: ".$valor[4]."<br/>");
print('---------------------------------------------------------');
print("<br/>");
};
};
};

//Função para encontrar um padrão de texto em um mapa de array
// @return Sem terno
function encontrar_padrao(String $padrao, Array $mapa_de_array)
{
//percorrer o array para achar o padrão, se for encontrato, o texto é destacado:
//<font color='red'> texto </font>
$qtd_encontrada=0;
foreach ($mapa_de_array as $key => $valor) {
print("Posição do Array exteno: ".$key."<br/>");
print("------ID: ".$valor[0]."<br/>");
if(stripos($valor[1],$padrao) !== false){
print("------Logradouro: <font color='red'>".$valor[1]."</font><br/>");
$qtd_encontrada=$qtd_encontrada+1;
}else{
print("------Logradouro: ".$valor[1]."<br/>");
};
print('---------------------------------------------------------');
print("<br/>");
};
echo 'Total de ocorrências do padrão: '.$qtd_encontrada;
};

//Essa função contem o array com as strings que devem ser desconsideradas na busca por algum tipo de padrão de string.
// @return Retorna 1 se a string passado por parâmetro estever no array e 0 para caso contrário.
function padrao_desconsiderado(String $string)
{
//Array com os padrões que devem ser desconsiderados
$desconsiderar_padrao = array("ms-","MS-","Ms-","Rua ");
foreach($desconsiderar_padrao as $valor)
{
//A pergunta feita no IF é: Algum dos padrões que estão no array coincide com a string passada por parâmetro?
//Em outras palavras: $valor C $string || $valor esta CONTIDO em $string?
if(stripos($string,$valor) !== false){
return 1;
break;
};
};
return 0;
};

//Salvando em um arquivo CSV
// @return Sem terno
function salvando_no_arq_csv(Array $mapa_de_array)
{
//O primeiro parâmetro é o arquivo.csv que eu já criei e dei permissão 777 nele.
$fp = fopen('file.csv', 'w+');
foreach ($mapa_de_array as $key => $valor)
{
fputcsv($fp, $valor);
};

fclose($fp);
};

//Solução do problema 2
// @return Retorna o mapa de Array com os campos editados
function problema2(String $padrao, Array $mapa_de_array)
{
//percorrer o Array para achar o padrão.
//Depois eu edito a posição do array onde foi achado o padrão e salvo o novo texto editado;
$novo_mapa_de_array = $mapa_de_array;
foreach ($mapa_de_array as $key => $valor) {
if(stripos($valor[1],$padrao) !== false){
//posição onde foi encontrado o padrão
$posicao = stripos($valor[1],$padrao);
//Copiando o o valor(Array) que
$array_temp = $novo_mapa_de_array[$key];
$array_temp[1] = substr($array_temp[1],0,$posicao);
$novo_mapa_de_array[$key] = $array_temp;
};
};
return $novo_mapa_de_array;
};

//Função para encontrar um padrão que atende a expresão regular passada por parâmetro
// @return Retorna um mapa de Array com o texto corrigido
function problema3(String $expressao, Array $mapa_de_array)
{
//Variável que salva temporáriamente um mapa de array com os padrões encontrados;
$matches;
// Novo Array que será retornado contendo o texto editado
$novo_mapa_de_array = $mapa_de_array;

//percorrer o Array para achar o padrão, se for encontrato o padrão é excluido;
foreach ($mapa_de_array as $key => $valor)
{
//IMPORTANTE: a expressão precisa estár entre barras -> EX: /[0-9]/
if(preg_match('/'.$expressao.'/',$valor[1]))
{
if(padrao_desconsiderado($valor[1]) == 0){
preg_match('/'.$expressao.'/',$valor[1],$matches, PREG_OFFSET_CAPTURE);
$temp = $matches[0];
$array_temp = $novo_mapa_de_array[$key];
$array_temp[1] = substr($valor[1],0,$temp[1]);
$novo_mapa_de_array[$key] = $array_temp;
}else{
print_r("Valor: ".$valor[1]."<br/>");
printf("Variável temp[0] padrão: ".$temp[0]."<br/>");
printf("Variável temp[1] posição: ".$temp[1]."<br/><br/>");
}
}
};
return $novo_array_de_mapa;
};

//Resolve problema 2
//padrão para achar as ruas que tem a numeração de inicio e fim no nome
$padrao = ' - ';

//Resolve Problema 3
//Para achar numeros que estão no final do nome da rua
$expressao_problema_3 = '[0-9]{2,5}$';

$corrigido = problema2($padrao, $map_csv);

$corrigido2 = problema3($expressao_problema_3,$corrigido);

salvando_no_arq_csv($corrigido2);

?>