<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Anderson de Alencar</title>
    <description>The latest articles on Forem by Anderson de Alencar (@alencarbarros).</description>
    <link>https://forem.com/alencarbarros</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F267109%2F047be545-01e7-4dd8-8901-225b3ecf4a9f.jpeg</url>
      <title>Forem: Anderson de Alencar</title>
      <link>https://forem.com/alencarbarros</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/alencarbarros"/>
    <language>en</language>
    <item>
      <title>Introdução ao Docker</title>
      <dc:creator>Anderson de Alencar</dc:creator>
      <pubDate>Wed, 21 Dec 2022 11:17:08 +0000</pubDate>
      <link>https://forem.com/alencarbarros/introducao-ao-docker-3g6d</link>
      <guid>https://forem.com/alencarbarros/introducao-ao-docker-3g6d</guid>
      <description>&lt;p&gt;Resumo dos conceitos do livro &lt;em&gt;Learn Docker in a&lt;br&gt;
Month of Lunches&lt;/em&gt; do autor Elton Stoneman.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzac5mnb30498j08e6jz7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzac5mnb30498j08e6jz7.png" alt="visão geral do docker" width="608" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docker&lt;/strong&gt; começa em um simples conceito: empacotar um aplicativo com todas as suas dependências, para que você possa executar esse aplicativo da mesma maneira em qualquer lugar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docker&lt;/strong&gt; facilita a transição entre serviços de nuvem e faz com que o projeto não fique preso a nenhum serviço de PaaS ou IaaS.&lt;/p&gt;

&lt;p&gt;Monólitos não são tão úteis quando se usam Docker. Mover uma aplicação para contêineres pode ser o primeiro passo para a modernização da arquitetura do sistema. Dessa forma, usando Docker, pode-se usar a arquitetura de microsserviços e cada função em seu próprio contêiner, possibilitando pequenas funções, que podem ser facilmente testadas e isoladas uma das outras.&lt;/p&gt;
&lt;h2&gt;
  
  
  O que é um Contêiner?
&lt;/h2&gt;

&lt;p&gt;Similar a ideia de um contêiner físico, uma caixa, onde dentro dessa caixa contém a aplicação e um computador com próprio endereço IP, disco rígido e nome. Tudo isso criado e gerenciado pelo Docker para executar a aplicação. A aplicação não pode ver nada fora do contêiner, além disso, esse contêiner está sendo executado em um computador, que pode conter outros contêineres, porém todos compartilham a mesma CPU, memória RAM e OS.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frexth30f1lvb2kt7ao7o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frexth30f1lvb2kt7ao7o.png" alt="visão geral do docker, exibindo a relação do docker com o sistema operacional" width="447" height="168"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Contêineres são executados apenas quando a aplicação está sendo executada. Assim que o processo encerra, o contêiner vai para o estado &lt;em&gt;Exited&lt;/em&gt;, logo não consomem CPU e memória.&lt;/p&gt;

&lt;p&gt;Para se conectar a um terminal dentro de um container de uma imagem chamada &lt;code&gt;diamol/base&lt;/code&gt;,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker container run &lt;span class="nt"&gt;--interactive&lt;/span&gt; &lt;span class="nt"&gt;--tty&lt;/span&gt; diamol/base
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A flag &lt;code&gt;--interactive&lt;/code&gt; diz ao Docker que deseja estabelecer uma conexão e a flag &lt;code&gt;--tty&lt;/code&gt; significa que deseja se conectar ao terminal.&lt;/p&gt;

&lt;p&gt;Lista todos os contêineres.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker container &lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lista contêineres em execução.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker container &lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mostra informações de um contêiner em execução, como CPU, memória, rede, e disco.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker container stats
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Remover todos os contêineres&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker container &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;--force&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;docker container &lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;--all&lt;/span&gt; &lt;span class="nt"&gt;--quiet&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Hospedando um Website usando Docker
&lt;/h2&gt;

&lt;p&gt;Um simples exemplo de como executar um website em um contêiner a partir da imagem &lt;code&gt;diamol/ch02-hello-diamol-web&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker container run &lt;span class="nt"&gt;--detach&lt;/span&gt; &lt;span class="nt"&gt;--publish&lt;/span&gt; 8088:80 diamol/ch02-hello-diamol-web
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Onde &lt;code&gt;--detach&lt;/code&gt; (&lt;code&gt;-d&lt;/code&gt;) executa o contêiner em background e &lt;code&gt;--publish&lt;/code&gt; (&lt;code&gt;-p&lt;/code&gt;) expõe uma porta do contêiner ao computador.&lt;/p&gt;

&lt;p&gt;Assim, o tráfego pode ser interceptado pelo Docker e enviado ao contêiner. Neste exemplo, a rede enviada a porta do computador pela porta 8088 será enviada pelo Docker a um contêiner para a porta 80.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1poqxaltcz5btb6meoul.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1poqxaltcz5btb6meoul.png" alt="executando um website em um container, a imagem mostra o redirecionamento da porta do computador para o contêiner" width="478" height="282"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Entendendo como Docker funciona
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9l5xbx99ffo3bh2ojxbf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9l5xbx99ffo3bh2ojxbf.png" alt="visão geral dos componentes do docker, docker api, docker engine e docker cache" width="424" height="358"&gt;&lt;/a&gt;&lt;br&gt;
Docker possui alguns componentes internos&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Docker Engine&lt;/strong&gt; é o componente de gerenciamento do Docker. É o responsável por buscar imagens locais ou baixar imagens quando necessário e reutilizá-las se já baixadas. Trabalha com o sistema operacional para criar contêineres, redes virtuais e outros recursos do Docker.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Docker API&lt;/strong&gt; é o modo que todas as funcionalidades do Docker Engine estão disponíveis, uma REST API padrão. É acessado do computador local por padrão, mas também pode ser configurada para acessada por outros computadores da rede.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Docker CLI&lt;/strong&gt; é o cliente do Docker API. Quando comandos são executados, na verdade, são enviados ao Docker API e o Docker Engine realizada a tarefa.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Construindo Docker Images
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Dockerfile&lt;/strong&gt; é um simples script usado para empacotar uma aplicação e na sua saída gera um arquivo de imagem Docker.&lt;/p&gt;

&lt;p&gt;As instruções mais usadas são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FROM:&lt;/strong&gt; toda imagem é gerada a partir de outra, em geral, uma depedência;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ENV:&lt;/strong&gt; configura as variáveis de ambiente. A sintaxe é &lt;code&gt;[key]="[value]"&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WORKDIR:&lt;/strong&gt; cria um diretório na imagem do sistema que será o diretório de trabalho;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;COPY:&lt;/strong&gt; copia arquivos ou diretórios para o diretório local da imagem/container;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CMD:&lt;/strong&gt; especifica os comandos para executar a aplicação quando o Docker inicia o container a partir da imagem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RUN:&lt;/strong&gt; executar comandos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Um exemplo de Dockerfile é mostrado abaixo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; diamol/node&lt;/span&gt;

&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; TARGET="blog.sixeyed.com"&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; METHOD="HEAD"&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; INTERVAL="3000"&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /web-ping&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; app.js .&lt;/span&gt;

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "/web-ping/app.js"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para transformar um Dockerfile em uma Docker image execute o comando no diretório onde se encontra o Dockerfile&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker image build &lt;span class="nt"&gt;--tag&lt;/span&gt; web-ping &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Onde &lt;code&gt;--tag&lt;/code&gt; é o argumento para o nome da imagem e o argumento final é o diretório onde o Dockerfile e os arquivos relacionados se encontram.&lt;/p&gt;

&lt;p&gt;Para executar o contêiner a partir da imagem pode-se usar o comando&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker container run web-ping
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou executar com outras variáveis de ambiente. Isso dá flexibilidade de executar o mesmo contêiner, porém com parâmetros diferentes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker container run &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;TARGET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;docker.com &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;INTERVAL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;5000 web-ping
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Entendendo Docker images
&lt;/h2&gt;

&lt;p&gt;Uma imagem no Docker é uma coleção de camadas de imagens. Essas camadas são arquivos que ficam no Docker Engine. Assim, essas camadas podem ser compartilhadas entre diferentes contêineres.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6n6sf3mf75hm7p9di0h5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6n6sf3mf75hm7p9di0h5.png" alt="Camadas são compartilhadas entre diferentes imagens" width="483" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lista todas as imagens e o tamanho&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker image &lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ao executar este comando, o espaço ocupado desconsidera as camadas compartilhadas&lt;/p&gt;

&lt;p&gt;Mostra exatamente o espaço ocupado pelo Docker&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker system &lt;span class="nb"&gt;df&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se o código não mudar entre as builds, o Docker reconhece e utiliza a build anteriormente salva, assim não duplica as imagens. Portanto, é recomendado ordenar as linhas de instruções no Dockerfile pela frequência em que elas mudam, logo as linhas mais improváveis de mudar vem primeiro, justamente para que o Docker utilize o cache e execute apenas as últimas instruções, economizando tempo, disco e rede.&lt;/p&gt;

&lt;p&gt;Além disso, se as imagens são compartilhadas, elas não podem ser modificadas, forçando-as a serem apenas para leitura, assim impede que uma modificação altere outras imagens em cascata.&lt;/p&gt;

&lt;h2&gt;
  
  
  Empacotando código-fonte em Docker Imagens
&lt;/h2&gt;

&lt;p&gt;Para executar um determinado código, é necessário um conjunto de ferramentas, que pode ser trabalhoso quando se trabalha em equipe. Dessa forma, o Docker pode criar um script com todas as ferramentas de desenvolvimento, além de compilar o código-fonte e o resultado é a aplicação. Isso favorece que no contêiner da aplicação não tenha nada além do necessário, diminuindo o tamanho da imagem, aumentando o tempo de inicialização e menos hardware para executá-lo, além de melhorar a segurança, pois há menos software disponível para potenciais ataques.&lt;/p&gt;

&lt;p&gt;Para isso acontecer pode ser usado um Dockerfile multi etapas, onde cada etapa é independente, porém arquivos e pastas podem ser copiadas entre etapas e o resultado é apenas a etapa final.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foa2dojf9l6gr7yqjbvqb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foa2dojf9l6gr7yqjbvqb.png" alt="Processo de um Dockerfile multi etapas" width="625" height="327"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Um exemplo de Dockerfile multi etapas segue abaixo usado para um código em Java, onde cada etapa é identificada pela instrução &lt;code&gt;FROM&lt;/code&gt;. Cada etapa também pode ser chamada por um nome usando o comando &lt;code&gt;AS&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;diamol/maven&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;builder&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /usr/src/iotd&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; pom.xml .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;mvn &lt;span class="nt"&gt;-B&lt;/span&gt; dependency:go-offline

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;mvn package

&lt;span class="c"&gt;# app&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; diamol/openjdk&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /usr/src/iotd/target/iotd-service-0.1.0.jar .&lt;/span&gt;

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 80&lt;/span&gt;
&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt;&lt;span class="s"&gt; ["java", "-jar", "/app/iotd-service-0.1.0.jar"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na etapa de &lt;code&gt;builder&lt;/code&gt;, usa-se a imagem &lt;code&gt;diamol/maven&lt;/code&gt; que contém o OpenJDK e a ferramenta Maven. Em seguida, cria-se o diretório de trabalho e copia o &lt;code&gt;pom.xml&lt;/code&gt;, onde o Maven define as configurações para o projeto em Java. Na primeira instrução &lt;code&gt;RUN&lt;/code&gt; executa-se o comando do Maven para baixar as dependências do projeto. A instrução &lt;code&gt;COPY&lt;/code&gt; transfere os arquivos e pasta para o diretório da imagem. Na segunda instrução &lt;code&gt;RUN&lt;/code&gt;, o Maven compila o projeto em Java e gera um arquivo &lt;code&gt;.jar&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Na segunda etapa, que começa com a imagem &lt;code&gt;diamol/openjdk&lt;/code&gt; contém o Java 11, mas não o Maven. Em seguida, cria-se o diretório de trabalho e copia o arquivo &lt;code&gt;jar&lt;/code&gt; da etapa de &lt;code&gt;builder&lt;/code&gt;. Por fim, a porta da aplicação é exposta e &lt;code&gt;ENTRYPOINT&lt;/code&gt; é uma alternativa ao &lt;code&gt;CMD&lt;/code&gt; que diz o que fazer quando o contêiner iniciar a partir da imagem, neste caso, executar o arquivo compilado.&lt;/p&gt;

&lt;p&gt;É interessante notar que as ferramentas de compilação não estão na versão final, colaborando para uma imagem menor. Outro bom exemplo é o &lt;code&gt;curl&lt;/code&gt;, usado para baixar arquivos da Internet, pode ser necessário usado em alguma etapa do processo, mas não é necessário na imagem final.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compartilhando Imagens no Docker Hub
&lt;/h2&gt;

&lt;p&gt;Docker Hub é a maior plataforma para registrar imagens e o padrão do Docker Engine, onde as imagens são buscadas caso não sejam encontradas localmente.&lt;/p&gt;

&lt;p&gt;Para identificação de uma imagem, são necessárias 4 partes no nome da imagem que servem como referência.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftvft6gyec67q40ukvzje.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftvft6gyec67q40ukvzje.png" alt="identificação de uma imagem, primeiro o domínio, autor, nome da imagem, tag" width="767" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O versionamento pode ser feito da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[major].[minor].[patch]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um versionamento que acrescenta um &lt;em&gt;patch&lt;/em&gt; pode ser apenas resolução de bugs e ter as mesmas funções que a última versão. Quando &lt;em&gt;minor&lt;/em&gt; é adicionado significa serem adicionadas novas funções, porém nenhuma é removida. Por fim, &lt;em&gt;major&lt;/em&gt; pode ter funções completamente diferentes.&lt;/p&gt;

&lt;p&gt;Para fazer login no Docker Hub,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;dockerId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;docker-id&amp;gt;"&lt;/span&gt;
docker login &lt;span class="nt"&gt;--username&lt;/span&gt; &lt;span class="nv"&gt;$dockerId&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para criar uma nova referência a imagem, neste caso na versão v1,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker image tag &amp;lt;image-name&amp;gt; &lt;span class="nv"&gt;$dockerId&lt;/span&gt;/&amp;lt;image-name&amp;gt;:v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por fim, para enviar ao Docker,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker image push &lt;span class="nv"&gt;$dockerId&lt;/span&gt;/&amp;lt;image-name&amp;gt;:v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Logo, é possível ir ao website visualizar a imagem em que foi feita upload.&lt;/p&gt;

&lt;p&gt;Além disso, também é possível executar um próprio Docker registry como uma forma de backup ou de economizar banda.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Importante ressalvar o uso de imagens verificadas ou oficiais para evitar problemas de segurança.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Usando Docker Volumes
&lt;/h2&gt;

&lt;p&gt;Um contêiner é um sistema de arquivo único, preenchidos com os arquivos da imagem. As imagens são armazenadas como camadas, assim o disco do contêiner é apenas um sistema de arquivos virtual.&lt;/p&gt;

&lt;p&gt;Contêineres possuem um espaço que podem ser usado para escrever ou modificar arquivos, porém esse espaço é exclusivo de cada contêiner, assim, caso o contêiner seja removido ou alterado (como em uma atualização, por exemplo) os dados serão perdidos.&lt;/p&gt;

&lt;p&gt;Quando o contêiner tenta editar um arquivo da imagem, é gerada uma cópia que será exclusiva daquele contêiner e não interfere nos outros.&lt;/p&gt;

&lt;p&gt;O exemplo abaixo mostra um número aleatório escrito em um arquivo por dois contêineres gerados a partir da mesma imagem.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0kb39e760ibpdvs3ch75.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0kb39e760ibpdvs3ch75.png" alt="A camada de escrita ela é única de cada contêiner e imagens compartilhadas são read-only" width="577" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Portanto, Docker tem funcionalidades que permitem armazenar dados de forma independente do ciclo de vida dos containers, são eles: &lt;em&gt;volumes&lt;/em&gt; e &lt;em&gt;mounts&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Volumes são usados para persistirem informações. Pode-se criar um volume e associar a um container, que aparecerá como um diretório. Assim, ao salvar dados nesse diretório dentro do container, na verdade, será salvo no volume. Logo, ao serem criados novos containers e associados ao volume, todos os dados salvos estarão disponíveis.&lt;/p&gt;

&lt;p&gt;Compartilhar o mesmo volume entre diferentes aplicações não é o ideal. Aplicações, geralmente, possuem acesso exclusivo a banco de dados. Volumes são melhores usados para preservarem atualizações nas aplicações, assim, é possível criar várias versões e associar o volume a nova versão ou a versão desejada.&lt;/p&gt;

&lt;p&gt;Um modo de compartilhar armazenamento entre contêineres é usando &lt;em&gt;bind mounts&lt;/em&gt;, que cria um diretório na máquina &lt;em&gt;host&lt;/em&gt; disponível para um contêiner. Isso pode ser usado como backup ou um armazenamento distribuído acessível pela rede do computador.&lt;/p&gt;

&lt;p&gt;Os &lt;em&gt;bind mounts&lt;/em&gt; são bidirecionais, tanto o host como o contêiner podem ler ou escrever no diretório, então vale ressaltar o aspecto de segurança que contêineres, geralmente, são executados com o menor privilégio possível, sendo necessário autorização do usuário para escrever ou ler nesse diretório.&lt;/p&gt;

&lt;p&gt;Cada contêiner possui um único disco virtual que o Docker une de várias fontes, isso é chamado &lt;em&gt;union filesystem&lt;/em&gt;. Assim, o contêiner vê tudo como apensa um disco rígido e trabalha com arquivos e diretórios da mesma forma, estejam eles no disco ou não. O autor pode decidir quais serão as fontes de dados deste disco rígido, podem existir diversos volumes ou &lt;em&gt;bind mounts&lt;/em&gt;, mas o contêiner verá tudo como um só.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy3r72c85ilsvfhg0qmtc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy3r72c85ilsvfhg0qmtc.png" alt="descrição de cada camada de um contêiner" width="451" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Segue, de maneira geral, como as formas de armazenamento podem ser usadas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Camada de Escrita:&lt;/strong&gt; dados temporários, como cache ou cálculos. São únicos de cada contêiner e tem o mesmo ciclo de vida que o contêiner.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bind Mounts locais:&lt;/strong&gt; compartilhar dados entre o host e o contêiner, por exemplo, código-fonte, realizando modificações locais sem precisar criar uma nova imagem.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bind Mounts distribuídos:&lt;/strong&gt; podem serem usados para o compartilhamento de configurações, fontes de leitura de informações ou cache distribuído ou para a escrita de dados que podem serem usados por qualquer contêiner ou máquina na rede.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Volume:&lt;/strong&gt; compartilhar dados entre contêineres e armazenamento gerenciado pelo Docker. Quando uma aplicação atualiza para um novo contêiner, os dados serão salvos no volume da versão anterior.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Camadas das Imagens:&lt;/strong&gt; sistema de arquivos inicial do contêiner. As últimas camadas sempre sobrepõe as mais novas. Camadas são sempre de leitura e compartilhada entre contêineres.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>docker</category>
      <category>beginners</category>
      <category>devops</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Linux: Introdução ao sistema operacional</title>
      <dc:creator>Anderson de Alencar</dc:creator>
      <pubDate>Tue, 18 Oct 2022 13:17:59 +0000</pubDate>
      <link>https://forem.com/alencarbarros/linux-introducao-ao-sistema-operacional-1b7c</link>
      <guid>https://forem.com/alencarbarros/linux-introducao-ao-sistema-operacional-1b7c</guid>
      <description>&lt;h2&gt;
  
  
  Comandos Iniciais
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ls&lt;/code&gt; lista diretórios e arquivos&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ls -l&lt;/code&gt; lista longa com detalhes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ls -s&lt;/code&gt; lista com o tamanho alocado de cada arquivo
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ls -a&lt;/code&gt; exibe arquivos e diretórios ocultos&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ls &amp;lt;dir&amp;gt;&lt;/code&gt; lista diretório dado&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;history&lt;/code&gt; histórico de comandos&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mkdir&lt;/code&gt; cria diretório&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rm&lt;/code&gt; remover&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rm -f&lt;/code&gt; remove forçadamente, ignorando arquivos não existentes ou argumentos&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rm -r&lt;/code&gt; remove diretórios recursivamente&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rm -rf&lt;/code&gt; remover diretórios não vazios&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rmdir&lt;/code&gt; remover diretórios vazios&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cd &amp;lt;dir&amp;gt;&lt;/code&gt; muda diretório&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;~&lt;/code&gt; pasta pessoal home&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.&lt;/code&gt; pasta atual&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cd ..&lt;/code&gt; retorna ao diretório anterior&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--help&lt;/code&gt; exibe arquivo de ajuda&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;man&lt;/code&gt; manual do comando&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mv&lt;/code&gt; mover &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mv -i&lt;/code&gt; confirmar antes de substituir&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mv -n&lt;/code&gt; sem substituição &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mv -b&lt;/code&gt; substituição pelo backup &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mv -u&lt;/code&gt; substitua se o arquivo de destino for antigo ou não existir&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mv &amp;lt;nome_antigo&amp;gt; &amp;lt;nome_novo&amp;gt;&lt;/code&gt; renomeia um arquivo&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cp&lt;/code&gt; copiar&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cp -i&lt;/code&gt; copia, porém verifica se o arquivo já existe&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cp -v&lt;/code&gt; exibe uma saída&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cp -r&lt;/code&gt; copia diretórios&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cp -l&lt;/code&gt; cria hard links &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cp -s&lt;/code&gt; cria links simbólicos&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cp -u&lt;/code&gt; copia apenas quando o arquivo de destino for antigo ou não existir&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;clear&lt;/code&gt; limpa terminal ou &lt;code&gt;CTRL + L&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;exit&lt;/code&gt; sai do terminal &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Comandos para manipulação de arquivos e textos e redirecionamento
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;nano&lt;/code&gt; é o editor do texto do terminal do Ubuntu&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cat&lt;/code&gt; imprime o arquivo .txt em ordem normal&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tac&lt;/code&gt; imprime o arquivo .txt em ordem inversa&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;head&lt;/code&gt; imprime as primeiras 10 linhas de um ou mais arquivos&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tail&lt;/code&gt; imprime as últimas 10 linhas de um ou mais arquivos&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cal&lt;/code&gt; mostra o calendário&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cal 2020&lt;/code&gt; mostra o calendário do ano de 2020 &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cal december 2020&lt;/code&gt; mostra o calendário do ano de 2020 e o mês de dezembro &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;date&lt;/code&gt; mostra a data e horário&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;!!&lt;/code&gt; repete o último comando&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt; adiciona uma informação a um arquivo de texto&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;grep&lt;/code&gt; faz uma busca por um termo dentro do texto&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;|&lt;/code&gt; serve para usar mais de um comando&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;| more&lt;/code&gt; ou &lt;code&gt;| less&lt;/code&gt; servem para o arquivo ficar paginado, sem exibir totalmente&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;amp;&lt;/code&gt; executa dois ou mais comandos com saídas separadas&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; executa dois ou mais comandos em sequência com as saídas unidas&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;file&lt;/code&gt; mostra o tipo de arquivo ou pasta&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;whatis&lt;/code&gt; mostra o que faz determinado comando&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;find&lt;/code&gt; busca um arquivo em um diretório&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;find &amp;lt;dir&amp;gt; -type f -name &amp;lt;nome&amp;gt;&lt;/code&gt; busca um arquivo (&lt;code&gt;-type f&lt;/code&gt;) em um diretório, o nome pode ser um padrão em Regex&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;find &amp;lt;dir&amp;gt; -type d -name &amp;lt;nome&amp;gt;&lt;/code&gt; busca por um diretório (&lt;code&gt;-type d&lt;/code&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;touch&lt;/code&gt; cria arquivos vazios &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;echo&lt;/code&gt; imprime algo na saída&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Diretórios do Linux e Comandos de Sistema
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Diretórios
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/&lt;/code&gt; É o diretório raiz, todos os demais diretórios estão abaixo dele.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/bin&lt;/code&gt; Contém arquivos programas do sistema que são usados com frequência pelos usuários.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/boot&lt;/code&gt; Arquivos estáticos e gerenciador de inicialização.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/dev&lt;/code&gt; Arquivos de dispositivos (periféricos).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/etc&lt;/code&gt; Arquivos de configuração do sistema, específicos da máquina.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/home&lt;/code&gt; Contém os diretórios dos usuários.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/lib&lt;/code&gt; Bibliotecas essenciais compartilhadas e módulos do kernel.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/mnt&lt;/code&gt; Ponto de montagem para montar um sistema de arquivos temporariamente.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/proc&lt;/code&gt; Diretório virtual de informações do sistema.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/root&lt;/code&gt; Diretório home do usuário root.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/sbin&lt;/code&gt; Diretório de programas usados pelo super usuário root, para administração e controle do funcionamento do sistema.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/tmp&lt;/code&gt; Arquivos temporários.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/usr&lt;/code&gt; Contém a maior parte de seus programas. Normalmente acessível somente como leitura.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/var&lt;/code&gt; Dados variáveis, como: arquivos e diretórios de spool, dados de administração e login, e arquivos transitórios.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/opt&lt;/code&gt; Aplicativos adicionais e pacotes de softwares.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Comandos e arquivos do sistema
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/proc/cpuinfo&lt;/code&gt; contém todas as informações da CPU&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/proc/meminfo&lt;/code&gt; contém todas as informações da memória&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/etc/passwd&lt;/code&gt; contém todos os usuários do sistema&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lspci&lt;/code&gt; mostra informações dos dispositivos PCI &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lsusb&lt;/code&gt; mostra informações dos dispositivos USB&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lscpu&lt;/code&gt; mostra informações do CPU&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lshw&lt;/code&gt; mostra de todo hardware que encontrar&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lshw -short&lt;/code&gt; mostra de todo hardware que encontrar resumidamente&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;arch&lt;/code&gt; mostra qual a arquitetura do computador&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;uname&lt;/code&gt; mostra o nome do kernel&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;uname -r&lt;/code&gt; mostra a versão do kernel&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;uname -m&lt;/code&gt; mostra a arquitetura do kernel&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;free&lt;/code&gt; mostra a memória física e a memória swap&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;du -h&lt;/code&gt; estima o espaço ocupado por um diretório &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Fundamentos de Rede e Comandos de Rede
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Rede de computadores é um conjunto de equipamentos interligados de maneira a trocarem informações e recursos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Tipos de Redes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Rede WAN&lt;/strong&gt;, Wide Area Network ou World Area Network é uma rede geograficamente distribuída.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Rede MAN&lt;/strong&gt;, Metropolitan Area Network, é uma rede metropolitana que interligam várias redes locais.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Rede LAN&lt;/strong&gt;, Local Area Network, é uma rede local de uma forma geral em um único prédio, uma casa ou campus.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Protocolos
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Protocolo&lt;/strong&gt; é uma linguagem usada pelos dispositivos de uma rede de modo que eles consigam se entender.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;IP são números que identificam seu computador em uma rede.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ICMP (Internet Control Message Protocol) tem o objetio prover mensagens de controle na comunicação entre nós.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DNS (Domain Name Server) é um protocolo de aplicação que tem por função identificar endereços IP e manter uma tabela com endereços dos caminhos da rede.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Interface de Rede
&lt;/h3&gt;

&lt;p&gt;Interface de Rede são softwares ou hardware que faz comunicação em uma rede.&lt;/p&gt;

&lt;p&gt;As interfaces de rede no Linux estão em &lt;code&gt;/dev&lt;/code&gt; e a maioria é criada dinamicamente pelos softwares quando requisitadas.&lt;/p&gt;

&lt;p&gt;Exemplo: &lt;code&gt;eth0&lt;/code&gt; placa de rede ethernet, &lt;code&gt;loopback&lt;/code&gt; permite fazer conexões com si mesmo, permitindo testar programas de rede sem precisar interferir na sua rede, por padrão, tem endereço IP &lt;code&gt;127.0.0.1&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Comandos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ifconfig&lt;/code&gt; mostra detalhes da redes ativas além de configurar as interfaces de rede&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hostname&lt;/code&gt; mostra informações do host, o nosso computador na rede&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hostname -i&lt;/code&gt; exibe IP do loopback&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hostname -I&lt;/code&gt; mostra o IP do computador&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;w&lt;/code&gt; mostra informações do usuário na rede&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;who&lt;/code&gt; mostra como estamos logados&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;whoami&lt;/code&gt; mostra o nome do usuário logado na rede&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;whois&lt;/code&gt; traz várias informações sobre dado host, como dono, DNS, contato, e-mail e etc&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ping&lt;/code&gt; mostra se o host está ativo. Envia um pacote de requisição para o host e recebe as respostas&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dig&lt;/code&gt; mostra informações sobre DNS&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dig +short&lt;/code&gt; mostra o IP do host dado&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;traceroute&lt;/code&gt; traçar a rota até determinado host, mostrando informações dos nós até o host dado&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;finger&lt;/code&gt; traz informações detalhadas do usuário logado&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Fuçando no Linux com comandos diversos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;history -c&lt;/code&gt; limpa o histórico de comandos&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;alias&lt;/code&gt; cria atalhos para comandos&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nl&lt;/code&gt; exibe o arquivo com o número de linhas &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;wc&lt;/code&gt; exibe linhas, palavras, e letras de um arquivo&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;wc -l&lt;/code&gt; mostra o número de linhas, conta as linhas em branco &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;wc -w&lt;/code&gt; conta o número de palavras de um arquivo&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cmp&lt;/code&gt; compara arquivos &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;diff&lt;/code&gt; compara arquivos e exibe o arquivo&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sort -n&lt;/code&gt; ordena as linhas de um arquivo, em ordem numérica&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;last reboot&lt;/code&gt; exibe todas as informações de reinicialização do sistema&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;route -n&lt;/code&gt; mostra todas as tabelas de roteamento IP&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;time&lt;/code&gt; mostra o tempo de um processo&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;uptime&lt;/code&gt; mostra por quanto tempo o sistema está rodando&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cowsay&lt;/code&gt; exibe uma vaquinha que fala&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cmatrix&lt;/code&gt; exibe as letrinhas de Matrix&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;init 0&lt;/code&gt; desliga a máquina&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;telinit 0&lt;/code&gt; desliga a máquina&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;halt&lt;/code&gt; desliga a máquina, todavia com autenticação&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;seq inicio fim&lt;/code&gt; exibe uma sequência de números &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;whereis&lt;/code&gt; exibe o caminho do programa e seu manual&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;which&lt;/code&gt; exibe o local de um comando a ser executado no ambiente atual&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Controle de usuários, grupos e permissões
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Usuários
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;adduser &amp;lt;nome_usuario&amp;gt;&lt;/code&gt; adiciona novo usuário, só o root pode adicionar usuários&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;su &amp;lt;nome_usuario&amp;gt;&lt;/code&gt; muda de usuário&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;passwd &amp;lt;nome_usuario&amp;gt;&lt;/code&gt; muda a senha de um usuário&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lastlog&lt;/code&gt; exibe informações de login de todos os usuários&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;last&lt;/code&gt; listagem de entrada e saída de usuários no sistema&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;logname&lt;/code&gt; exibe nome do usuário atual logado no sistema&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Grupos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;id&lt;/code&gt; exibe os identificadores do usuário e a que grupo pertence&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/etc/passwd&lt;/code&gt; já dito anteriormente, contém todos os usuários do sistema&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/etc/group&lt;/code&gt; contém todos os grupos do sistema&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;userdel -r &amp;lt;nome_usuario&amp;gt;&lt;/code&gt; remove um usuário e sua pasta pessoal&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;groups&lt;/code&gt; exibe todos os grupos que o usuário pertence&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;addgroup&lt;/code&gt; cria um grupo&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;adduser &amp;lt;nome_usuario&amp;gt; &amp;lt;grupo&amp;gt;&lt;/code&gt; adiciona um usuário a um grupo&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gpasswd -a &amp;lt;nome_usuario&amp;gt; &amp;lt;grupo&amp;gt;&lt;/code&gt; também adiciona um usuário a um grupo&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gpasswd -d &amp;lt;nome_usuario&amp;gt; &amp;lt;grupo&amp;gt;&lt;/code&gt; remove o usuário de um grupo&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;groupdel &amp;lt;grupo&amp;gt;&lt;/code&gt; remove um grupo&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Permissões
&lt;/h3&gt;

&lt;p&gt;As permissões são divididas em 3 partes: o dono, grupo e outros cada um com 3 caracteres. Por exemplo, &lt;code&gt;drwxr-xr-x&lt;/code&gt; mostra que nesse diretório o dono tem permissão &lt;code&gt;rwx&lt;/code&gt;,  o grupo &lt;code&gt;r-x&lt;/code&gt; e os outros &lt;code&gt;r-x&lt;/code&gt;. As letras indicam as permissões e o traço uma restrição, sendo &lt;code&gt;r&lt;/code&gt; para ler, &lt;code&gt;w&lt;/code&gt; para escrever e &lt;code&gt;x&lt;/code&gt; para executar.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ls -lh&lt;/code&gt; exibe as permissões em um diretório&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Comando &lt;code&gt;chmod &amp;lt;modo&amp;gt; &amp;lt;arquivo&amp;gt;&lt;/code&gt; e o Modo Octal
&lt;/h3&gt;

&lt;p&gt;O comando &lt;code&gt;chmod&lt;/code&gt; altera as permissões de um arquivo ou diretório, sendo possível definir permissões para cada uma das partes, o dono, grupo e outros.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Um número é definido para cada grupo&lt;/li&gt;
&lt;li&gt;0 representa uma restrição&lt;/li&gt;
&lt;li&gt;Para mais de uma permissão soma-se ambos. Por exemplo, para execução e escrita em um arquivo qualquer para apenas o dono faz da seguinte maneira, &lt;code&gt;chmod 300 &amp;lt;arquivo&amp;gt;&lt;/code&gt;, como também 777 daria todas as permissões possíveis&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Compactação, descompactação e arquivamento
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gzip &amp;lt;arquivo&amp;gt;&lt;/code&gt; compactador com taxa excelente de compactação, o arquivo original deixa de existir&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gzip -9 &amp;lt;arquivo&amp;gt;&lt;/code&gt; compactação com grau máximo&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gunzip &amp;lt;arquivo&amp;gt;&lt;/code&gt; para descompactar um arquivo &lt;em&gt;.gz&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;zip &amp;lt;arquivo.zip&amp;gt; &amp;lt;arquivo&amp;gt;+&lt;/code&gt; compactador, porém mantém o arquivo original e pode ser colocado vários arquivos&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;unzip &amp;lt;arquivo.zip&amp;gt;&lt;/code&gt; para descompactar um arquivo &lt;em&gt;.zip&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bzip2 &amp;lt;arquivo&amp;gt;&lt;/code&gt; compactador mais atual que o &lt;code&gt;gzip&lt;/code&gt; e &lt;code&gt;zip&lt;/code&gt;, o arquivo original deixa de existir&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bzip2 -d &amp;lt;arquivo.bz2&amp;gt;&lt;/code&gt; para descompactar um arquivo &lt;em&gt;.bz2&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rar a &amp;lt;arquivo.rar&amp;gt; &amp;lt;arquivo&amp;gt;+&lt;/code&gt; gera um arquivo &lt;em&gt;.rar&lt;/em&gt; e pode ser usado com vários arquivos&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rar x &amp;lt;arquivo.rar&amp;gt;&lt;/code&gt; para descompactar um arquivo &lt;em&gt;.rar&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Arquivadores
&lt;/h2&gt;

&lt;p&gt;Junta vários arquivos em um só. Pode ser usado em conjunto com um compactador para armazenar arquivos compactados. Um dos mais conhecidos é o &lt;em&gt;.tar&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;tar -cf &amp;lt;arquivo.tar&amp;gt; &amp;lt;arquivo&amp;gt;+&lt;/code&gt; cria um arquivo &lt;em&gt;.tar&lt;/em&gt; com um ou mais arquivos. &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tar -xvf &amp;lt;arquivo.tar.gz&amp;gt;&lt;/code&gt; descompacta um arquivo &lt;em&gt;.tar.gz&lt;/em&gt;, ou seja, um arquivo que foi empacotado com &lt;code&gt;tar&lt;/code&gt; e em seguida, compactado com &lt;code&gt;gzip&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tar -xvf &amp;lt;arquivo.tar.gz&amp;gt; -C &amp;lt;dir&amp;gt;&lt;/code&gt; extrai para outro diretório&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Gerenciamento de pacotes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Pacotes&lt;/strong&gt; são programas colocados dentro de um arquivo identificados por sua extensão e incluem arquivos necessários para sua instalação, como &lt;em&gt;.deb&lt;/em&gt;, &lt;em&gt;.rpm&lt;/em&gt; e outros.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gerenciadores de Pacotes&lt;/strong&gt; são sistemas que possuem resolução automática de dependências entre pacotes, método fácil de instalação de pacotes, como dpkg, apt, yum.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;sudo apt install &amp;lt;pacote&amp;gt;&lt;/code&gt; instala e atualiza um pacote&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo apt upgrade &amp;lt;pacote&amp;gt;&lt;/code&gt; atualiza um pacote &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo apt remove &amp;lt;pacote&amp;gt;&lt;/code&gt; remove um pacote &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt upgrade&lt;/code&gt; atualiza todos os pacotes &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sites de Pacotes
&lt;/h2&gt;

&lt;p&gt;Locais onde se pode baixar pacotes&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pkgs.org/" rel="noopener noreferrer"&gt;pkgs.org&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://rpm.pbone.net/" rel="noopener noreferrer"&gt;rpm.pbone.net&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;sudo dpkg -i &amp;lt;pacote.deb&amp;gt;&lt;/code&gt; instala um pacote &lt;em&gt;.deb&lt;/em&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;sudo dpkg -I &amp;lt;pacote.deb&amp;gt;&lt;/code&gt; obtém informações de um pacote&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;sudo dpkg -r &amp;lt;pacote&amp;gt;&lt;/code&gt; remove um pacote &lt;em&gt;.deb&lt;/em&gt;, usa-se o nome do pacote dado nas informações dele&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No Fedora,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;sudo rpm -ivh --nodeps &amp;lt;pacote.rpm&amp;gt;&lt;/code&gt; instala um pacote e resolve as dependências&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo rpm -U &amp;lt;pacote.rpm&amp;gt;&lt;/code&gt; atualiza um pacote &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo rpm -e &amp;lt;pacote.rpm&amp;gt;&lt;/code&gt; remove um pacote &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Shell script
&lt;/h2&gt;

&lt;p&gt;É uma interface de usuário para acessar os serviços de um sistema operacional. Script é uma linguagem de programação que executa no sistema em tempo de execução, muito usada em automação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Variáveis de Ambiente
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;env&lt;/code&gt; mostra as variáveis de ambiente&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;portfolio=~/Documents/alencarbarros.github.io/&lt;/code&gt; criando uma variável de ambiente &lt;code&gt;portfolio&lt;/code&gt; com um caminho&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;export portfolio&lt;/code&gt; cria a variável de ambiente&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cd $portfolio&lt;/code&gt; é possível ir até esse caminho com tal variável&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>linux</category>
      <category>beginners</category>
      <category>productivity</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Trabalhando com Ambientes Virtuais em Python 🐍</title>
      <dc:creator>Anderson de Alencar</dc:creator>
      <pubDate>Tue, 18 Oct 2022 13:10:46 +0000</pubDate>
      <link>https://forem.com/alencarbarros/trabalhando-com-ambientes-virtuais-2d1h</link>
      <guid>https://forem.com/alencarbarros/trabalhando-com-ambientes-virtuais-2d1h</guid>
      <description>&lt;p&gt;É sempre interessante isolar as dependências de um projeto e toda linguagem ou framework tem a sua ferramenta: Java e Gradle, Node e npm, etc. No caso do Python, eu uso o Anaconda e Virtualenv e por isso criei uma pequena referência para ajudar a trabalhar com os ambientes virtuais.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anaconda
&lt;/h2&gt;

&lt;p&gt;Anaconda gera um ambiente em um diretório padrão da ferramenta, exceto se for especificado o diretório.&lt;/p&gt;

&lt;p&gt;Criando um ambiente virtual&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;conda create &lt;span class="nt"&gt;--name&lt;/span&gt; &amp;lt;nome&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mudando de ambiente virtual&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;conda activate &amp;lt;nome&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saindo do ambiente virtual&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;conda deactivate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Listar pacotes instalados&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;conda list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Listar ambientes instalados&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;conda &lt;span class="nb"&gt;env &lt;/span&gt;list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exportar configurações de um ambiente virtual. Usa-se a flag &lt;code&gt;--from-history&lt;/code&gt; para manter a compatibilidade entre plataformas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;conda &lt;span class="nb"&gt;env export&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; environment.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;conda &lt;span class="nb"&gt;env export&lt;/span&gt; &lt;span class="nt"&gt;--from-history&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; environment.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Removendo um ambiente&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;conda remove &lt;span class="nt"&gt;--name&lt;/span&gt; myenv &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Duplicando um ambiente virtual a partir do &lt;code&gt;environment.yml&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;conda &lt;span class="nb"&gt;env &lt;/span&gt;create &lt;span class="nt"&gt;-n&lt;/span&gt; conda-name &lt;span class="nt"&gt;-f&lt;/span&gt; environment.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Atualizar as dependências de um ambiente pelo arquivo &lt;code&gt;enviroment.yml&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;conda &lt;span class="nb"&gt;env &lt;/span&gt;update &lt;span class="nt"&gt;-f&lt;/span&gt; enviroment.yml &lt;span class="nt"&gt;--prune&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mais informações &lt;a href="https://conda.io/projects/conda/en/latest/user-guide/concepts/environments.html" rel="noopener noreferrer"&gt;Conda environments&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Virtualenv
&lt;/h2&gt;

&lt;p&gt;O Virtualenv gera um ambiente virtual na pasta local onde você estiver trabalhando. No Linux, geralmente, coloca-se um ponto no começo do diretório para ocultá-lo, mas não é obrigatório.&lt;/p&gt;

&lt;p&gt;Criando ambiente virtual (o ponto significa que  a pasta do ambiente fica oculta em ambientes Unix, neste caso opcional).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;virtualenv .&amp;lt;nome&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ativando o ambiente&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt; .&amp;lt;nome&amp;gt;/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para sair&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;deactivate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para excluir o ambiente virtual basta deletar a pasta onde foi criado.&lt;/p&gt;

</description>
      <category>python</category>
      <category>conda</category>
      <category>virtualenv</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
