Java 9 no Docker – Java Playground com REPL

A abordagem adotada aqui, com uso de contêiner Docker, foi motivada pela preservação do ambiente Java existente no computador Host já que instalar uma versão Java 9 onde já existe outra versão do Java, tal como o Java8, pode deixar o ambiente instável, criando problemas para o Desenvolvedor ou SysAdmin.

Criando ou Obtendo a imagem Docker

Criando

cd ~/Desktop/Development
git clone git@github.com:joao-parana/java-jdk9.git
cd java-jdk9
docker build -t parana/java-jdk9 .

Obtendo

Senão NÃO desejar fazer o build você poderá baixar direto a imagem do Docker Hub

docker pull parana/java-jdk9

Sessão do JShell

Para termos a disposição uma sessão do JShell, basta executar o Contêiner e invocar a JShell

docker run -i -t --rm parana/java-jdk9
jshell

Você verá uma mensagem parecida com esta abaixo

Jan 01, 2016 12:28:09 PM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
|  Welcome to JShell -- Version 9-internal
|  Type /help for help

E um prompt assim:

-> 

Agora podemos digitar código Java diretamente na console. Não exibirei o prompt abaixo para simplificar o uso dos comandos. Em vez disso colocarei o código Java e os comandos JShell em fonte de tamanho fixo.

import java.util.stream.*
IntStream.range(0, 10).map(x->x*x).forEach(System.out::println)
/save script-01.repl 
/exit

Voltamos a Bash e podemos listar os arquivos e exibir o conteudo de script-01.repl

ls
script-01.repl
cat script-01.repl 
import java.util.stream.*;
IntStream.range(0, 10).map(x->x*x).forEach(System.out::println)

Voltamos a invocar a JShell e digitar comandos Java ou comandos JShell (estes que são precedidos pelo caracter / )

Experimentemos os comandos /?, /vars e /methods

jshell
System.out.println("Agora interativamente")
/open script-01.repl 
/?
/methods

O método printf já vem definido para facilitar o uso da console REPL

printf("Oi %s", "Mundo")
int pi = 3.1416
float pi = 3.1416
float pi = 3.1416f
/vars

Experimentando os comandos /imports, /vars e /reset

/imports
/vars
/reset

Usando o comando /list para listar o código Java no contexto atual

/list

Obtendo o Histórico de comandos digitados até o momento

/history

É possível modificar o nível de LOG na console REPL do JShell com o comando /feedback

-> /feedback ?
|  Follow /feedback with of the following:
|    off       (errors and critical output only)
|    concise
|    normal
|    verbose
|    default
|  You may also use just the first letter, for example: /f c
|  In interactive mode 'default' is the same as 'normal', from a file it is the same as 'off'

O conteúdo mostrado pelo comando /? lista todas as possibilidaes de uso do JShell. Veja abaixo

Type a Java language expression, statement, or declaration.
Or type one of the following commands:

/list [all]                      -- list the source you have typed
/seteditor           -- set the external editor command to use
/edit                -- edit a source entry referenced by name or id
/drop                -- delete a source entry referenced by name or id
/save [all|history|start]  -- save:  - current source;
                                          all - source including overwritten, failed, and start-up code;
                                          history - editing history;
                                          start - default start-up definitions
/open                      -- open a file as source input
/vars                            -- list the declared variables and their values
/methods                         -- list the declared methods and their signatures
/classes                         -- list the declared classes
/imports                         -- list the imported items
/exit                            -- exit the REPL
/reset                           -- reset everything in the REPL
/feedback                 -- feedback information: off, concise, normal, verbose, default, or ?
/prompt                          -- toggle display of a prompt
/classpath                 -- add a path to the classpath
/history                         -- history of what you have typed
/setstart                  -- read file and set as the new start-up definitions
/help                            -- this help message
/?                               -- this help message
/!                               -- re-run last snippet
/                            -- re-run snippet by id
/-                            -- re-run n-th previous snippet

Supported shortcuts include:
       -- show possible completions for the current text
Shift- -- for current method or constructor invocation, show a synopsis of the method/constructor

Deixe seu nome e e-mail para que eu possa enviar cupons de desconto para o curso sobre Docker

Instalação do Docker no Linux: curl ou wget ?

Me perguntaram qual a diferença entre usar o curl ou wget para instalar o Docker no Linux. Aqui vai a resposta:

wget -qO- https://get.docker.com/ | sh

OU

curl -sSL https://get.docker.com/ | sh

Essencialmente ambos os comandos fazem a mesma coisa neste caso. A opção do curl é para ser usada em ambientes que não possuem wget por padrão como o MAC OSX, por exemplo.

Ambos jogam a saída para a standard output no modo silencioso. No curl é necessário indicar que ele deve seguir o redirecionamento, caso exista.

Indo pra saída padrão é possível redirecionar para a Shell /bin/sh e executar imediatamente a instalação.

Veja o help dos comandos abaixo. 

wget

-q, --quiet : Turn off Wget's output.
-O file, --output-document=file : The documents will not be written to the appropriate files, but all will be concatenated together and written to file. If - is used as file, documents will be printed to standard output

curl

-s, --silent : Silent  or  quiet  mode.  Don't  show  progress meter or error messages. 
-S, --show-error : When used with -s it makes curl show an error message if it fails.
-L, --location : If the server reports that the requested page has moved to a different location (indicated with a Location: header  and  a  3XX  response  code),  this option  will  make  curl  redo the request on the new place.

Eu pessoalmente prefiro o curl, que é muito mais poderoso.

Se você precisar de recursividade no processo de download, use o wget pois o curl não faz isso.


Deixe seu nome e e-mail para que eu possa enviar cupons de desconto para o curso sobre Docker


Para quem desejar mais detalhes sobre as diferenças entre os comandos veja esta explicação em inglês. Se precisarem de ajuda entre em contato.

What both commands do

  • both are command line tools that can download contents from FTP, HTTP and HTTPS
  • both can send HTTP POST requests
  • both support HTTP cookies
  • both are designed to work without user interaction, like from within scripts
  • both are fully open source and free software
  • both projects were started in the 90s
  • both support metalink

How they differ

curl

  • library. curl is powered by libcurl – a cross-platform library with a stable API that can be used by each and everyone. This difference is major since it creates a completely different attitude on how to do things internally. It is also slightly harder to make a library than a “mere” command line tool.
  • pipes. curl works more like the traditional unix cat command, it sends more stuff to stdout, and reads more from stdin in a “everything is a pipe” manner. Wget is more like cp, using the same analogue.
  • Single shot. curl is basically made to do single-shot transfers of data. It transfers just the URLs that the user specifies, and does not contain any recursive downloading logic nor any sort of HTML parser.
  • More protocols supported. curl supports FTP, FTPS, Gopher, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS, FILE, POP3, IMAP, SMB/CIFS, SMTP, RTMP and RTSP. Wget only supports HTTP, HTTPS and FTP.
  • More portable. curl builds and runs on lots of more platforms than wget. For example: OS/400, TPF and other more “exotic” platforms that aren’t straight-forward unix clones.
  • More SSL libraries and SSL support. curl can be built with one out of eleven (11!) different SSL/TLS libraries, and it offers more control and wider support for protocol details. curl supports public key pinning.
  • HTTP auth. curl supports more HTTP authentication methods, especially over HTTP proxies: Basic, Digest, NTLM and Negotiate
  • SOCKS support. curl supports several SOCKS protocol versions for proxy access
  • Bidirectional. curl offers upload and sending capabilities. Wget only offers plain HTTP POST support.
  • HTTP multipart/form-data sending, which allows users to do HTTP “upload” and in general emulate browsers and do HTTP automation to a wider extent
  • curl supports gzip and inflate Content-Encoding and does automatic decompression
  • curl offers and performs decompression of Transfer-Encoded HTTP, wget doesn’t
  • curl supports HTTP/2 and it does dual-stack connects using Happy Eyeballs
  • Much more developer activity. While this can be debated, I consider three metrics here: mailing list activity, source code commit frequency and release frequency. Anyone following these two projects can see that the curl project has a lot higher pace in all these areas, and it has been so for 10+ years. Compare on openhub

Wget

  • Wget is command line only. There’s no library.
  • Recursive! Wget’s major strong side compared to curl is its ability to download recursively, or even just download everything that is referred to from a remote resource, be it a HTML page or a FTP directory listing.
  • Older. Wget has traces back to 1995, while curl can be tracked back no earlier than the end of 1996.
  • GPL. Wget is 100% GPL v3. curl is MIT licensed.
  • GNU. Wget is part of the GNU project and all copyrights are assigned to FSF. The curl project is entirely stand-alone and independent with no organization parenting at all with almost all copyrights owned by Daniel.
  • Wget requires no extra options to simply download a remote URL to a local file, while curl requires -o or -O.
  • Wget supports the Public Suffix List for handling cookie domains, curl does not.
  • Wget supports only GnuTLS or OpenSSL for SSL/TLS support
  • Wget supports only Basic auth as the only auth type over HTTP proxy
  • Wget has no SOCKS support
  • Its ability to recover from a prematurely broken transfer and continue downloading has no counterpart in curl.
  • Wget can be typed in using only the left hand on a qwerty keyboard!

Apresentação sobre Docker na Semana do linux

Recentemente preparei uma apresentação para a Semana do Linux.

Veja o video e deixe seu comentário.

 

Matricule-se no curso online Introdução ao Docker para saber mais sobre esta tecnologia revolucionária

.

Se desejar um cupom de desconto entre em contato via formulário abaixo.

Deixe seu nome e e-mail para que eu possa enviar cupons de desconto para o curso sobre Docker

Você pode também curtir a página do facebook no link abaixo :

https://www.facebook.com/joaoparanaweb

Linha Shebang pra GoLang

Shebang GOLANG GO

Qual a forma mais apropriada para definir uma linha shebang para Script escrito em Linguagem GO ?

Existem algumas alternativas e vou descrever aqui.

A mais simples é essa abaixo:

Coloque na primeira linha do programa principal

//usr/local/go/bin/go run $0 $@ ; exit

No caso de você não saber onde está instalado o GO use o comando `which go` para verificar.

Exemplo:

//usr/local/go/bin/go run $0 $@ ; exit
package main
import "fmt"
func main() {
  fmt.Println(“Oi SysAdmin. Este é um script escrito em GO")
}

A razão para isso funcionar é a seguinte: O compilador go trata as duas barras // como comentário e a shell, por outro lado ignora a barra extra existente. Desta forma tanto a sua Shell quanto o Builder do GO irao entender corretamente o que deve ser feito.

Não se esqueça de conceder acesso de execução no arquivo .go

Supondo que o arquivo se chame hello.go podemos executar

chmod a+rx hello.go

Existem argumentações para se usar algo um pouco mais rebuscado para evitar problema de compatibilidade entre ambientes.

///usr/bin/true; exec /usr/bin/env go run "$0" "$@"

Eu prefiro usar como mostrado abaixo em ambiente de desenvolvimento..

///usr/bin/true; echo •• Executando "$0"; exec /usr/bin/env go run "$0" "$@"

Exemplo:

///usr/bin/true; echo •• Executando "$0"; exec /usr/bin/env go run "$0" "$@"
package main 
import "fmt"
func main() {
  fmt.Println(“Oi SysAdmin. Este é um script escrito em GO")
}

Deixe seu nome e e-mail para que eu possa enviar cupons de desconto para o curso sobre Docker

A Caixa de Ferramentas Docker (Toolbox)

Recentemente a equipe do Docker lançou a sua Toolbox (Caixa de Ferramentas) para utilização do Ecosistema Docker. Esta Toolbox provê funcionalidades para gerenciamento facilitado para Contêineres no ambiente MAC OSX e Windows (No Linux não precisamos da Toolbox pois a instalação do Docker é direta).

 

 

Qual o objetivo a ser alcançado ?

Como o MAC OSX e Windows são Sistemas Operacionais diferentes do Linux e o Docker atualmente roda sob Kernel Linux, precisamos de um Ambiente Virtual para usar as facilidades do Docker nestes dois ambientes (que são largamente utilizados por Desenvolvedores e Administradores de Sistemas).

O que é o Docker Toolbox ?

O  Docker Toolbox é um instalador que permite fazer o setup do ambiente no Windows e no MAC OSX. Vale lembrar que podemos usar gerenciadores de pacote também quando pretendemos instalar e configurar o Docker e seus componentes. No OSX é possível usar o Homebrew para instalar o Docker facilmente. No Windows podemos usar o Chocolatey – https://chocolatey.org/packages/docker  – mas não trataremos aqui desta abordagem, pois preferimos o programa fornecido pela propria Docker inc.

O Docker Toolbox funciona como programa executável dependente de plataforma e tem a capacidade de acertar o ambiente pois detecta a existência de versão anterior fazendo automaticamente os upgrades e as migrações necessárias.

Como qualquer programa que envolva este tipo de complexidade, ele pode falhar em alguma situação específica e por isso ele pede que o usuário autorize o envio de dados anônimos relacionados ao processo de instalação (primeira vez) para a equipe do Docker  de forma que eles possam melhorar o programa. O usuário pode, no entanto, desmarcar esta opção.

O Docker Toolbox instala ou atualiza os seguintes softwares:

  • Docker Client
  • Docker Machine
  • Docker Compose (apenas na versão para MAC OSX)
  • Docker Kitematic
  • Docker Quickstart Terminal
  • VirtualBox

O Boot2Docker continua sendo suportado e também é atualizado.

É possível criar uma Docker Machine à partir de uma Maquina Virtual do Boot2Docker. Para isso devemos executar o comando:

docker-machine create -d virtualbox  \
--virtualbox-import-boot2docker-vm boot2docker-vm dev

Mas se optarmos por isso à partir desse momento devemos usar o comando docker-machine para interagir com a maquina virtual em vez do vínhamos utilizando que era o comando boot2docker
A comparação entre as duas abordagens pode ser vista em detalhes nesta tabela abaixo:

ou no link: http://docs.docker.com/installation/mac/#migrate-from-boot2docker onde vemos mais detalhes sobre migração.

Qualquer problema encontrado no processo de instalação pode ser reportado no endereço https://github.com/docker/toolbox/issues o que também ajuda na melhoria do programa.

Neste processo de instalação citado, o Docker Toolbox mantem a versão anterior do programa Boot2Docker (1) e instala Docker Quickstart Terminal e o Kitematic (Beta) (3) na pasta Docker (2)

As Imagens e Contêineres antigos ficam disponíveis via a Maquina Virtual Boot2Docker anterior e para usá-las basta executar:

boot2docker start

Se desejar migrar para a Máquina Virtual Docker Machine use o comando

“docker-machine create -d virtualbox …”  citado anteriormente.


Matricule-se no curso online Introdução ao Docker para saber mais sobre esta tecnologia revolucionária

.

Se desejar um cupom de desconto entre em contato via formulário abaixo.

Deixe seu nome e e-mail para que eu possa enviar cupons de desconto para o curso sobre Docker

Você pode também curtir a página do facebook no link abaixo :

https://www.facebook.com/joaoparanaweb

Docker e a o formato universal para Contêineres.

OCI – Open Container Initiative : Uma revolução no mundo da Virtualização

O Docker permite empacotar uma aplicação com todas as suas dependências em uma unidade padronizada de Software e assim roda sempre da mesma forma independente de em qual sistema está rodando. Isto reduz um muito das “dores de cabeça” comuns na gestão do Ciclo de Vida da Aplicação. Permite também automatizar o provisionamento de recursos necessários a aplicação. Isto é uma verdadeira revolução no mundo da Virtualização.

 

No final de junho ultimo o pessoal do Docker anunciou em seu Blog o projeto  Open Container.  Trata-se de um projeto sem fins lucrativos, de código aberto, agnóstico a fornecedor, gerenciado pela Linux Foundation com o propósito expresso de definir especificações abertas e padrão em torno de uma definição formal de um formato de Contêiner e do ambiente de Runtime desses Contêiners.

 

A Docker Inc doou o runC, que é uma ferramenta CLI – Command Line Interface para iniciar e rodar contêineres. Este projeto é aberto e servirá como ponto de partida rodando em Linux mas servirá de base para o desenvolvimento para Windows, FreeBSD e outros Sistemas Operacionais.

Os 5 princípios dos Padrões para Contêiners :

O padrão definirá

1) um formato de arquivo

2) um conjunto de operações

3) um ambiente de execução

O Contêiner deverá descrever suas dependências num formato auto-descritivo, portável, permitindo a execução em ambientes distintos em qualquer runtime compatível independente do conteúdod do Contêiner e do Sistema Operacional.

Esta é a razão pela qual foram definidos os cinco princípios que norteará o Padrão de Contêineres:

1. Operações Padrão

2. Independente de conteúdo

3. Independente de Infraestrutura

4. Projetado para Automação do Provisionamento

5. Entrega obedecendo Padrões da Indústria

 

Sobre a Open Container Initiative e seus patrocinadores

A OCI conta com patrocinadores incluindo : Apcera, AT&T, AWS, Cisco, ClusterHQ, CoreOS, Datera, Docker, EMC, Fujitsu, Google, Goldman Sachs, HP, Huawei, IBM, Intel, Joyent, Kismatic, Kyup, the Linux Foundation, Mesosphere, Microsoft, Midokura, Nutanix, Oracle, Pivotal, Polyverse, Rancher, Red Hat, Resin.io, Suse, Sysdig, Twitter, Verizon, VMWare.

 

A especificação está sendo desenvolvida no seguinte endereço github repository.  OCI é o elemento chave para acelerar o desenvolvimento de soluções para facilitar a implantação destas soluções nos provedores de Cloud (Públicas ou Privadas).

 

O Futuro chegou ! O melhor é que ela é Open Source.

 

O que é o Docker

Atualmente os sistemas de software afetam praticamente todos os aspectos de nossas vidas. No entanto  erros em sistemas de computação podem produzir prejuizos assustadores como explodir uma nave espacial, levar uma empresa multimilionária a falência ou expor a imagem de uma gigante e lider na área de video-games. Todos estes exemplos são reais e a todo momento vemos noticias de outras catástrofes ocorridas por erros de software.

 

Qual o motivo para ocorreram estas coisas ? No raiz do problema está a negligência com a complexidade envolvida nos processos de desenvolvimento e implantação de sistemas.

 

Um sistema de software bem escrito deve ser robusto, eficiente, confiável e flexível. Para conseguir isso devemos ter o controle de todo o Ciclo de Vida da Aplicação, desde a concepção, baseada nos requisitos do negócio, passando pelo desenvolvimento, testes, homologação, produção e gerenciamento de mudanças.

 

Ok, mas este é um artigo sobre Docker então por que falar disso tudo ?  Ora, por que o Docker vai facilitar nossa vida em várias etapas desse ciclo de vida da aplicação. Neste artigo vou descrever o que é o Docker pois este é o primeiro passo para poder usa-lo de forma eficiente para Gerenciar todos os Ciclos de Vida de nossas Aplicações.   

 

Gerenciamento do Ciclo de Vida da Aplicação

A manutenção de ambientes de Desenvolvimento, Homologação e Produção tem grande impacto no Gerenciamento do Ciclo de Vida da Aplicação (ALM – Application Lifecycle Management), devido a grande complexidade das aplicações atuais nas sua maioria rodando em ambiente distribuído. Para mitigar os riscos neste gerenciamento e manter os altos níveis de Qualidade desejados pelos usuários dos sistemas é necessário que usemos algumas das ferramentas disponíveis para os setores de Tecnologia da Informação que permitam alto nível de produtividade.

Considere como exemplo um sistema com com apenas 5 clientes. Como temos três ambientes diferentes para cada cliente devemos gerenciar 15 ambientes, cada um com seus ativos de software, banco de dados, scripts de teste, etc. Torna-se impossível usar maquinas reais nesta tarefa pois teríamos uma pilha de 15 máquinas que consumiria muitos recursos e muito espaço físico.  Para resolver este problema é necessário compartilhar os recursos de hardware usando algum tipo de virtualização.

 

Virtualização

Podemos optar por usar Maquinas Virtuais para facilitar o gerenciamento e provisionamento de serviços. Neste caso entra em cena a ferramenta Vagrant que facilita a criação dessas máquinas virtuais e o provisionamento de recursos de forma programática. Isto é possível usando ferramentas como Puppet, Salt, Chief ou Ansible.

A criação e manutenção de uma máquina virtual (Virtual Box, Hyper-V ou VMWare) demanda grande quantidade de tempo e, muitas vezes complexa. Além do fato dessas máquinas virtuais consumirem uma quantidade imensa de espaço em disco.  

 

Melhorando o modelo

 

Devido ao crescimento da demanda por Maquinas Virtuais e grande dificuldade na operação desse ambiente surgiu a necessidade de melhorar esse modelo. Os pesquisadores desta área perceberam que não havia a necessidade de recriar um SO completo e que bastava reusar os recursos de um mesmo SO num espaço de run-time independente chamado Virtual Environment. Lançando mão de uma funcionalidade nativa do Kernel Linux, para facilitar a criação e gestão destes ambientes virtuais leves, eles conseguiram ótimos resultados. Assim surgiu o LxC e mais recentemente o Software Docker que em pouco tempo roubou a cena quando se fala em automatizar a infraestrutura de software e hardware.

 

O Vagrant e o Docker se complementam num ambiente de Gerenciamento de infraestrutura de TI mais sofisticado.

 

Detalhando

 

A seguir vamos detalhar um pouco mais o Docker que é uma ferramenta extremamente útil na gestão de múltiplos ambientes para Gerenciamento do Ciclo de Vida do Software.

 

O Docker é uma plataforma aberta usada por desenvolvedores e administradores de sistemas para construir, entregar e rodar aplicações distribuídas. É composto pelo Docker Engine, que é uma ferramenta leve de execução e empacotamento, e pelo Docker Hub, um serviço em nuvem responsável pelo compartilhamento de aplicações e automação de fluxos de trabalho. Ele permite que aplicações sejam rapidamente montadas e elimina as diferenças entre os ambientes de desenvolvimento, testes e produção.

 

O Docker não é uma ferramenta de virtualização de máquinas, ele é um ambiente de virtualização de Linux, construído sobre os LinuX Contêineres (LxC), que utiliza as funcionalidades cgroups e namespacing do Kernel do Linux (e a linguagem Go) para criar e rodar ambientes Linux Virtuais isolados em um único host. Mais recentemente a equipe do Docker em parceria com 34 outras empresas (https://www.opencontainers.org/) fundaram a Open Container Initiative para padronizar conteineres e a forma de executá-los independente de sistema operacional.

 

O Virtual Environment – VE roda diretamente sobre o kernel já existente (do host) e apenas cria um contêiner  onde serão executados seus aplicativos, onde até é possível recriar outra configuração de SO, já que este será apenas outro aplicativo rodando sobre o kernel.

 

Vale observar que o Docker compartilha o kernel do Linux entre os ambientes e portanto seus contêineres não terão completo isolamento como acontece numa maquina real ou numa maquina virtual completa rodando sob Virtual Box, Hyper-V ou VMWare.

 

Acontece porém que o isolamento que ele proporciona atende plenamente as necessidades dos Sistemas de Informação em ambientes controlados, com a vantagem de executar extremamente rápido. Por exemplo, podemos rodar um comando num contêiner à partir do Host em alguns milisegundos.

O Docker usa AuFS (advanced multi layered unification filesystem) como sistema de arquivos, assim ele reutiliza a imagem do SO e as imagens relativas a cada um dos serviços instalados entre vários de seus contêineres em execução economizando recursos valiosos do computador host.

 

O Docker permite Implantação portátil através de máquinas, pois podemos usar o Docker para criar um objeto único que contém todas as suas aplicações empacotadas o qual chamamos Imagem Docker. Este objeto pode ser transferido e rapidamente instalado em qualquer outro host Linux com Docker habilitado, incluindo maquinas reais ou virtuais rodando Linux, Windows ou MAC OSX.

 

O Docker permite Reutilização de componentes pois podemos “empilhar” pacotes já criados cada um com sua funcionalidade específica. Por exemplo, se você precisa criar várias máquinas que todos necessitam de banco de dados Oracle e WebServer Apache, podemos criar uma imagem base contendo o Oracle e outra contendo o Apache, e na sequência, construir e criar novos contêineres que utilizam estas imagens base já criadas.

 

O Docker pode usar imagens disponíveis em bibliotecas compartilhadas. Existe um registro público onde podemos encontrar milhares de imagens já prontas (https://hub.docker.com/explore/)

 

Principais Funcionalidades do Docker

 

Contêineres facilmente portáveis: você pode criar uma imagem de toda a configuração e aplicativos instalados em seu contêiner, transferir e instalar em um outro host desde que tenha um Docker previamente instalado.

 

Versionamento: Docker permite que você versione as alterações de um contêiner de uma forma muito semelhante ao feito pelo GIT ou SVN. Isto permite portanto verificar as diferenças entre versões, fazer commit de novas versões e fazer rollback de uma dada versão.

 

Reutilização de componentes: as imagens criadas podem ser reutilizadas, como por exemplo, se diversas de suas aplicações utilizam um stack com Java 8, Tomcat 8 e Oracle 12 você poderá criar uma uma imagem base contendo estes itens com sua instalação e configuração. Desta maneira esta imagem poderá ser reutilizada em diversos Contêineres diferentes.  podemos construir imagens Docker usando um arquivo Dockerfile e o comando de montagem docker build. O Dockerfile usa uma DSL – Domain Specific Language –  simples com poucas instruções, porém sufucientes para construir imagens Docker. A abordagem de criação via Dockerfile pode ser repetida quantas vezes for necessário, em quantos ambientes seja desejado além de permitir gerenciamento de versão no GIT/SVN das definições da infraestrutura. Com esta DSL o Docker consegue levar a Metodologia de Orientação a Objetos para o provisionamento da Infraestrutura.

 

Compartilhamento: o Docker Hub já possui milhares de contêineres com as mais diversas aplicações instaladas e configuradas, desta maneira você pode rapidamente criar sua aplicação com uma base desenvolvida por outra pessoa, ou ainda criar sua base e compartilhá-la.

 

CLI – Command Line Interface e API – Application Program Interface: Permite criação de Programas e Scripts que interagem com o Docker para provisionar serviços nos Contêineres.

 

Automatização de Implantação dentro dos Contêineres: Usando os provisionadores que por sua vez usam a API do Docker, podemos automatizar a implantação dos ambientes de software.

 

Licença Open Source: Licenciado como Apache License, Version 2.0 mantem os códigos fonte em https://github.com/docker/docker para facilitar o desenvolvimento colaborativo.

 

Evita Dependency Hell: Um dos maiores problemas em múltiplos ambientes com os quais os desenvolvedores de software convivem diariamente é o gerenciamento de dependências. O Docker evita problemas neste gerenciamento.

 

Demanda Poucos Recursos de Hardware: Exige poucos recursos de processos, memória e espaço em disco.

 

Performance inigualável: é possivel baixar uma imagem Fedora do repositório público na Internet em menos de um minuto e executar um comando simples num contêiner criado com esta imagem, à partir do computador Host, em menos de um segundo.

  

Ligação entre Contêineres

Conectar contêineres via mapeamentos de porta TCP/IP não é a única forma de disponibilizar recursos entre eles. Um contêiner Docker pode se conectar a um outro via um sistema de ligação e enviar informações de um para o outro de forma eficiente e segura. Quando os contêineres estão ligados, a informação sobre o contêiner origem pode ser enviada para um contêiner destino. Isso permite que o contêiner destino possa acessar dados selecionados do contêiner origem. Como exemplo, podemos então criar um contêiner chamado web (destino) e ligá-lo a um contêiner chamado db (origem) usando um alias para o link chamado dblink, por exemplo. Para permitir a ligação o Docker cria um tunel seguro entre o contêiner origem e o contêiner destino, eliminando a necessidade de expor qualquer porta TCP/IP externamente a estes dois contêineres.

 

Orquestração com Docker Compose

 

Docker Compose é uma ferramenta para definir e rodar aplicações complexas via Docker. Com Compose, podemos definir uma aplicação multi-contêiner num único arquivo, e em seguida iniciar a aplicação e tudo da qual ela depende para sua executação. O Docker Compose é ótimo para usar em ambientes de desenvolvimento, homologação e Integração Contínua e permite implementar Arquitetura de Micro Serviço de forma simples.

 

Para saber mais sobre Docker Compose e Orquestração de Serviços e obter todas as vantagens desta plataforma faça o curso Introdução ao Docker compreendendo 16 horas. Link permanente : http://cursos.escolalinux.com.br/curso/introducao-ao-docker-16-horas

 

Virtualização Enxuta
Por tudo isso que foi exposto aqui podemos dizer que o Docker permite levar para a Infraestrutura de TI esta Técnica de Virtualização Enxuta que nos proporciona o benefício da eliminação de desperdício da mesma forma que é preconizada pelas Metodologias Ágeis para Desenvolvimento de Software (SCRUM/XP) e de Produtos e Negócios (Lean Startup).

 

O Docker no Comando

Aliando o Docker com uma ferramenta de Integração Contínua, tal como o Jenkins, podemos gerenciar automáticamente via Scripts todo o ciclo de vida da aplicação. Isto é possível devido a sua característica de permitir que instalemos e executemos uma instância de Docker de dentro de outro Contêiner Docker.

 

 

 

Posicionamento do Docker no mercado

Os profissionais de TI que estão escolhendo uma tecnologia para automatizar sua infraestrutura vão gostar de ver este gráfico abaixo que mostra como o mercado está vendo está revolução causada pelo Docker principalmente à partir de meados de 2014 para cá. O crescimento do Docker foi exponencial.

O Vagrant não compete diretamente com o Docker e também está crescendo, porém mais lentamente.

Este gráfico reflete aquilo que já sabíamos mesmo que intuitivamente: as funcionalidades implementadas pelo Docker para suporte ao que podemos chamar de Virtualização Enxuta está surpreendendo o mercado de TI devido ao uso super eficiente de recursos (Memória, Disco, CPU) e a facilidade com que permite tirar proveito desses recursos.

Por curiosidade podemos comparar as pesquisas feitas sobre Docker com aquelas feitas sobre Lean Startup e SCRUM que também estão relacionados a eliminação de desperdício, porém nas áreas de Gestão de Negócios e Gestão de Desenvolvimento de Software respectivamente. Veja o gráfico abaixo mostrando como a curva de interesse pelo Docker é muito mais ascendente. Isto reflete a Inovação que o Docker incorporou e o quanto o mercado está empolgado com esta descoberta.

Por isso é muito importante que nós profissionais de TI nos especializemos nesta tecnologia para tirar o máximo de proveito dela para diminuir o esforço de Gestão de Infraestrutura nos nossos Centros de Processamento de Dados.

Para quem desejar se aprofundar no Docker pode solicitar um cupom de desconto para o curso neste link

Este é um curso on-line que preparei para a Escola Linux empresa do grupo Linux Solutions.

Obs.: Uma das sessões do curso trata da utilização do Docker na plataforma Windows e na plataforma MAC OSX.

SCRUM, Métodos Ágeis e Docker

O evento anual de SCRUM e Metodologias Ágeis Regional Scrum Gathering® Rio 2015  aconteceu nos dias 13, 14, e 15 de agosto em Copacabana, coração do Rio de Janeiro. Este evento Scrum Gathering é marca registrada da Scrum Alliance que ocorre em todo o mundo e no Brasil é realizado pela K21  empresa certificada para treinamentos SCRUM com grande experiência nessas metodologias que estão revolucionando a forma de gerir projetos e negócios. O evento demonstrou o interesse cada vez maior dos participantes pela aplicação destas metodologias nos negócios. Antigamente este evento era mais focado na gestão ágil para Desenvolvimento de Software mas agora toma outra dimensão.

 

 

Um pouco de história

O embrião destas metodologias ágeis surgiram na industria automotiva Japonesa, ou mais específicamente na Toyota como descreve Jeff Sutherland em seu livro Scrum: A Arte de Fazer o Dobro do Trabalho na Metade do Tempo. Jeff e seus colaboradores trouxeram estas ideias da Industria Automobilistica consolidando como metodologia ágil para a área de desenvolvimento de software. Mais recentemente Eric Ries aplicou estes conceitos para negócios e produtos como descrito no seu livro A Startup Enxuta (The Lean Startup)

O segredo do sucesso

O que está por trás do sucesso dessas metodologias é a eliminação do desperdício, o foco no cliente, o uso de métricas e experimentação, a colaboração e comprometimento nas equipes altamente integradas, a simplificação dos processos de gestão e o uso de ferramentas adequadas de TI.

Onde entra o Docker nisso ?

É neste ultimo item que entra o  Docker e a tecnologia de Contêineres. Esta tecnologia que iniciou com o suporte a LXC – Linux Containers, agora ganhou uma especificação independente de Sistema Operacional o que permitirá que a Microsoft lance em breve sua versão nativa de Docker (hoje ela roda numa mini maquina virtual Linux chamada Boot2Docker). O mesmo poderá ser feito no BSD, no Solaris, no MAC OSX e em outros sistemas num futuro próximo.

Enquanto isso podemos usar o a versão atual sem nenhum prejuizo já que o Docker roda 100% na maioria dos provedores de Cloud Computing e nos nossos Centros de processamento de Dados locais.

O Docker já é um EcoSistema de automação de Infraestrutura totalmente alinhado com os objetivos dos Processos Enxutos. Com ele podemos implementar nossa infraestrutura para Testes Automatizados, Integração Contínua, Entrega Contínua com a Escalabilidade e Resiliência desejada e exigida pelos negócios modernos baseados na WEB, no Comércio Eletrônico nas Apps Móveis com geolocalização e integração com mídias sociais.

A eliminação do desperdício é uma das grandes vantagens do Docker devido a sua arquitetura de imagem em camadas reutilizáveis. Enquanto uma máquina virtual leva minutos para levantar um serviço, no Docker isso pode levar alguns poucos segundos, graças a reusabilidade extrema de recursos.

A nivel de Arquitetura o Docker valoriza Micro Serviços permitindo integração completa e segura entre Contêineres.

Com isso o Docker pode ajudar a implementar os métodos ágeis incluindo Startup enxuta, Integração Contínua,  Testes Automatizados e Entrega Contínua num indice de produtividade excelente melhorando o Time-to-Market e ao mesmo tempo alcançando um melhor Retorno de Investimento.

Parabéns a equipe da K21 pelo evento e esperamos ansiosamente o próximo em 2016.

Para quem desejar se aprofundar no Docker pode solicitar um cupom de desconto para o curso neste link

Este é um curso on-line que preparei para a Escola Linux

 

Como Instalar o Docker no Windows e no MAC OSX

Neste post vou mostrar como instalar o Docker no Windows 7 e no MAC OSX Yosemite.

Neste video começo com a Instalação no Windows.

Aos 10 minutos e 22 segundos do Video eu começo a instalação no MAC OSX que dura menos de 7 minutos, bem mais rápido que no Windows.

Qualquer dúvida deixe um comentário abaixo que responderei com o maior prazer.



Matricule-se no curso para saber mais sobre esta tecnologia revolucionária
.

Matricule-se no curso para saber mais sobre esta tecnologia revolucionária

Se desejar um cupom de desconto, deixe um comentário que enviarei o link direto por e-mail.

Você pode também acessar a página do facebook no link abaixo:

https://www.facebook.com/joaoparanaweb

Interface Bridge no Boot2Docker

Configurando o Virtual BOX

É bastante util configurar uma placa de rede adicional no Virtual Box com interface Bridge.

Isso permite que o Docker obtenha um endereço IP do servidor DHCP disponivel na rede do seu computador Host (Windows ou MAC)

O problema é que a faixa de IP padrão usada pelo Virtual Box é 10.0.2.* e no caso de sua rede usar esta mesma faixa você deverá informar ao Virtual Box que ele deve usar outra faixa.

Para isso você deve usar o comando abaixo:

VBoxManage modifyvm "boot2docker-vm" --natnet1 "192.168.197.0/24"

Usei aqui a faixa 192.168.197. pois usualmente as redes WiFi já usam 192.168.1.

Rede Boot2Docker

Veja na imagem:

  1. Adaptador de rede usando NAT (Adapter 1) que foi modificado via comando VBoxManage modifyvm
  2. Adaptador de rede usando Bridge (Adapter 3)

Você pode fazer a mesma coisa para outras maquinas virtuais. Por exemplo, suponha uma maquina virtual com Windows 7 chamada Win7-64bits, voce pode executar o comando abaixo

VBoxManage modifyvm "Win7-64bits" --natnet1 "192.168.199.0/24"

Listando as Interfaces de rede você verá algo parecido com isto abaixo:

C:\Users\admin>ipconfig

Configuração de IP do Windows


Adaptador Ethernet Conexão local 2:

   Sufixo DNS específico de conexão. . . . . . : exemplo.com.br
   Endereço IPv4. . . . . . . .  . . . . . . . : 192.168.2.15
   Máscara de Sub-rede . . . . . . . . . . . . : 255.255.255.0
   Gateway Padrão. . . . . . . . . . . . . . . : 192.168.2.1

Adaptador Ethernet Conexão local:

   Sufixo DNS específico de conexão. . . . . . : exemplo.com.br
   Endereço IPv6 de link local . . . . . . . . : fe80::4592:a448:1ac2:d90c%11
   Endereço IPv4. . . . . . . .  . . . . . . . : 192.168.199.15
   Máscara de Sub-rede . . . . . . . . . . . . : 255.255.255.0
   Gateway Padrão. . . . . . . . . . . . . . . : 192.168.199.2

Adaptador de túnel isatap.exemplo.com.br:

   Estado da mídia. . . . . . . . . . . . . .  : mídia desconectada
   Sufixo DNS específico de conexão. . . . . . : exemplo.com.br

O endereço 192.168.199.15 foi obtido para a interface usando o NAT e o endereço 192.168.2.15 foi obtido pelo DHCP server da rede local do Host MAC OSX.

Rede Boot2Docker

Veja na imagem:

  1. Adaptador de rede usando NAT (Adapter 1) que foi modificado.
  2. Adaptador de rede usando Bridge (Adapter 2)

A linguagem GO

O começo de tudo

O panorama das linguagens de programação tem mudado drasticamente nos últimos anos. Essa coisa toda de linguagem de programação de alto nível começou com a linguagem C No clássico o trabalho do Brian Kernighan e Dennis Ritchie – The C Programming Language

logotipo GOLANG

Evolução do panorama

Posteriormente surgiram linguagens mais sofisticadas como Java, C# (.Net com um conjunto variado de linguagens suportadas na plataforma), JavaScript (dominando o cenário na WEB), TypeScript (trazendo tipagem forte para o JavaScript – patrocinado pela Microsoft). A Apple também não ficou atras e lançou recentemente uma Linguagem chamada Swift com tipagem forte que usa o LLVM – mesmo compilador usado pela National Instruments no LabView. Esta linguagem é uma grande evolução em relação a anteriormente usada pela Apple, Objective C. Swift merece um post exclusivo para discutir as vantagens implementadas.

Neste post falaremos da linguagem GO patrocinada pelo Google e de código livre. Ela surgiu em 2009 e gera código nativo nas plataformas Windows, Linux, FreeBSD e MAC OSX. A sintaxe é semelhante a linguagem C com algumas variações na gramática que estão relacionadas a declaração de tipos e ausência de parênteses nas estruturas FOR e IF, por exemplo. Ela também possui coletor de lixo (garbage colector) e um modelo de concorrência robusto. Não possui programação genérica, nem herança, nem tratamento de exceção com try catch. Também não aceita sobrecarga de métodos. Você pode, porém, usar programação funcional com clausuras. Vetores associativos fazem parte da estrutura da linguagem (algo parecido com o feito no Javascript). GO também suporta UTF-8 e pode converter de UTF-16 também.

Os compiladores GO usam a infraestrutura GNU, largamente usada em todas as plataformas.

Um programa GO começa com a declaração do pacote ou seja espaço de nomes (namespaces). Em seguida vem as declarações de importação de pacotes.

O programa principal deve declarar o método via palavra reservada func e o nome deste método deve ser main.

Em seguida usamos as estruturas da linguagem juntamente com os pacotes importados para criar as funcionalidades desejadas.

package main

import "fmt"

func main() {
    fmt.Println("Hello, 世界")
}

As estruturais existentes são aquelas típicas de sequência, seleção e repetição e como já foi provado bastam essas estruturas para resolver qualquer problema de computação.

A clausura ajuda não questão de guardar estado e permitir implementação da abordagem funcional.

Existe um site bastante útil que mostra as características da linguagem através de exemplos

A instalação da linguagem no ambiente MAC OSX da Apple é bastante simples. O mesmo ocorre no ambientes Linux e FreeBSD. No Windows você pode usar o arquivo .msi adequado a sua plataforma (32 ou 64 bits). Veja este link para Download

A propósito a linguagem GO dera código bastante eficiente e também possui pacotes nativos para lidar com o sistema de arquivos com os processos, com o ambiente e com as interfaces de rede. Você pode implementar um servidor HTTP em poucas linhas de código, como mostrado no exemplo abaixo.

Uma coisa muito em importante sobre GO é o fato do Docker usar a linguagem GO Na sua implementação. Como benefício disso você tem a possibilidade de criar Imagens de Contêineres usando a linguagem GO.

Exemplos comentados

Veja também alguns exemplos comentados neste link e deixe sua dúvida e opinião aqui no Blog.

Integracão GO com Docker.

Neste projeto do Github você pode acessar dois Dockerfiles. Um deles cria um contêiner Docker para desenvolver código GO (diretório dev) e o outro cria um contêiner Docker para colocar este código em produção sem a necessidade de se carregar um Linux completo tal como Debian ou Ubuntu (diretório prod). O contêiner de produção ficou com menos de 6 MB. Incrivel, não é mesmo ?

Imagens Docker – copy-on-write

O Docker usa uma técnica conhecida como copy-on-write quando cria suas imagens.

 

Escolhi apresentar a explicação de como isso funciona via um video devido a complexidade de apresentar isso por escrito.

 

Este video faz parte do curso Introdução ao Docker que estou desenvolvendo para a Linux Solutions.

 

 

 

Esta  característica é é que faz do Docker um produto tão especial. Ela permite criar Imagens em camadas de forma muito rápida e eficiente reusando camadas existentes em outras imagens já disponíveis no seu computador host.

 

Nesta animação mostro como funciona esse mecanismo considerando um computador Host com Ubuntu Server 64 bits versão 14.04

 

Neste computador você pode instalar uma versão 1.7 (ou superior) do Docker.

 

Quando criamos uma imagem e executamos um contêiner à partir dela, usando o comando mostrado no vídeo, o ambiente virtual do Docker adiciona ao contêiner uma camada com bootfs e em cima dela uma camada com debian, depois outra com apache e ao final uma com php.

 

Todas estas camadas são ead-only. Ao final o docker adiciona uma ultima camada read-write para acomodar as alterações no ambiente em run-time. Esta camada será a única que aceitará modificações e cada recurso alterado será copiado deixando o anterior (da camada read-only) escondido.

 

Esta técnica permite uma reusabilidade sem precedentes.

 

 

Veja o video para entender melhor. Procure ver em HD para melhor qualidade de imagem.

 

Obrigado por visitar meu site.