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)

Docker: O Resumão

O Docker foi desenvolvido para S.Os que usam o kernal Linux. No ambiente Linux é possível usar Docker para Desenvolvimento e Produção. Recentemente foi disponibilizado a versão docker para Windows e esta só pode ser usada para Desenvolvimento.

Container 

É um binário/arquivo/cápsula que encapsula todo o ambiente necessário para sua aplicação funcionar. O ambiente e sua aplicação serão virtualizados na sua máquina física. 

É errado afirmar que um container é uma VM. Uma VM obrigatoriamente terá um S.O(e outros recursos) virtualizados em um software (KMV,VMWare, Virtualbox). Já o container usa os recursos da própria máquina onde está sendo executado. Ele não virtualiza um S.O, ele usa o S.O da máquina hospedeira onde o Docker está instalado  e através de alguns recursos disponibilizados pelo hospedeiro é criado toda a estrutura interna do container.

A diferença entre Imagem e Container é que uma imagem é um container parado. Quando essa imagem é executada ela se transforma em um Container. Análogo a uma imagem ISO de um DVD.

Chinmay Shah – Article Why you should care about Docker?

Storage Drives

São os caras responsáveis por gerenciar leitura/escrita dos dados no container.

AUFS

Esse foi o primeiro SD (Storage Driver) usado pelo Docker. Ele trabalha com o esquema de camadas:

Toda vez que é instalado um novo software ou adicionado arquivos ao container é criado uma nova camada(imagem) como se fosse formando uma pilha de camadas. É nesse momento que entra o conceito de Copy-on-Write.

Todas as camadas subjacentes são read-only, somente a camada superior é read/write, essa camada também é chamada de Camada Container.

Digamos que você vai editar o arquivo /etc/network/interfaces, esse arquivo está na camada image 1.0 (que é read-only). No momento de salvar a edição esse arquivo é copiado para a primeira camada da pilha(que é read/write), onde é salvo uma cópia dele. Na próximas vezes que você for usar a configuração feita nesse arquivo, o docker vai chamar o da primeira camada da pilha. Isso é o Copy-on-write !

Referências:

Taxonomia de links salvos no Favoritos do navegador

Tema

Esse texto explica o método que desenvolvi para organizar os links de páginas na internet que salvo nos Favoritos do navegador.

Contexto

A medida que pesquiso sobre várias áreas do conhecimento, encontro conteúdos bons e que valem apena serem salvos. Nesse processo de salvar os links nos Favoritos do navegador, sempre tive dificuldade em organizá los de tal forma a facilitar o encontro e sem deixar de lado a categorização correta.

A taxonomia de links

Para estruturar o conceito desenvolvido elaborei leis que devem ser obedecidas e objetivos que devem ser atendidos.

As leis

  1. O sistema taxonômico deve ser baseado nas principais áreas correntes*.
  2. Grandes subdivisões, subcategorias ou ramificações não são recomendadas.
  3. Se um link a ser salvo poder pertencer a mais de uma categoria, ele deve ser salvo onde na área corrente onde faz mais sentido no uso do no dia-a-dia.
  4. Os termos utilizados na nomenclatura devem pertencer ao domínio de conhecimento do usuário.
  5. Só deve ser criado uma pasta para links que pertencem a uma mesma categoria, se ouvir links de diferentes categorias, eles devem ficar fora de pasta, todos juntos.
  6. O link devem ser categorizados a partir do que ele trata, e não o que foi feito com ele.

Os objetivos

Esse objetivos são alvos que tentamos alcançar na elaboração deste sistema taxonômico, mas pode acontecer não conseguirmos atingir todos eles.

  1. Facilitar a localização e armazenamento dos links.
  2. A organização deve ser clara;

 

 

Exemplo de aplicação

1- Separando as áreas correntes:

  • Faculdade
  • Trabalho
  • Particular

2- Acrescentando suas possíveis categorias

  • Faculdade
    • TCC
      • Ferramentas
    • Matérias

 

  • Trabalho
    • Ferramentas internas

 

  • Pessoal
    • Redes
      • DNS
      • SNMP
      • CISCO
    • Linux
      • SystemCTL
      • PacketTracer
      • Shell Script
    • Programação
      • Banco de Dados
      • Frontend
    • Baixar/Comprar livros
    • Fonte de conhecimento
    • Ler depois
      • Curiosidades
    • Financeiro
    • Cursos e materiais de estudo
      • Redes
      • Linux
      • Programação
      • Energia fotovoltaica
    • Arduino

3- Validar se as leis foram cumpridas.

 

4- Executar o plano

 

Glossário

A

Área corrente –  Neste contexto entende se por uma área do conhecimento ou vida do ator principal que está mais destaca no dia-a-dia. É importante entender que a área corrente pode mudar conforme muda a vida do ator.

 

Referências

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);

?>