Shared posts

31 Oct 01:44

O que é Spring Security?

by Alexandre Afonso

O Spring Security tem recursos avançados e de simples configuração para lhe ajudar com a segurança da sua aplicação.

Falando nisso, e a sua aplicação web? Está segura!? Hoje vamos conversar sobre como você pode aplicar segurança profissional nela.

Veremos algumas coisas bem legais agora. Fique comigo nos próximos minutos que você irá aprender sobre:

  • O que é Spring Security
  • Como configurar o Spring Security
  • Configurar autenticação em memória
  • Como fazer autenticação via JDBC
  • Como fazer autenticação via JPA utilizando a interface UserDetailsService
  • Criar uma página de login customizada
  • A função “lembrar-me”
  • Criar a funcionalidade de logout
  • Como adicionar permissões (autorização) em nossas páginas

Vamos lá?

O que é Spring Security?

Spring Security tem o foco em tornar a parte de autenticação e autorização uma coisa simples de fazer. Ele tem uma variedade muito grande de opções e ainda é bastante extensível.

Com algumas poucas configurações já podemos ter uma autenticação via banco de dados, LDAP ou mesmo por memória. Sem falar nas várias integrações que ele já suporta e na possibilidade de criar as suas próprias.

Quanto a autorização, ele é bem flexível também. Através das permissões que atribuímos aos usuários autenticados, podemos proteger as requisições web (como as telas do nosso sistema, por exemplo), a simples invocação de um método e até a instância de um objeto.

Sem contar que, por tabela, nós já protegemos as nossas aplicações de diversos ataques como o session fixation (link em inglês) e o cross site request forgery (link em inglês).

Como configurar o Spring Security

Para começar, já estou considerando que você tem um projeto com Spring MVC configurado. Caso você não tenha, pode ficar tranquilo que irei disponibilizar o código-fonte dos exemplos desse artigo aqui.

Falando especificamente das configurações do Spring Security, para começar você vai precisar criar uma classe que estenda AbstractSecurityWebApplicationInitializer.

Ela vai servir para adicionar o filtro do Spring Security.

import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;

public class SpringWebSecurityInitializer extends AbstractSecurityWebApplicationInitializer {

}

Agora nós vamos começar a fazer configurações mais específicas. A primeira forma de autenticação será HTTP Basic e, por ora, o sistema não exigirá permissões de acesso. Vai ser necessária somente a autenticação.

Faremos isso com a criação de uma classe qualquer que estenda SecurityWebConfigAdapter. Depois sobrescrevemos o método configure para alterarmos a instância de HttpSecurity conforme nossa necessidade.

@EnableWebSecurity
public class SecurityWebConfig extends WebSecurityConfigurerAdapter {
  
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            // Para qualquer requisição (anyRequest) é preciso estar 
            // autenticado (authenticated).
            .anyRequest().authenticated()
        .and()
        .httpBasic();
  }

}

Importante não esquecer da anotação @EnableWebSecurity. Como o próprio nome diz, é ela que habilita os recursos de segurança em nossa aplicação.

Podemos dizer que temos 50% configurado. Ainda faltam os usuários. Vamos começar buscando eles em memória.

Autenticação em memória

A configuração de usuários em memória, geralmente, não é utilizada em produção, mas pode ser muito útil no início do desenvolvimento.

Continuando a alteração na nossa classe SecurityWebConfig, agora vamos sobrescrever o método configure que recebe a instância de AuthenticationManagerBuilder. Utilizaremos esse objeto para criar nossos usuários.

public class SecurityWebConfig extends WebSecurityConfigurerAdapter {

  ...

  @Override
  public void configure(AuthenticationManagerBuilder builder) throws Exception {
    builder
        .inMemoryAuthentication()
        .withUser("garrincha").password("123")
            .roles("USER")
        .and()
        .withUser("zico").password("123")
            .roles("USER");
  }
}

Veja que agora temos dois usuário configurados: o garrincha e o zico.

Já podemos fazer um teste em nossa aplicação.

Autenticação HTTP Basic

Autenticação via JDBC

Essa já é uma boa alternativa até mesmo para o projeto em produção. Para utilizar essa opção do Spring Security vamos precisar apenas de uma fonte de dados e do SQL referente as consultas que buscam o usuário no banco.

Provavelmente, você já foi alertado de que não é seguro deixar as senhas serem gravadas limpas na base de dados. Por isso vou aproveitar também para utilizar um PasswordEncoder que irá resolver esse problema.

Dessa forma poderemos salvar nossos usuários com senhas criptografadas que a implementação de PasswordEncoder irá ajudar o Spring Security a comparar a senha submetida na hora do login.

Veja aqui como fica nosso método configure(AuthenticationManagerBuilder):

public class SecurityWebConfig extends WebSecurityConfigurerAdapter {

  private static final String USUARIO_POR_LOGIN = "SELECT login, senha, ativo, nome FROM Usuario"
            + " WHERE login = ?";
  
  private static final String PERMISSOES_POR_USUARIO = "SELECT u.login, p.nome FROM usuario_permissao up"
            + " JOIN usuario u ON u.id = up.usuarios_id"
            + " JOIN permissao p ON p.id = up.permissoes_id"
            + " WHERE u.login = ?";
  
  private static final String PERMISSOES_POR_GRUPO = "SELECT g.id, g.nome, p.nome FROM grupo_permissao gp"
            + " JOIN grupo g ON g.id = gp.grupos_id"
            + " JOIN permissao p ON p.id = gp.permissoes_id"
            + " JOIN usuario_grupo ug ON ug.grupos_id = g.id"
            + " JOIN usuario u ON u.id = ug.usuarios_id"
            + " WHERE u.login = ?";
    
  @Autowired
  private DataSource dataSource;

  ...
  
  @Override
  protected void configure(AuthenticationManagerBuilder builder) throws Exception {
    builder
        .jdbcAuthentication()
        .dataSource(dataSource)
        .passwordEncoder(new BCryptPasswordEncoder())
        .usersByUsernameQuery(USUARIO_POR_LOGIN)
        .authoritiesByUsernameQuery(PERMISSOES_POR_USUARIO)
        .groupAuthoritiesByUsername(PERMISSOES_POR_GRUPO)
        .rolePrefix("ROLE_");
  }
}

Feita a alteração acima, agora você já pode fazer  o login na aplicação via JDBC.

Para aqueles que quiserem saber como a senha deve ser salva na base de dados, eu deixei um método main na classe que vai ajudar com isso. Veja:

public class SecurityWebConfig extends WebSecurityConfigurerAdapter {

  public static void main(String[] args) {
    System.out.println(new BCryptPasswordEncoder().encode("123"));
  }
}

Com o resultado do método encode você consegue fazer um insert para um usuário de teste:

insert into Usuario (id, nome, login, senha, ativo) values 
    (1, 'Alexandre Afonso', 'alexandre', '$2a$10$ARppQC0FRWaGP4pnZqYbpuVyYOWIp4q1r2ViT3PGYK6BafD5PXFiS', true);

No projeto de exemplo, que irei disponibilizar no final do artigo, tem um arquivo chamado import.sql que é executado automaticamente e já faz as inserções iniciais para os nossos testes aqui.

Autenticação via JPA com a interface UserDetailsService

Como disse, a configuração via JDBC, mostrada anteriormente, já é uma boa opção para se utilizar em produção, mas muitas vezes é necessária uma configuração mais personalizada utilizando a interface UserDetailsService.

Iremos utilizá-la para poder fazer a consulta na base de dados com JPA.

Para o nosso exemplo eu criei três entidades que participarão do processo de autenticação. São elas: a entidade Usuario, Grupo e Permissao. Como o código delas é bem simples, eu não irei mostrar aqui, mas você vai poder baixar o fonte e dar uma olhada nelas depois.

Além das entidades, cheguei a criar também a classe UsuarioSistema, que é uma implementação de UserDetails. Precisamos dela para conseguir dar um retorno para o método loadUserByUsername, que vamos implementar.

public class ComercialUserDetailsService implements UserDetailsService {
  
  @Override
  public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    return null;
  }

}

A única responsabilidade desse método é buscar o usuário pelo username. Não devemos fazer a validação da senha nele, pois quem vai fazer isso é o próprio Spring Security.

Vou utilizar JPA para buscar o usuário do banco de dados, mas é importante destacar que não importa de onde ele vem – banco de dados, memória, etc – o que importa é devolver uma implementação de UserDetails. Poderíamos utilizar aqui uma consulta JDBC com queries personalizadas, se quiséssemos.

Veja agora a implementação completa:

@Component
public class ComercialUserDetailsService implements UserDetailsService {
  
  @Autowired
  private Usuarios usuarios;

  @Autowired
  private Grupos grupos;
  
  @Autowired
  private Permissoes permissoes;

  @Override
  public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    Usuario usuario = usuarios.findByLogin(username);
    
    if (usuario == null) {
      throw new UsernameNotFoundException("Usuário não encontrado!");
    }
    
    return new UsuarioSistema(usuario.getNome(), usuario.getLogin(), usuario.getSenha(), authorities(usuario));
  }
  
  public Collection<? extends GrantedAuthority> authorities(Usuario usuario) {
    return authorities(grupos.findByUsuariosIn(usuario));
  }
  
  public Collection<? extends GrantedAuthority> authorities(List<Grupo> grupos) {
    Collection<GrantedAuthority> auths = new ArrayList<>();
    
    for (Grupo grupo: grupos) {
      List<Permissao> lista = permissoes.findByGruposIn(grupo);
    
      for (Permissao permissao: lista) {
        auths.add(new SimpleGrantedAuthority("ROLE_" + permissao.getNome()));
      }
    }
    
    return auths;
  }
}

Com o nosso UserDetailsService em mãos, podemos voltar na classe SecurityWebConfig e terminar a configuração:

public class SecurityWebConfig extends WebSecurityConfigurerAdapter {
  
  @Autowired
  private ComercialUserDetailsService comercialUserDetailsService;  


  ...


  @Override
  protected void configure(AuthenticationManagerBuilder builder) throws Exception {
    builder
        .userDetailsService(comercialUserDetailsService)
        .passwordEncoder(new BCryptPasswordEncoder());
  }

}

Ficou simples também, não é mesmo?

Dessa forma você já pode subir a aplicação para fazer mais esse teste.

Página de login customizada

Até o momento estamos fazendo o login via HTTP Basic. Vamos mudar isso agora.

Porém, antes de criarmos uma página de login customizada por nós, gostaria de mostrar pra você a página de login que existe dentro do próprio Spring Security. Para certos tipos de caso, pode ser uma boa opção.

Para utilizarmos ela vamos precisar alterar somente uma linha. Só que agora é no método configure que recebe um objeto do tipo HttpSecurity. Veja:

@EnableWebSecurity
public class SecurityWebConfig extends WebSecurityConfigurerAdapter {

  ... 

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .anyRequest().authenticated()
        .and()
        .formLogin(); // <<< de HTTP Basic para formulário
  }

  ...

}

Iniciando a aplicação novamente, a tela de login que você irá ver será esta:

Página de login do Spring-Security

É uma página bem simples, mas ela não foi feita para ser uma solução geral e sim para aqueles casos em que precisamos economizar tempo.

Bom… Agora vamos fazer a configuração para utilizarmos a nossa própria página de login.

@Override
protected void configure(HttpSecurity http) throws Exception {
  http
    .authorizeRequests()
        .anyRequest().authenticated()
    .and()
    .formLogin()
        // Aqui dizemos que temos uma página customizada.
        .loginPage("/login") 
        // Mesmo sendo a página de login, precisamos avisar
        // ao Spring Security para liberar o acesso a ela.
        .permitAll(); 
}

Agora vamos para o HTML do formulário de login. Ele precisa estar de acordo com as configurações explicitas e implícitas acima. Veja uma versão simplificada do nosso formulário:

<form th:action="@{/login}" method="post">
  <input name="username" class="form-control" placeholder="Usuário"/>
  
  <input type="password" name="password" class="form-control" placeholder="Senha"/>

  <button class="btn btn-primary btn-block">Entrar</button>
</form>

Temos 3 coisas a reparar nesse formulário: a ação, o nome do campo de usuário e o nome do campo de senha.

A ação é /login e  o método HTTP que será usado é o POST. Isso é porque a ação tem o mesmo path da URL que abre a página de login. Só que a requisição para página é feita com um GET para /login e a submissão do formulário é feita com um POST.

O campo “Usuário” precisa ter o nome username. Ele pode ser configurado explicitamente, mas eu preferi utilizar o padrão. Da mesma forma é o campo “Senha” de nome password.

Com as alterações acima já é possível fazer o login através da nossa página. Só que ainda temos um problema com os arquivos JS e CSS utilizados para montar o layout dela:

Pagina de login

Ela ficou bem parecida com a própria página do Spring Security, mesmo tendo alguns estilos já – aplicados pelo Bootstrap. Isso acontece porque ele restringiu o acesso aos recursos JS e CSS também. Afinal, em momento algum avisamos pra ele liberar.

Esse aviso é feito com a adição da linha:

antMatchers("/resources/**", "/webjars/**").permitAll()

Veja como ficou o método completo até aqui:

@Override
protected void configure(HttpSecurity http) throws Exception {
  http
    .authorizeRequests()
        .antMatchers("/resources/**", "/webjars/**").permitAll()
        .anyRequest().authenticated()
    .and()
    .formLogin()
        .loginPage("/login").permitAll(); 
}

Agora nossa página abre como esperado:

Pagina de login customizado no Spring Security

Um detalhe que não pode escapar é que foi preciso criar uma action que fosse responsável por devolver nossa página de login.

Criei um controlador bem simples para isso, que chamei de HomeController. Veja como ficou a action para /login, que devolve a nossa página customizada:

@Controller
public class HomeController {

  @GetMapping("/login")
  public String login() {
    return "login"; // <<< Retorna a página de login
  }
  
  @GetMapping("/")
  public String index() {
    return "inicio";
  }
}

Função “lembrar-me”

Uma função muito usada nos sistemas web e que os usuários gostam muito é a “lembrar-me”. Mais uma vez, o Spring Security vai ser uma mão na roda pra nós.

Pra que isso funcione na nossa aplicação é preciso acrescentar somente duas coisas dentro do que já temos.

Uma é o checkbox “lembrar-me” dentro do nosso formulário:

<form th:action="@{/login}" method="post">
  ...

  <button class="btn btn-primary btn-block">Entrar</button>

  <input type="checkbox" id="remember-me" name="remember-me" />
  <label for="remember-me">Lembrar?</label>
</form>

Repare que o nome do checkbox precisa ser remember-me. Como no caso do input de nome username, esse nome pode ser alterado, mas vou ficar com o padrão mesmo.

Nossa tela vai ficar assim:

Pagina de login com a funcao LEMBRAR-ME

A outra coisa que precisamos é a chamada do método rememberMe, que vai habilitar essa função pra gente:

@Override
protected void configure(HttpSecurity http) throws Exception {
  http
    .authorizeRequests()
        .antMatchers("/resources/**", "/webjars/**").permitAll()
        .anyRequest().authenticated()
    .and()
    .formLogin()
        .loginPage("/login").permitAll()
    .and()
    .rememberMe(); // <<< Habilita a função de "lembrar-me".
}

Depois dessa configuração você já pode reiniciar o servidor e testar o formulário. Faça o login com o campo “lembrar-me” marcado, depois feche todas as instâncias do navegador e entre novamente. O sistema não deve pedir que você se autentique.

Funcionalidade de logout

Do jeito que o sistema está até aqui, a única forma de sair é fechando o navegador. Vamos melhorar isso agora acrescentando um botão para sair.

É bem simples, pois, o Spring Security já tem essa funcionalidade implementada. Basta colocar esse formulário em qualquer lugar do seu sistema:

<form method="post" class="navbar-form navbar-right"
  th:action="@{/logout}">
  <button type="submit" class="btn btn-default">
    <span class="glyphicon glyphicon-log-out"></span> 
    Sair
  </button>
</form>

O mais importante nele é a ação do formulário – ele está fazendo um POST para /logout. Como quase tudo no Spring Security, esse path pode ser customizado, mas estou utilizando o padrão.

Na aplicação de exemplo, deixei o botão na barra superior:

Botao de sair

Autorização – permissões para acessar URLs

Como já temos a autenticação configurada – inclusive com login customizado -, podemos pensar um pouco em autorização. Vamos colocar permissões específicas para as nossas páginas.

Na verdade, no Spring Security nós colocamos permissões nas URLs, e não nas páginas. É quase a mesma coisa, mas com essa ideia podemos incluir permissões, por exemplo, em imagens, pois uma imagem tem uma URL e o Spring Security, como eu disse, protege URLs.

Para isso vou criar mais três ações no controlador que irão devolver as páginas que terão restrições.

public class HomeController {
  
  ...
  
  @GetMapping("/vendas")
  public String vendasLista() {
    return "vendas";
  }
  
  @GetMapping("/vendas/relatorios/custos")
  public String vendasRelatorioMensal() {
    return "vendas-relatorio-custos";
  }
  
  @GetMapping("/vendas/relatorios/equipe")
  public String vendasRelatorioEquipe() {
    return "vendas-relatorio-equipe";
  }
}

A página /vendas vai exigir somente a autenticação. Já as páginas /vendas/relatorios/custos/vendas/relatorios/equipe exigirão as permissões VISUALIZAR_RELATORIO_CUSTOS e VISUALIZAR_RELATORIO_EQUIPE, respectivamente.

Esse tipo de configuração nós fazemos também no método configure, que recebe uma instância de HttpSecurity.

@Override
protected void configure(HttpSecurity http) throws Exception {
  http
    .authorizeRequests()
        .antMatchers("/resources/**", "/webjars/**").permitAll()
        .antMatchers("/vendas/relatorios/equipe").hasRole("VISUALIZAR_RELATORIO_EQUIPE")
        .antMatchers("/vendas/relatorios/custos").hasRole("VISUALIZAR_RELATORIO_CUSTOS")
        .anyRequest().authenticated()
    .and()
    .formLogin()
        .loginPage("/login").permitAll()
    .and()
    .rememberMe();
}

Olha agora o que acontece quando você entrar no sistema com um usuário que não tem a permissão VISUALIZAR_RELATORIO_EQUIPE e tentar acessar a URL (ou página) /vendas/relatorios/equipe:

Erro 403

O acesso será negado, claro.

Conclusão

Como mostrei pra você agora, o Spring Security é uma solução profissional para proteção em nível de aplicação.

Mostrei como fazer a configuração do mesmo e depois trabalhamos com autenticação via memória, JDBC e JPA (com o UserDetailsService).

Utilizamos também 3 tipos de login: com HTTP Basic, com o formulário HTML do próprio Spring Security e, por último, fizemos um formulário personalizado.

No final do artigo mostrei como incluir permissões para diferentes URLs do sistema.

Espero que tenha gostado. :)

Gostaria de aprender sobre a integração de Spring Security com o Spring Boot? Então baixe agora o nosso e-book Produtividade no Desenvolvimento de Aplicações Web com Spring Boot:

FN013-CTA-Lead-Magnet--Img02

Um abraço pra você e até uma próxima!

PS: você pode baixar o código-fonte de exemplo em nosso GitHub: http://github.com/algaworks/artigo-spring-security

17 Apr 16:02

Palestra: Go em produção para APIs e microservices

by Vinicius Pacheco

Veja como a linguagem Go nos ajudou a chegar em uma API de alto desempenho de forma concisa, com exemplos usando como pano de fundo a API de cadastros da Globo.com. Veremos como saímos de 200 para 19 mil cadastros por segundo para os impactos desse crescimento rápido e as consequências do uso de Go. Também mostraremos como nossa arquitetura de microservices foi utilizada no projeto.

By Vinicius Pacheco
10 Mar 00:24

Programa Histórico



É, vai ficar pra história...HASuaHsuaHs

06 Mar 16:26

Ataque de riso ao vivo faz bem

by Carlos Tomé

ESPN

Dois jornalistas esportivos da ESPN chamam a atenção na programação. E não é só pelos comentários. Antero Greco e "Amigão" formam uma das duplas mais entrosadas da televisão, parecem mais dois amigos conversando de esporte. Pessoalmente não me canso de ver os famosos ataques de risos. Note nesse vídeo que já é possível escutar as risadas quando é falado o nome do jogador de Rugby, Louis Picamoles. Culpa da famosa água batizada da ESPN.

O post Ataque de riso ao vivo faz bem apareceu primeiro em Sedentário & Hiperativo.

06 Mar 16:01

Nasa disponibilizou de graça para download um verdadeiro tesouro de programação.

by noreply@blogger.com (Cláudio Florenzano)
Nasa disponibilizou de graça para download um verdadeiro tesouro de programação.
Nasa disponibilizou de graça para download um verdadeiro tesouro de programação.

Uma ótima notícia para os programadores: a Nasa disponibilizou de graça para download um verdadeiro tesouro de programação. Se trata de seu catálogo de software 2017/2018 com diversos programas, aplicativos e códigos.

É especialmente divertido para quem tem interesse em conhecer com os programas da Nasa funcionam. Há programas detalhados sobre os sistemas de vida no espaço ou de controle e navegação das naves.

Há também coisas bem mais simples, como jogos e simulações. E as opções não são atraentes apenas para quem manja de código: há também programas de fotografia e de vídeo em alta definição que devem fazer a alegria de muita gente de Humanas.

Até game designers e animadores podem tirar vantagem dos sistemas de construção de texturas e animação 3D. Enfim, tem programas para todos os gostos. Para baixar e conferir a lista, basta clicar aqui.

16 Feb 15:25

Como é um leilão de bois no Texas

by Joe

Taí um vídeo que seria impossível legendar. Veja e entenda:

Ranking de pessoas que falam rápido, do mais lento pro mais rápido:

– Narrador de rádio AM
– Eminem
– Sua namorada furiosa
– Esses caras

Dica do leitor Eron Alves.

14 Feb 18:57

Mundo Docker: Docker Stack e Deploy

Oi Pessoal,

Nós já conversamos sobre o Docker 1.13 aqui, agora vamos explorar um pouco mais sobre essa funcionalidade que saiu do modo experimental e tornou-se parte da engine estável do Docker, sim estamos falando do docker stack/deploy. Mas antes, recomendo fortemente você ler este post aqui sobre docker compose v3, ele é muito, mas muito importante mesmo para os exemplos que veremos neste post.

Agora com o Docker 1.13 é possível você portar suas aplicações do compose para o Swarm, e isso graças a funcionalidade de deploy disponível na engine. Seu funcionamento é bem simples, basta você informar na execução do comando o diretório de onde está o seu arquivo compose, e o nome da aplicação, se lembra que falei que era muito importante olhar esse post? Pois bem, não adianta você ter um compose escrito para a versão 2 e tentar utilizar aqui, será necessário você se altere para as novas regras da versão 3 para que seja possível a criação de sua stack pelo docker deploy. Mas digamos que você já tem seu arquivo pronto na versão 3, vamos pegar o exemplo do outro post, basta executar:

$ docker deploy --compose-file docker-compose.yml app

O retorno desse comando será

$ docker deploy --compose-file docker-compose.yml app
Creating network app_default
Creating service app_nginx
Creating service app_redis

Dessa forma foram criados uma rede e dois serviços, o mesmos definidos no arquivo compose. Para obter mais informações da stack, você pode executar os comandos:

$ docker stack ls
NAME SERVICES
app 2

Com o stack ls, será retornado todas as stacks que você criou, neste caso retornou apenas a “app” e informa também quantos serviços existem para essa stack, com este comando:

$ docker stack ps app
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
xb02xrua71db app_redis.1 redis:latest node1 Running Running 7 minutes ago
lm7k8obhncyl app_nginx.1 nginx:latest node1 Running Running 7 minutes ago
jh65f9scx0cq app_nginx.2 nginx:latest node1 Running Running 7 minutes ago

Você visualizará mais informações sobre a stack, como por exemplo o id de cada container, imagem utilizada, nome do container, nó onde está executando e claro o estado de cada container. Você pode ainda, executar o comando:

$ docker stack services app
ID NAME MODE REPLICAS IMAGE
g3i4f4erympf app_nginx replicated 2/2 nginx:latest
s11w093eraxz app_redis replicated 1/1 redis:latest

Para ter a visualização de sua stack no mesmo formato dos serviços (docker service ls).

O que fizemos até aqui foi portar uma stack do docker-compose para o cluster de swarm.

 

“Ahh mas como assim?”

Bom se você pegar esse mesmo arquivo de compose e executar: docker-compose up -d, ele funcionará também, sem erro, sua stack iniciará e ficará disponível para uso, MAS, não em cluster :), você continuará utilizando o docker-compose da mesma forma que antes, sem os benefícios do Swarm. Apenas com o docker deploy é que você poderá fazer o deploy e gerenciamento de sua stack dentro do cluster de swarm.

“Ok, entendido, mas como eu escalo agora a minha stack? Antes eu executava: docker-compose scale app=3, como faço isso com o docker stack?”, não se preocupe, você continuará tendo a possibilidade de escalar a sua stack, vamos lá: Já sabemos que o docker deploy criar todos os serviços necessários para a stack, certo? Pois bem, para escalar algum componente da sua stack, basta você escalar o serviço, da mesma forma como se você estivesse manipulando um serviço dentro do swarm, veja:

$ docker service ls
ID NAME MODE REPLICAS IMAGE
cnnabnpqkjvy app_redis replicated 1/1 redis:latest
pcn4urntqn8l app_nginx replicated 2/2 nginx:latest

Agora vamos escalar o serviço de nginx da minha stack app:

$ docker service scale app_nginx=4
app_nginx scaled to 4

E o resultado é:

$ docker service ls
ID NAME MODE REPLICAS IMAGE
cnnabnpqkjvy app_redis replicated 1/1 redis:latest
pcn4urntqn8l app_nginx replicated 4/4 nginx:latest

Ou seja, escalei apenas o nginx.

 

“Ok, muito bonito, mas como eu acesso a minha stack?”

Boa pergunta, mas é claro que há uma resposta, e é aqui que vem a parte mais legal ;).

Vamos voltar ao docker-compose.yml que usamos para criar essa stack, veja essas linhas:

nginx:
    image: nginx
    ports:
        - 80:80

Preste atenção no parâmetro: ports, ali você define em qual porta o serviço vai ouvir, neste caso, o nginx estará trabalhando na porta 80, ou seja, o serviço no cluster de swarm estará disponível para acesso através da porta 80, e todos os nós do cluster, quando receberem alguma requisição na porta 80 encaminharão para o container que atende este serviço (utilizando uma das funcionalidade do docker swarm que é a rede de serviço em mesh).
Quando escalamos um serviço, dizemos ao docker para adicionar mais containers para atender as requisições que estarão sendo feitas para o mesmo, ou seja, teremos diversos containers atendendo um único recurso que é o serviço, e o swarm se encarrega de distribuir os acessos para todos os containers.

 

“Ta bom, me convenceu, mas como removo tudo agora pra fazer direito?”

Muito fácil, da mesma forma que o docker service, basta você executar:

$ docker stack rm app
Removing service app_redis
Removing service app_nginx
Removing network app_default

E serão removidos todos os serviços, containers e rede que tenham sido criadas pela sua stack.

Interessante não? Esperamos que tenha sido útil, se ficou com dúvida nos avisa que ajudamos. Por hoje era isso, nos ajude divulgando o blog e fique atento, teremos mais novidades em breve ;).

Abraço!

 

07 Feb 18:34

Docker Compose v3

by Cristhian Bicca

Olá pessoal, tudo bem?

 

Conforme falamos em um post anterior o Docker lançou uma nova versão a 1.13 e nessa nova versão tivemos diversas melhorias e com a entrada dessa nossa versão também tivemos a criação de uma nova versão no Docker Compose que é a v3. Essa nova versão é totalmente compatível com o Docker Swarm que hoje é nativo na mesma engine no Docker, então agora com Docker Compose podemos gerenciar nossos serviços através do Docker Swarm.

Agora com a V3 existe opção chamada deploy que é responsável por realizar as implantações e execução de serviços. Dentro dessa opção temos as seguintes funções:

  • Mode
    • Onde é possível escolher a opção “Global” (Um container por nó de swarm) ou “Replicated” (Onde posso escolher a quantidade de réplicas que estarão distribuídas entre os nós). O padrão é replicated.
    • Replicas
      • replicas: x
    • Global
  • Placement
    • Especifica restrições de posicionamento são elas:
      • node.id = idworker
      • node.hostname = nomeworker
      • node.role = manager ou worker
      • node.lables = nome
      • engine.labels = Sistema Operacional ou Driver
  • Update_config
    • Configura como devem ser as opções de atualizações dos serviços.
    • Parallelism: 5 #O Numero de containers que vão ser atualizados em paralelo.
    • delay: 10s #O tempo entre cada grupo de containers será atualizado
    • failure_action: pause ou continue #O que irá acontecer se a atualização falhar. O padrão é pause.
    • monitor: 0s # Duração após cada atualização para monitorar a falha. O padrão é 0s.
    • max_failure_ratio: #Taxa de falha para atualizar.
  • resources
    • Configura a restrição de recursos
      • limits:
        • cpus: ‘0.5’ # 0.5 representa 50% de um núcleo, porem pode ser 1 ou 1.5 ou 2….
        • memory: ‘512M’ #apenas especificar o prefixo M, G, K….
  • Restart_policy
    • Configura como reiniciar os containers quando eles derem exit.
      • condity: none on-failure any #Por padrão é any
      • delay: 0s #Tempo entre as tentativas de reiniciar o containers #Por padrão é 0s
      • max_attempts: 0 #Quantas vezes irá tentar subir o container antes de desistir #Por padrão é nunca desistir.
      • window: 0s #Quanto tempo demora para decidir se um reinicio foi bem sucedido  #Por padrão é imediatamente,

 

Alem dessas opções, com a entrada da V3 foram descontinuadas as seguintes opções do Docker Compose: volume_driver, volumes_from, cpu_shares, cpu_quota, cpuset, mem_limit, memswap_limit

Agora vamos demonstrar um exemplo de como ficaria o docker-compose.yml com essas opções que mostramos acima.

version: "3"
services:

  redis:
    image: redis
    ports:
      - "6379"
    deploy:
      placement:
        constraints: [node.role == manager]
  nginx:
    image: nginx
    ports:
      - 80:80
    depends_on:
      - redis
    deploy:
      mode: replicated
      replicas: 2
      placement:
        constraints: [node.role == manager]
      resources:
        limits:
          memory: 512M
      restart_policy:
        condition: on-failure
        delay: 10s

Executando o comando docker deploy --compose-file docker-compose.yml nomedastack criamos a stack mencionada acima em nossa estrutura. Após executar esse comando é possível dar um docker stack ls e você poderá ver que a sua stack foi criada, com o nome da sua stack você pode executar o docker stack services nomedastack e poderá ver os serviços criados e qual o seu status.

Então ta pessoal, por hoje era isso, espero que tenham gostado e qualquer dúvida é só deixar um comentário que estaremos felizes em lhe ajudar, nos ajude divulgando o blog obrigado!

 

07 Feb 18:33

Alegria De Pobre Dura Pouco





aUShaUshausha é engraçado, porém meio triste haUShAUSha

03 Feb 15:43

Hackers invadem sistema de hotel e trancam portas de quartos.

by noreply@blogger.com (Cláudio Florenzano)
Hackers invadem sistema de hotel e trancam portas de quartos.
Hackers invadem sistema de hotel e trancam portas de quartos.
Um ataque hacker realizado contra um hotel na Áustria chamou a atenção no mês passado depois que os criminosos invadiram o sistema eletrônico de chaves do estabelecimento e trancaram cerca de 12 hóspedes para fora dos seus quartos.

Segundo reportagem do The New York Times, o ataque de ransomware aconteceu no último dia 22 de janeiro no Romantik Seehotel Jaegerwirt, localizado próximo ao lago Alpine.

O gerente do hotel, Christopher Brandstaetter, afirma que logo pela manhã recebeu um e-mail informando sobre o ataque e exigindo o pagamento de um resgate no valor de dois Bitcoins (cerca de 1.800 dólares) até o final daquele dia para liberar os quartos - a mensagem ainda trazia os dados da conta para depósito e encerrava com um simpático “Tenha um bom dia!”.

Em entrevista ao jornal americano, o diretor do estabelecimento revela que acabou cedendo à pressão e pagou o resgate exigido pelos criminosos, uma vez que os hóspedes já estavam reclamando que as chaves não estavam funcionando e era impensável simplesmente fechar as portas até resolver a questão. “Estávamos operando com lotação máxima, com 180 hóspedes, e decidimos que era melhor aceitar. Os hackers foram bastante insistentes”, explica.

O ex-policial britânico Tony Neate, que investigou cibercrimes por 15 anos, destaca que o ransonware “está tornando-se uma pandemia” e reconheceu que “hackear um hotel e trancar as pessoas para fora dos seus quartos é uma nova linha de ataque”.
02 Feb 14:10

Magazine Luiza repetirá promoção com wi-fi grátis em aeroportos

by Redação

Pessoa usando tablet

O Magazine Luiza anunciou esta semana que vai repetir a ação de disponibilizar wi-fi gratuito em aeroportos brasileiros, a partir do dia 31 de janeiro.

Depois de conectar mais de cem mil pessoas em terminais aéreos pelo País, na primeira edição da ação, realizada no ano passado, a varejista volta a oferecer o serviço de conexão para quem estiver esperando por seu vôo nos aeroportos de Congonhas (SP), Fortaleza, Santos Dumont (Rio), Recife, Salvador, Florianópolis e Porto Alegre.

Para a companhia, a ação promocional também será uma boa forma de impulsionar suas vendas online. A rede de varejo vai oferecer 10% de desconto em compras no app, para quem utilizar o wi-fi para baixar o aplicativo enquanto espera seu voo.

“A primeira edição da ação foi muito bem recebida pelos usuários, que acabaram virando fãs da marca”, afirma Ilca Sierra, diretora de marketing do Magazine Luiza. “Nessa segunda edição, esperamos atender ainda mais pessoas, que ainda vão encontrar produtos com preços exclusivos”, completou.

De acordo com o Magazine Luiza, a área digital é cada vez mais importante para a empresa. O e-commerce do Magazine Luiza hoje responde por 25% das vendas da empresa e seu aplicativo móvel, lançado em setembro de 2015, já conta com 4,2 milhões de downloads.

01 Feb 15:05

Ponto de ônibus 2.0 da Campus Party 2017 pode medir número de pessoas e até gerar energia

by Rafaela Pozzebon

Dentro da Campus Party 2017 não circula nenhuma linha municipal, porém, mesmo assim foi instalado um ponto de ônibus. A instalação é cheia de sensores que são capazes de contar o número de pessoas, medir a temperatura ambiente e ainda capturar ruídos, como o de tiros ou mesmo batidas de automóveis.

Os dados coletados podem ser usados pelo poder público para poder desenvolver novas políticas ou mesmo adequar as que já existem, disse Anderson Rodrigues, diretor de planejamento estratégico da Ótima, empresa que levou o protótipo à Campus Party. A companhia é uma das concessionárias que explora o mobiliário urbano na cidade de São Paulo, em troca da conservação dos pintos de ônibus.

Continue a leitura...

27 Jan 19:39

Trabalhando com o protocolo TCP/IP usando Go

by Edward Martins Jr.

Go é uma linguagem open source lançada, em 2009, pelo Google e criada por Robert Griesemer, Rob Pike e Ken Thompson.

Uma das coisas mais bacanas de Go é poder escrever código de forma simples, pouco verborrágica, estruturada e bastante eficaz, sem contar que é uma linguagem fortemente tipada, incrivelmente leve e suporta concorrência nativamente através de goroutines.

Dentre muitos pacotes, Go através do pacote “net” provê interfaces de acesso a I/O, incluindo a pilha TCP/IP, UDP, resolução por nome de domínio e UNIX Sockets.

Com uma ideia muito simples, neste artigo, iremos criar um cliente e um servidor TCP/IP que servirá para observarmos os principais aspectos destas implementações.

Para tal, vamos estabelecer um protocolo de comunicação bastante básico entre as duas aplicações para garantir que ambos, cliente e servidor, consigam executar suas tarefas.

Servidor

O protocolo de comunicação que nosso servidor deverá trabalhar será este:

  • Ouvir a interface tcp na porta 8081;
  • Aceitar conexões;
  • Dentro de um loop infinito, ouvir as mensagens a serem transmitidas pelo cliente;
  • Escrever no terminal estas mensagens;
  • Devolver a mensagem recebida ao cliente (eco).
package main

import (
	"bufio"
	"fmt"
	"net"
	"os"
	"strings"
)

func main() {

	fmt.Println("Servidor aguardando conexões...")

	// ouvindo na porta 8081 via protocolo tcp/ip
	ln, erro1 := net.Listen("tcp", ":8081")
	if erro1 != nil {
		fmt.Println(erro1)
		/* Neste nosso exemplo vamos convencionar que a saída 3 está reservada para erros de conexão.
		IMPORTANTE: defers não serão executados quando utilizamos os.Exit() e a saída será imediata */
		os.Exit(3)
	}

	// aceitando conexões
	conexao, erro2 := ln.Accept()
	if erro2 != nil {
		fmt.Println(erro2)
		os.Exit(3)
	}

	defer ln.Close()

	fmt.Println("Conexão aceita...")
	// rodando loop contínuo (até que ctrl-c seja acionado)
	for {
		// Assim que receber o controle de nova linha (\n), processa a mensagem recebida
		mensagem, erro3 := bufio.NewReader(conexao).ReadString('\n')
		if erro3 != nil {
			fmt.Println(erro3)
			os.Exit(3)
		}

		// escreve no terminal a mensagem recebida
		fmt.Print("Mensagem recebida:", string(mensagem))

		// para um exemplo simples de processamento, converte a mensagem recebida para caixa alta
		novamensagem := strings.ToUpper(mensagem)

		// envia a mensagem processada de volta ao cliente
		conexao.Write([]byte(novamensagem + "\n"))
	}
}

Cliente

O protocolo de comunicação que nosso cliente deverá trabalhar será este:

  • Conectar-se a interface tcp localhost na porta 8081;
  • Dentro de um loop infinito, realizar leitura do terminal;
  • Escrever no socket a mensagem digitada no terminal (transmitir);
  • Ouvir o retorno do servidor;
  • Escrever no terminal a mensagen retornada (eco).
package main

import "net"
import "fmt"
import "bufio"
import "os"

func main() {

	// conectando na porta 8081 via protocolo tcp/ip na máquina local
	conexao, erro1 := net.Dial("tcp", "127.0.0.1:8081")
	if erro1 != nil {
		fmt.Println(erro1)
		os.Exit(3)
	}

	for {
		// lendo entrada do terminal
		leitor := bufio.NewReader(os.Stdin)
		fmt.Print("texto a ser enviado: ")
		texto, erro2 := leitor.ReadString('\n')
		if erro2 != nil {
			fmt.Println(erro2)
			os.Exit(3)
		}

		// escrevendo a mensagem na conexão (socket)
		fmt.Fprintf(conexao, texto+"\n")

		// ouvindo a resposta do servidor (eco)
		mensagem, err3 := bufio.NewReader(conexao).ReadString('\n')
		if err3 != nil {
			fmt.Println(err3)
			os.Exit(3)
		}
		// escrevendo a resposta do servidor no terminal
		fmt.Print("Resposta do servidor: " + mensagem)
	}
}

Para ter uma boa experiência deste exemplo, execute primeiramente o tcp-server e, em seguida, o tcp-client preferencialmente em terminais diferentes para acompanhar o resultado.

Veja o resultado:

Servidor:

Cliente:

Servidor:

Cliente / Servidor:

Obviamente existem tratamentos que devem ser realizados quanto a quebra de protocolo, exceções decorrentes do processamento das mensagens ou perda de conexão por uma das partes, mas… isso é com vocês!

Conclusão, Go é muito divertido!

Para ajudar, confira os links abaixo:

27 Jan 19:34

O céu é o limite na utilização de Golang

by Carlos Correa

Golang ou simplesmente Go é uma linguagem de programação criada pela Google e que foi lançada em código livre em novembro de 2009. Tem um formato compilado e de programação concorrente. Foi concebida inicialmente em setembro de 2007, por Robert Griesemer, Rob Pike e Ken Thompson.

No Brasil, empresas como o Mercado Livre, Globo.com, Magazine Luiza, Walmart entre outras encontraram nessa linguagem a performance e a simplicidade necessárias para melhorarem seus processos de desenvolvimento de software, aumentar performance e ainda economizar, e muito, com recursos de hardware.

No Mercado Livre, no final de 2015, após uma bateria de testes com o Go mostrarem resultados extremamente positivos, decidimos começar o processo de migração do Grails. Atualmente, contamos com mais de 80 projetos novos ou migrados para Go e em todos os casos os resultados têm sido surpreendentes.

Entre esses projetos está o case da nossa API de Localizações, que antes utilizava Grails e foi reescrita em Go. Essa API é responsável pela geolocalização via IP, além de fornecer informações sobre as ruas, bairros, cidades e estados nos 19 países onde o Mercado Livre está presente atualmente. Trata-se de um recurso que tem, em média, 200 mil requisições de leitura por minuto.

A migração para Go permitiu que o tempo da execução dos testes passasse de ~85seg para ~3.5seg e permitiu também um melhor tempo de resposta; saímos de 9ms para ~0.5ms.

O que mais nos motivou na migração foi a economia de hardware. Segue abaixo a tabela que compara a aplicação escrita em Grails e a versão da mesma em Go.

Ao todo, tivemos uma redução de 87% nos custos de aquisição e manutenção de equipamentos, economia de 88% de memória e a diminuição de 94% dos cores necessários para a mesma execução. Números bastante inspiradores, não acha?

Nós do Mercado Livre somos grandes entusiastas de novas tecnologias, principalmente Open Source. A linguagem Golang é um dos nossos achados nesse seleto nicho. Essa é, sem dúvida, uma ótima opção para quem pretende desenvolver aplicações que busquem por performance e até mesmo para aqueles que necessitam reduzir custos com hardware.

Vale lembrar que os pontos aqui destacados se referem a nossa experiência com a aplicação de Golang no ecossistema das unidades de negócios do Mercado Livre. Mas, o céu é o limite para o que mais a linguagem Golang pode proporcionar a nós, desenvolvedores.

25 Jan 01:05

IoT – Internet das Coisas. Você está preparado para essa tendência?

by cloudcampus
IoT – Internet das Coisas.   Você está preparado para essa tendência?   Estar Up-to-date com a Tecnologia da Informação e Comunicação é uma tarefa crucial, sobretudo para nós que trabalhamos diretamente com tecnologia. O desafio se torna mais difícil, para nós profissionais de Redes e Telecom. Mal acabamos de absorver um novo conceito e logo …

Continue lendo »

17 Jan 13:49

Locais Ao Redor Do Mundo Que Poderiam Ser a Base De Um Vilão

Deu até vontade de ser vilão, muito massa!

15 Jan 13:18

Docker 1.13 – O que vem por ai

by Cristiano Diedrich

Eai gente!

Você que é leitor do blog já está acostumado a ver por aqui as principais novidades sobre o Docker e tecnologia associadas, e hoje não será diferente. Queremos trazer uma preview sobre as novas features que serão lançadas na versão 1.13 do Docker, como todos os sabem, o ciclo de desenvolvimento dentro do Docker é algo fora da curva, e a cada nova versão alguma novidade aparece, é possível acompanhar esse ritmo pelo próprio github deles.

Mas se você não quiser esperar a versão estável para brincar com as novidades, pode utilizar a versão experimental do Docker, que obviamente não é recomendado para se colocar em produção, mas que pode ser usada para lab sem problema. Para isso, basta você instalar o Docker com o seguinte comando: curl -sS https://experimental.docker.com | sh, com isso você terá acesso a engine com as modificações mais atuais mas em fase de desenvolvimento ainda.

Bom, chega de papo, vamos a uma pequenas lista das novidades do Docker 1.13:

 

Docker stack

Para quem usa docker-compose ou docker service sabe das diferenças entre essas duas “ferramentas”, e como de certa foram eles deveriam se complementar, não é mesmo? E Essa é uma situação que vinha sendo trabalhada pelos engenheiros do Docker a algum tempo, essa função intermediária vinha sendo testada através do comando docker stack que possibilita criar um serviço dentro do swarm baseado em uma estrutura do docker-compose, ou seja, você conseguirá portar para o cluster de swarm um serviço baseado no docker-compose, isso facilita em muito a administração de seu serviço e claro no deploy do mesmo, pois garante que o serviço esteja rodando independente do nó onde ele está.

Nas versões de teste você tinha que gerar um arquivo .dab (distributed application bundle ou pacote de aplicação distribuída) baseado em seu docker-compose.yml e depois sim você conseguiria fazer deploy dessa stack utilizando o docker. Agora no docker 1.13 isso não é mais necessário, basta você chamar o arquivo docker-compose.yml diretamente no deploy da stack, algo como isso:

# docker stack deploy --compose-file ./docker-compose.yml minhastack

Muito mais simples e rápido não?

 

Gerenciamento de senha

Ou gerenciamento de segredos, essa é uma função básica dentro de qualquer orquestrator, o Kubernetes já possuía esse conceito e aplicação á algum tempo já, e agora o docker também implementa essa funcionalidade.
Mas afinal, onde vou usar isso? Sua aplicação usa senha não usa? Seja para banco, API, etc, qualquer aplicação usa senha de acesso a algum serviço em algum momento, e com você faz hoje com Docker? Provavelmente via variável de ambiente ou compartilhando um arquivo com o container, existem outras formas, como ferramentas as a service de gerenciamento de identidade.

Agora no docker 1.13 você pode definir uma secret que pode ser utilizada pelo seu serviço dentro do swarm, exatamente da mesma forma que o Kubernetes usa. Para isso foram adicionados quatro comandos novos, são eles:

  • docker secret create
  • docker secret inspect
  • docker secret ls
  • docker secret rm

Veja um exemplo de como criar uma secret para ser utilizada dentro de seu serviço

# echo "123456" | docker secret create senha-banco

Agora um exemplo de como utilizar essa secret em seu serviço:

# docker service create --name app --secret senha-banco ubuntu

Dentro do container será criado um arquivo em /run/secrets/senha-banco com a informação da senha, isso é claro apenas dentro do container, sem precisar mapear nada do host para o container.

# docker exec -it app cat /run/secrets/senha-banco
123456

Um detalhe muito importante é: As secrets podem ser utilizadas apenas dentro de serviços, se você criar um container com o docker run, vão não poderá utilizar essa funcionalidade.

 

Novo parâmetro de rede no Swarm

Essa talvez seja uma das melhorias mais importante no core do docker, pois permite que você adicione uma rede do Swarm mesmo se o container for criado fora de um serviço, ou seja, criado da forma tradicional com o docker run.... Mas afinal, por que isso é importante? É importante porque agora é possível adicionar um container a mesma rede do serviço criado no Swarm, isso é muito útil para debugs ou até mesmo testes de ambiente.

E como fica agora então? Simples, veja:

# docker network create --driver overlay --attachable rede-plugavel

Com o comando acima nós criamos uma rede overlay do Swarm, e a diferença agora é o parâmetro –attachable, que permite que essa rede seja plugada em qualquer container criado, e no comando abaixo nós plugamos um container a essa rede:

# docker run --rm -it --net rede-plugavel centos ping google.com

 

Plugins

Finalmente alguns plugins que estavam sendo testados e aprimorados foram disponibilizados como estáveis dentro da engine do Docker. Dentre ele podemos destacar o Flocker e o Weave, que agora tem integração total com docker.

 

Docker Daemon –experimental

Até então para você poder utilizar comandos e opções em desenvolvimento/teste do docker, você teria que instalar a versão experimental ou test da engine, mas agora basta você iniciar o daemon do docker com a opção –experimental, com isso será habilitado em momento de execução as opções da versão experimental, veja:

 

Melhorias no docker service

Essas, na verdade, são algumas das melhorias que a comunidade pediu ao longo do meses, uma delas tem relação com o update da imagem no update do serviço, para quem não notou, quando um serviço é atualizado (até então) você precisava executar um update com alguns parâmetros a mais para poder atualizar o serviço com uma nova imagem, na nova versão esse processo pode ser feito passando o parâmetro –force junto, o docker service update já verificará se há uma versão mais recente da imagem e atualizará o serviço baseado nisso.

 

Novo parâmetro no docker service

Além das melhorias no docker service, foi acrescentado também um novo parâmetro. Hoje nós acessamos um serviço através da porta exposta do mesmo, que você pode definir com o parâmetro –publish, no docker 1.13 será possível você definir de forma mais detalhada essa regra, isso deve-se ao novo parâmetro –port, que, da mesma forma que o –mout, tem sintaxe parecida com csv, onde você define item=valor,item=valor… Veja um exemplo:

# docker service create --name servico_web --port mode=ingress,target=80,published=8080,protocol=tcp

Dessa forma você tem, de forma mais clara, as definições de porta do serviço.

 

Outras novidades

Dentre outras novidades do docker 1.13 podemos destacar ainda algumas que tem bastante relevância para quem o utiliza, como por exemplo:

  • Cache de Layer para o Build: Para que gera muitas imagens, sabe que esse era um problema a ser resolvido, exemplo: geramos um imagem agora com o docker build, caso tenha que modificar essa imagem todas as layers anteriores a alteração não eram buildadas novamente, o docker build usava o cache para elas. Agora digamos que mandamos essa imagem para outro host e queremos fazer outra modificação nela, o que ocorre? Exatamente, todas as layers são buildadas novamente, isso pelo fato do docker não ter naquele host o cache de build dessa imagem. Parece ser trivial, mas quando se quer ganhar tempo, não é. No docker 1.13 você pode especificar na hora do build de onde o docker poderá buscar o cache de build, como por exemplo:
    docker pull imagem:v1.0
    docker build --cache-from imagem:v1.0 -t imagem2:v1.1 .
    

    Dessa forma o build da nova imagem utilizará o cache da imagem original, compilando assim apenas as layers diferentes.

  • A instrução MAINTAINER  foi removida do Dockerfile, agora essa informação deve ser utilizada através de label;
  • Foi adicionado um novo comando, ainda experimental, que é o docker service logs para visualizar os logs do serviço e não do container em si.
  • Outra adição do docker service foi o parâmetro –rollback que tem por objetivo realizar o update do serviço através de uma versão anterior a atual;
  • Remoção de container velhos através do docker system (ainda não há mais informações sobre como esse comando funcionará para remoção de containers antigos, então ficamos ligados no lançamento)

 

Ok Cristiano, e quando será lançada? Não há uma data 100% definida, o que se sabe é que será lançada até inicio de Janeiro de 2017, então pode ser que seja lançada hoje mesmo 😉 . Pode haver mais modificações? Claro, sempre há e com certeza as novidades que trouxemos hoje serão melhor explicadas após o lançamento oficial, então o jeito é ficar ligado aqui no blog e claro no site do ofiical do docker.

 

Grande abraço!

 

 

15 Jan 13:17

Amazon promete contratar 100 mil novos funcionários nos próximos 18 meses.

by noreply@blogger.com (Cláudio Florenzano)
Amazon promete contratar 100 mil novos funcionários nos próximos 18 meses.
Amazon promete contratar 100 mil novos funcionários nos próximos 18 meses.
Nos próximos 18 meses, a Amazon espera acrescentar 100 mil empregos em período integral nos Estados Unidos.

Enquanto a maioria das vagas diz respeito aos depósitos da gigante do varejo online, a Amazon diz que também buscará por engenheiros e desenvolvedores de software em áreas como computação na nuvem e aprendizado de máquina.

“Inovação é um dos princípios que nos guia na Amazon e e tem criado centenas de milhares de empregos americanos”, disse Jeff Bezos, fundador da Amazon e CEO em um comunicado. "Esses empregos não ficarão somente na sede em Seattle ou no Vale do Silício. Eles estarão em nossa rede de serviço ao consumidor, centros de atendimento e outras instalações em comunidades locais através do país”

Bezos estava entre um grupo de executivos de tecnologia que se encontraram com o novo presidente eleito Donald Trump em dezembro. Trump disse que a criação de empregos seria um ponto chave em sua campanha presidencial e criticou companhias americanas que terceirizam a mão de obra em outros países.
11 Jan 01:24

Mãe usa máscara de Chewbacca em parto e vídeo viraliza nas redes

by Redação

Parece que mães Chewbacca são mesmo a grande tendência da contemporaneidade. Após o vídeo de uma mãe ter um ataque de riso com a máscara do personagem de "Star Wars" ter se tornado o vídeo mais assistido da história do Facebook, com mais de 165 milhões de visualizações, agora uma mulher resolveu colocar a máscara durante o trabalho de parto. E o vídeo bombou.

Katie Stricker Curtis colocou a máscara quando as contrações estavam ficando fortes e, já que a máscara solta o som do alienígena cada vez que abre a boca, as expressões de dor de Katie são transformadas no popular "UUUUUAAAAAA" do Chewbacca. O vídeo já passou das 340 mil visualizações até a publicação desta nota.

"Só porque estar para ser mãe não significa que eu tenha que crescer!", disse Katie ao postar o vídeo no Facebook. Ela depois deu à luz uma menina chamada Jayden.

Nova Mãe Chewbacca usou a máscara do personagem durante o trabalho de parto.

Créditos: Reprodução

Nova Mãe Chewbacca usou a máscara do personagem durante o trabalho de parto.

O post Mãe usa máscara de Chewbacca em parto e vídeo viraliza nas redes apareceu primeiro em Catraca Livre.

09 Jan 19:05

Precisamos falar sobre teste automatizado de infraestrutura

by Gomex

Acredito que seja notável para maioria dos profissionais de TI que estamos passando por uma grande revolução em nossa área. A automação de infraestrutura é uma realidade e não gerenciamos mais serviços e servidores da mesma forma que fazíamos há 10 anos atrás.

Não é mais tolerável ter o prazo de uma semana para entregar um novo servidor para equipe de desenvolvimento, as solicitações normalmente são para o mesmo dia, isso quando os clientes já não conseguem criar seus próprios hosts sem necessidade de abertura de ticket para os sysadmins.

Infraestrutura virou código

A automação é possível através da parametrização das definições de infraestrutura, ou seja, transformamos a criação de serviços e servidores em código. Que são especificações descritivas de como desejamos que aquele serviço/servidor seja instalado e configurado.

Ao transformar a infraestrutura em código podemos nos aproveitar de todo conhecimento adquirido e já validado pela engenharia de software por anos de experimentação no assunto. E seguindo essa linha, um assunto muito importante é que todo código precisa ser testado de forma automatizada, ou seja, se infra virou software, precisamos testá-la também.

Como testávamos infra no passado?

Após instalar, configurar e parametrizar um ambiente recém criado, a equipe de sysadmin normalmente executava uma bateria de testes no serviço/servidor disponibilizado. Essa analise era normalmente manual, o que demandava muito tempo do sysadmin, ou seja, tínhamos uma pessoa altamente capacitada, executando uma tarefa repetitiva, que normalmente agregava pouco para o seu nível intelectual e era bem tedioso, para dizer a verdade.

Pelo fato do teste ser manual, era quase impossível garantir que os mesmo testes seriam repetidos após uma modificação no ambiente, ou seja, caso os testes manuais não falhassem, a garantia que aquele ambiente estava pronto para uso era bem baixa.

Um outro problema com relação a modificações e testes manuais era a tendência que os ambiente de desenvolvimentotesteprodução não fossem idênticos, dessa forma havia pouca confiança entre esses estágios e assim todos os testes manuais eram executados em cada etapa desse processo.

Se você levar em consideração que o serviço/servidor foi testado na fase de teste ele poderia ser colocado em produção sem qualquer dúvida, certo? Errado! A maioria dos sysadmins não tinha confiança o suficiente para tal e o motivo era bem nobre, já que várias pessoas fazendo intervenções manuais nos ambientes em momentos distintos impactavam negativamente na padronização dos ambientes.

Todos esses problemas resultavam numa alta resistência à modificação de um ambiente em produção, pois além de demandar um alto esforço pra sua modificação, a garantia de sucesso normalmente era bem baixa, com alto impacto na disponibilidade, já que o plano de retorno normalmente era restaurar backup ou snapshot de toda instância e normalmente esses serviços não tinha contingência.

Era bem comum se deparar com servidores que não recebiam atualização nem mesmo de patch de segurança e além de estarem defasados no que tange a funcionalidade, normalmente estavam também vulneráveis a acessos indesejados e manipulação dos seus dados.

Testando código de infra

Sempre que falamos de engenharia de software aplicada à automação de infraestrutura gera um certo “frio na barriga” em alguns sysadmin, e então brota uma certa “resistência” com relação a usar as melhores práticas oriundas dessa disciplina. E não é por mal, pois para muitos sysadmin iniciar nesse caminho é partir do zero em um mundo inteiro a ser explorado e nem todos tem tempo e disposição pra isso. Por conta disso, vamos com calma.

A notícia boa no que tange a testes de infraestrutura é que as ferramentas geralmente tem um bom nível de abstração, ou seja, abstração do uso de teste para infraestrutra, as ferramentas disponível são de fácil uso, mesmo para quem não tem um grande histórico de desenvolvimento de software.

Vejam um exemplo de como testar se você tem o pacote nginx instalado e se ele está na versão 1.2.x:

def test_nginx_is_installed(Package):
 nginx = Package("nginx")
 assert nginx.is_installed
 assert nginx.version.startswith("1.2")

O assert é o parâmetro onde é informado o que se deseja testar. De “nginx está instalado?”, é traduzido para o inglês que basicamente é assert nginx.is_installed. O segundo é “A versão do nginx começa com 1.2?” Caso as respostas para esses perguntas sejam negativas, a ferramenta de teste emitirá uma falha e assim você pode saber que tem um problema.

E pra usar esse exemplo basta executar os comandos abaixo:

pip install testinfra
testinfra --sudo --connection=ssh --hosts=servidor_a_ser_testado test_mytest.py

O arquivo de exemplo tem o nome de test_mytest.py. Com os comandos informados acima será instalado o testinfra (um exemplo de ferramenta de teste) e o aplicativo recém instalado conectará via ssh e realizará os testes que estão definidos dentro do arquivo test_mytest.py.

Soluções para teste

Não pretendo me aprofundar nas ferramentas para teste agora, vou apenas indicar as suas respectivas documentações e talvez eu me aprofunde em uma ou outra nos próximos artigos:

  • Serverspec (Mais usada e escrita em ruby, usa rspec como base)
  • Testinfra (Escrita em python, usa Pytest como base e parece muito com serverspec)
  • Inspec (Escrita em ruby, mantida pela mesma empresa do Chef. Usa rspec como base)
  • Beaker (Escrita em ruby, mantida pela mesma empresa do Puppet. Usa rspec como base)

Meu time preferiu usar testinfra, mas explico isso em outro artigo.

Como construir os testes de infraestrutura

Para testes automatizados de software, de acordo com a engenharia de software, existe o conceito de pirâmide de teste, onde os testes são categorizados por velocidade na execução e o seu feedback de sucesso ou falha. Resumindo, quanto mais rápidos os testes, em maior quantidade eles devem existir em sua estrutura, pois eles custam pouco poder computacional. Esse conceito para software já foi exaustivamente explicado nesse link, por uma pessoa bem mais relevante do que eu.

Seguindo a ideia da pirâmide usada para software, segue abaixo uma proposta para pirâmide de testes no contexto de infraestrutura como código:

Vou detalhar cada camada, começando de baixo pra cima:

Rápido

São aqueles que seriam equivalentes aos testes unitários de software, mas no nosso caso normalmente são realizadas checagem no código com relação a estilo e erro de sintaxe. Caso você use chef, é possível utilizar o chefspec e construir testes unitários para suas receitas. Esses testes não necessitam de uma instancia funcionando, ele de fato testa uma simulação do código. Os outros produtos (ansible, puppet e afins) não tem solução parecida com essa.

No ansible você pode usar o parâmetro –check para checar suas definições:

ansible-playbook site.yml --check

Obs: Esse comando não é muito útil pra nosso time, pois temos muitas condicionais e registro de variáveis no código e o –check do ansible não funciona muito bem nessas situações. No seu caso isso pode ser útil.

Nesse nível, nos testamos as definições do cloudformation da amazon com os seguintes comandos:

npm install cfn-check
cfn-check <arquivo de definição do cloudformation>

O comando acima retornará falha caso encontre algum problema de sintaxe e argumentos necessários em determinados recursos, tudo isso antes que você envie esse arquivo para AWS tentar criar os recursos e falhar no processo.

Normal

São responsáveis por testarem o estado esperado de uma instancia provisionada de forma automatizada, ou seja, você tem uma definição para instalar, configurar e iniciar um servidor web, o teste nesse caso seria acessar o servidor e verificar se o que foi solicitado está de fato refletido no servidor. Nesse momento seria basicamente testar o conjunto de definição enviada (role pra ansible, cookbook pra chef e módulo para puppet).

No exemplo do servidor web, o teste seria verificar se a porta 80 está escutando requisição e se o processo do serviço web está em execução. No testinfra seria:

def test_nginx_is_listening(Socket):
 nginx = Socket("tcp://0.0.0.0:80")
 assert nginx.is_listening

def test_nginx_running_and_enabled(Service):
 nginx = Service("nginx")
 assert nginx.is_running
 assert nginx.is_enabled

Cuidado com o anti-padrão do teste reflexivo, que é quando você acaba escrevendo um teste da mesma maneira que você escreve a definição da tarefa, um bom exemplo seria você ter uma definição para criar um usuário e ter um teste da mesma maneira que solicita sua criação, ou seja, não faz muito sentido esse tipo de teste em seu ambiente.

Moderado

São responsáveis por testar a integração entre múltiplos serviços/servidores, ou seja, a ideia aqui é testar a relação entre os conjuntos de definições (role pra ansible, cookbook pra chef e módulo para puppet) no mesmo ativo ou entre hosts distintos.

Se você tem um servidor web e um proxy reverso, é nesse momento que você testará a comunicação esperada entre eles.

Pesado

São responsáveis por simular o uso do serviço, se portando o máximo possível com o consumidor do serviço/servidor em questão.

Se você tem um servidor web, hospedando uma determinada aplicação que tem formulário de usuário e senha, um teste esperado para esse nível é efetuar login com um usuário e senha de teste.

Próximos passos

Nos próximos artigos trataremos como podemos colocar os testes automatizados em nosso pipeline e como utilizar o docker pra facilitar o processo de testes automatizados e assim abstrair o host que fará o teste.

09 Jan 15:38

Coletânea de imagens aleatórias da semana

by Joe

 

Se você estiver indo pra praia hoje, lembre-se: não vai ser tão legal assim. Abraços.

09 Jan 15:26

Conheça a versão peruana de um sucesso do System of a Down

by Joe

TONGO. O nome dessa joinha humana capaz de transformar músicas de qualquer tipo em legítimos sucessos peruanos.

Inclusive queria mandar um recado pra ele: HOLA TONGO, MI ESPAÑOL NO ES MUY BUENO PERO YO GOSTARIA DE CUNVIDAR USTED PARA UNO TCHURRASCO EN MI CASITA. ABRAJOS.

Dica do leitor Gabriel Fontana.

27 Dec 14:33

Contornando o velho problema de mandar coisa pro grupo errado

by UILDERSON

print

Temos mais um indicado ao TROFÉU RONALDINHO 2016 na categoria DIBRE DO ANO. O fato de o texto nem mencionar o que a menina fez pelo mp4 deixa tudo ainda mais fascinante.

Dica do leitor Rodrigo Tavares.0

23 Dec 13:33

Desempenho de rede: comparando distribuições Linux x BSDs

by Augusto Campos

Os BSDs testados, e a distribuição Clear Linux, deram um banho no Debian, Ubuntu, CentOS e Fedora, nos testes de resposta a requisições TCP e UDP.

O gráfico acima mostra um dos 4 testes (variaram o protocolo e a duração), mas a ordem e a proporção foram sempre as mesmas, ou similares.

Fora isso, houve um teste (o de UDP do iPerf a 1000Mbit/s) em que todas as distribuições Linux se saíram igualmente bem, o FreeBSD ficou bem para trás, e o DragonFlyBSD nem conseguiu se classificar.

Nos demais testes, o desempenho entre todos os sistemas testados empatou.

(via www.phoronix.com - “Linux Distributions vs. BSDs With netperf & iperf3 Network Performance - Phoronix”)

O artigo "Desempenho de rede: comparando distribuições Linux x BSDs" foi originalmente publicado no site BR-Linux.org, de Augusto Campos.

22 Dec 19:29

Ferramenta gratuita resgata arquivos criptografados por crackers.

by noreply@blogger.com (Cláudio Florenzano)
Ferramenta gratuita resgata arquivos criptografados por crackers.
Ferramenta gratuita resgata arquivos criptografados por crackers.
Um dos golpes mais realizados no mundo por cibercriminosos é o do ramsomware. Trata-se de um programa malicioso que bloqueia o acesso da vítima aos arquivos no seu computador, liberando-os apenas mediante o pagamento de um resgate.

A empresa de segurança Kaspersky lançou recentemente uma ferramenta gratuita que promete recuperar os arquivos criptografados por um ransomware. O aplicativo, chamado RannohDecryptor, consegue descriptografar a maioria dos arquivos convertidos nas extensões .crypt, .cryp1 e .crypz.

Segundo a Kaspersky, o principal alvo do RannohDecryptor é um ransomware conhecido como CryptXXX, um dos mais usados por cibercriminosos no mundo. Desde abril deste ano, o programa infectou mais de 80 mil usuários.

O RannohDecryptor pode ser baixado gratuitamente no site da No More Ransom!, organização sem fins lucrativos criada para combater ransomware.
21 Dec 13:54

Ultra Minimal – Versão do Ubuntu Budgie promete consumir 220MB ou menos de RAM

by Ricardo Ferreira

Ultra Minimal, versão do Ubuntu Budgie, promete consumir 220MB ou menos de RAM; pelo menos é o que dizem os desenvolvedores oficiais dessa mais nova versão do Ubuntu! Confere aí…

Ubuntu Budgie

Primeiramente, Budgie Desktop é um ambiente de trabalho projetado para ser moderno, simples e elegante. Uma das vantagens do Budgie é que ele não é um fork de outro projeto, mas sim uma criação do zero (“from scratch”); proporcionando novas possibilidades para o usuário. Alguns chegam a dizer que é um concorrente direto para o Cinnamon, do Linux Mint.

Pois é… para os que não sabiam, o Ubuntu possui esse ambiente de trabalho disponível, como “sabor” oficial. Tudo surgiu da distribuição Budgie-Remix (baseada no Ubuntu 16.04 LTS). Logo no começo desse ano (2016), um futuro promissor para esse projeto começou a surgir; simplesmente o interesse da Canonical em dá todo suporte para que esse ambiente pudesse se tornar versão oficial do Ubuntu.

Dito e feito, no começo de novembro (2016) o Ubuntu Budgie foi divulgado oficialmente como versão do Ubuntu 😉

A primeira versão, sob o nome oficial Ubuntu Budgie, será lançada em Abril do ano que vem (2017); juntamente com o Ubuntu 17.04.

Ultra Minimal

Os desenvolvedores Ubuntu Budgie estão trabalhando em uma versão, chamada Ultra Minimal, que promete consumir menos de 220MB de RAM:

 

Um tweet recente, visto acima, mostra uma versão enxuta do Ubuntu Budgie; que utiliza menos de 220MB de RAM. Entretanto, o uso de RAM será diferenciado para versões 64 bits e 32 bits; enquanto uma consumirá 220MB, a outra, um pouco menos disso, respectivamente.

Basicamente, conforme notícia, a versão Ultra Minimal Ubuntu Budgie virá praticamente sem nada instalado – versão muito similar ao Debian Netinstall, por exemplo. Ideal para aqueles que preferem personalizar sua distro conforme suas necessidades.

Por fim, para os mais ansiosos, ainda não existem muitos detalhes sobre esta versão. Conforme notícia, tudo que se tem é uma captura de tela, publicada no Twitter Oficial do Ubuntu Budgie, que mostra alguns exemplos e “provas” desse baixo consumo de RAM.

Aguarde os próximos capítulos…

MAIS INFORMAÇÕES
Site Oficial
Twitter Oficial

Via | FossBytes

O post Ultra Minimal – Versão do Ubuntu Budgie promete consumir 220MB ou menos de RAM apareceu primeiro em Linux Descomplicado.

18 Dec 13:27

Palestra: Gestão sem Gerentes

by Matheus Haddad

É possível fazer a gestão de uma empresa sem diretores e nem gerentes? Como tomar decisões em uma empresa sem hierarquia? Como ficariam as definições sobre salários e planos de carreira? Encontre as respostas para essas e outras perguntas nesta palestra. Descubra conceitos e técnicas que estão ajudando empresas a adotarem uma gestão moderna.

By Matheus Haddad
10 Dec 14:23

Termbox – Serviço permite executar um terminal Linux diretamente no navegador web

by Ricardo Ferreira

Termbox é um serviço web que permite executar um sistema Linux diretamente no navegador web. Inclusive, de uma maneira simples; em, apenas, 2 passos um terminal Linux (Ubuntu, Fedora, CentOS, Debian e Arch Linux) estará disponível.

Termbox

Tecnicamente, esse serviço oferece um ambiente virtualizado (“box”), construído sobre o Hypercontainer (um hypervisor que executa uma máquina virtual como se fosse um container) – ferramenta muito similar ao Docker (tecnologia que permite isolar diversos serviços em estruturas de containers).

hypercontainer-arquitetura

Arquitetura Hypercontainer

Além disso, no frontend o desenvolvimento se dá com uso do Bulma – moderno framework CSS – hterm e websocket.

Cada “box” oferece a execução de terminal Linux Ubuntu, Fedora, CentOS, Debian ou Arch Linux; e recurso de 512 MB de RAM, 1 CPU e 10 GB de espaço em disco para cada. Como o serviço ainda está desenvolvimento, será normal encontrar falhas ou inconsistências.

Por fim, diversas novidades estão previstas, bem como acesso SSH, permitir usar um “box” como servidor e imagens Docker. Também, além de Ubuntu/Fedora/CentOS/Debian/Arch Linux, Alpine e openSUSE também estarão disponíveis em breve.

Como usar?!

AVISO
Cada “box” mantém os dados preservados por 6 horas. Terminado esse período todos os dados salvos e criados serão apagados!

Simples… acesse o site oficial do Termbox, escolha sua distribuição Linux e pronto!!

termbox-exemplo


Via | LamiradaReplicante | Reddit

O post Termbox – Serviço permite executar um terminal Linux diretamente no navegador web apareceu primeiro em Linux Descomplicado.

09 Dec 20:14

Mundo Docker: Docker 1.13 – O que vem por ai

Eai gente!

Você que é leitor do blog já está acostumado a ver por aqui as principais novidades sobre o Docker e tecnologia associadas, e hoje não será diferente. Queremos trazer uma preview sobre as novas features que serão lançadas na versão 1.13 do Docker, como todos os sabem, o ciclo de desenvolvimento dentro do Docker é algo fora da curva, e a cada nova versão alguma novidade aparece, é possível acompanhar esse ritmo pelo próprio github deles.

Mas se você não quiser esperar a versão estável para brincar com as novidades, pode utilizar a versão experimental do Docker, que obviamente não é recomendado para se colocar em produção, mas que pode ser usada para lab sem problema. Para isso, basta você instalar o Docker com o seguinte comando: curl -sS https://experimental.docker.com | sh, com isso você terá acesso a engine com as modificações mais atuais mas em fase de desenvolvimento ainda.

Bom, chega de papo, vamos a uma pequenas lista das novidades do Docker 1.13:

 

Docker stack

Para quem usa docker-compose ou docker service sabe das diferenças entre essas duas “ferramentas”, e como de certa foram eles deveriam se complementar, não é mesmo? E Essa é uma situação que vinha sendo trabalhada pelos engenheiros do Docker a algum tempo, essa função intermediária vinha sendo testada através do comando docker stack que possibilita criar um serviço dentro do swarm baseado em uma estrutura do docker-compose, ou seja, você conseguirá portar para o cluster de swarm um serviço baseado no docker-compose, isso facilita em muito a administração de seu serviço e claro no deploy do mesmo, pois garante que o serviço esteja rodando independente do nó onde ele está.

Nas versões de teste você tinha que gerar um arquivo .dab (distributed application bundle ou pacote de aplicação distribuída) baseado em seu docker-compose.yml e depois sim você conseguiria fazer deploy dessa stack utilizando o docker. Agora no docker 1.13 isso não é mais necessário, basta você chamar o arquivo docker-compose.yml diretamente no deploy da stack, algo como isso:

# docker stack deploy --compose-file ./docker-compose.yml minhastack

Muito mais simples e rápido não?

 

Gerenciamento de senha

Ou gerenciamento de segredos, essa é uma função básica dentro de qualquer orquestrator, o Kubernetes já possuía esse conceito e aplicação á algum tempo já, e agora o docker também implementa essa funcionalidade.
Mas afinal, onde vou usar isso? Sua aplicação usa senha não usa? Seja para banco, API, etc, qualquer aplicação usa senha de acesso a algum serviço em algum momento, e com você faz hoje com Docker? Provavelmente via variável de ambiente ou compartilhando um arquivo com o container, existem outras formas, como ferramentas as a service de gerenciamento de identidade.

Agora no docker 1.13 você pode definir uma secret que pode ser utilizada pelo seu serviço dentro do swarm, exatamente da mesma forma que o Kubernetes usa. Para isso foram adicionados quatro comandos novos, são eles:

  • docker secret create
  • docker secret inspect
  • docker secret ls
  • docker secret rm

Veja um exemplo de como criar uma secret para ser utilizada dentro de seu serviço

# echo "123456" | docker secret create senha-banco

Agora um exemplo de como utilizar essa secret em seu serviço:

# docker service create --name app --secret senha-banco ubuntu

Dentro do container será criado um arquivo em /run/secrets/senha-banco com a informação da senha, isso é claro apenas dentro do container, sem precisar mapear nada do host para o container.

# docker exec -it app cat /run/secrets/senha-banco
123456

Um detalhe muito importante é: As secrets podem ser utilizadas apenas dentro de serviços, se você criar um container com o docker run, vão não poderá utilizar essa funcionalidade.

 

Novo parâmetro de rede no Swarm

Essa talvez seja uma das melhorias mais importante no core do docker, pois permite que você adicione uma rede do Swarm mesmo se o container for criado fora de um serviço, ou seja, criado da forma tradicional com o docker run.... Mas afinal, por que isso é importante? É importante porque agora é possível adicionar um container a mesma rede do serviço criado no Swarm, isso é muito útil para debugs ou até mesmo testes de ambiente.

E como fica agora então? Simples, veja:

# docker network create --driver overlay --attachable rede-plugavel

Com o comando acima nós criamos uma rede overlay do Swarm, e a diferença agora é o parâmetro –attachable, que permite que essa rede seja plugada em qualquer container criado, e no comando abaixo nós plugamos um container a essa rede:

# docker run --rm -it --net rede-plugavel centos ping google.com

 

Plugins

Finalmente alguns plugins que estavam sendo testados e aprimorados foram disponibilizados como estáveis dentro da engine do Docker. Dentre ele podemos destacar o Flocker e o Weave, que agora tem integração total com docker.

 

Docker Daemon –experimental

Até então para você poder utilizar comandos e opções em desenvolvimento/teste do docker, você teria que instalar a versão experimental ou test da engine, mas agora basta você iniciar o daemon do docker com a opção –experimental, com isso será habilitado em momento de execução as opções da versão experimental, veja:

 

Melhorias no docker service

Essas, na verdade, são algumas das melhorias que a comunidade pediu ao longo do meses, uma delas tem relação com o update da imagem no update do serviço, para quem não notou, quando um serviço é atualizado (até então) você precisava executar um update com alguns parâmetros a mais para poder atualizar o serviço com uma nova imagem, na nova versão esse processo pode ser feito passando o parâmetro –force junto, o docker service update já verificará se há uma versão mais recente da imagem e atualizará o serviço baseado nisso.

 

Novo parâmetro no docker service

Além das melhorias no docker service, foi acrescentado também um novo parâmetro. Hoje nós acessamos um serviço através da porta exposta do mesmo, que você pode definir com o parâmetro –publish, no docker 1.13 será possível você definir de forma mais detalhada essa regra, isso deve-se ao novo parâmetro –port, que, da mesma forma que o –mout, tem sintaxe parecida com csv, onde você define item=valor,item=valor… Veja um exemplo:

# docker service create --name servico_web --port mode=ingress,target=80,published=8080,protocol=tcp

Dessa forma você tem, de forma mais clara, as definições de porta do serviço.

 

Outras novidades

Dentre outras novidades do docker 1.13 podemos destacar ainda algumas que tem bastante relevância para quem o utiliza, como por exemplo:

  • Cache de Layer para o Build: Para que gera muitas imagens, sabe que esse era um problema a ser resolvido, exemplo: geramos um imagem agora com o docker build, caso tenha que modificar essa imagem todas as layers anteriores a alteração não eram buildadas novamente, o docker build usava o cache para elas. Agora digamos que mandamos essa imagem para outro host e queremos fazer outra modificação nela, o que ocorre? Exatamente, todas as layers são buildadas novamente, isso pelo fato do docker não ter naquele host o cache de build dessa imagem. Parece ser trivial, mas quando se quer ganhar tempo, não é. No docker 1.13 você pode especificar na hora do build de onde o docker poderá buscar o cache de build, como por exemplo:
    docker pull imagem:v1.0
    docker build --cache-from imagem:v1.0 -t imagem2:v1.1 .
    

    Dessa forma o build da nova imagem utilizará o cache da imagem original, compilando assim apenas as layers diferentes.

  • A instrução MAINTAINER  foi removida do Dockerfile, agora essa informação deve ser utilizada através de label;
  • Foi adicionado um novo comando, ainda experimental, que é o docker service logs para visualizar os logs do serviço e não do container em si.
  • Outra adição do docker service foi o parâmetro –rollback que tem por objetivo realizar o update do serviço através de uma versão anterior a atual;
  • Remoção de container velhos através do docker system (ainda não há mais informações sobre como esse comando funcionará para remoção de containers antigos, então ficamos ligados no lançamento)

 

Ok Cristiano, e quando será lançada? Não há uma data 100% definida, o que se sabe é que será lançada até inicio de Janeiro de 2017, então pode ser que seja lançada hoje mesmo 😉 . Pode haver mais modificações? Claro, sempre há e com certeza as novidades que trouxemos hoje serão melhor explicadas após o lançamento oficial, então o jeito é ficar ligado aqui no blog e claro no site do ofiical do docker.

 

Grande abraço!

 

 

08 Dec 15:36

Ousadia e alegria

by ninja vermelho

1-aehoooo

Tomô?

The post Ousadia e alegria appeared first on Le Ninja.