Return to Video

CLS CAP09 2022 VA08 DOCKERFILE

  • 0:09 - 0:13
    Um dos passos mais importantes quando
    nós falamos da utilização de Docker
  • 0:13 - 0:17
    é justamente aprender a criar
    o nosso próprio Docker,
  • 0:17 - 0:20
    ou pelo menos a nossa
    própria imagem.
  • 0:20 - 0:23
    Para isso, nós vamos ter que utilizar
    algumas ferramentas.
  • 0:23 - 0:30
    A primeira e provavelmente mais importante
    nesse processo vai ser o Dockerfile.
  • 0:30 - 0:35
    Ele é basicamente um arquivo que vai permitir
    que eu passe instruções para o Docker
  • 0:35 - 0:38
    de como ele deve
    construir aquela imagem.
  • 0:38 - 0:41
    Antes de mais nada, eu vou precisar
    pelo menos de algum código
  • 0:41 - 0:45
    para que eu consiga colocar
    em desenvolvimento.
  • 0:45 - 0:51
    Para isso, eu peguei um códigozinho bem
    simples de "hello, world" baseado em Node,
  • 0:51 - 0:55
    é basicamente uma página que tem
    um campinho de preenchimento de busca
  • 0:55 - 0:59
    e um botãozinho, mas essa função
    não tem nada programado,
  • 0:59 - 1:03
    é realmente só para nós
    termos um código para utilizar.
  • 1:03 - 1:06
    Nesse caso, nós vamos
    utilizar um código em Node
  • 1:06 - 1:11
    e, justamente por isso, eu preciso utilizar
    como base para a minha imagem
  • 1:11 - 1:15
    uma imagem que já tenha um Node
    pronto para eu poder utilizar.
  • 1:15 - 1:18
    Caso nós não achemos
    uma imagem dessa forma,
  • 1:18 - 1:22
    nós podemos passar comandos
    dentro de um container
  • 1:22 - 1:26
    para que ele faça todo o processo
    de instalação daquele software
  • 1:26 - 1:29
    e disponibilize todo aquele
    ambiente montado para nós.
  • 1:29 - 1:34
    Aqui dentro da minha tela, eu vou ter,
    então, uma pasta chamada "app",
  • 1:34 - 1:40
    que eu criei dentro do meu desktop,
    e nela eu vou ter alguns arquivos.
  • 1:41 - 1:47
    O "yarn.lock", o "package",
    a pasta "src" e a pasta "spec"
  • 1:47 - 1:51
    são justamente conteúdos que eu
    tenho dessa minha aplicação.
  • 1:51 - 1:56
    Se eu abro, por exemplo, aqui,
    o "src", eu vou ter um "index.js",
  • 1:56 - 2:01
    que vai ser, justamente, o arquivo
    inicial da minha aplicação.
  • 2:02 - 2:06
    Aqui nessa pasta, eu ainda tenho
    o arquivo chamado Dockerfile.
  • 2:06 - 2:09
    Esse é o arquivo que vai
    trazer todas as instruções
  • 2:09 - 2:13
    que o Docker precisa
    para construir a nossa imagem.
  • 2:13 - 2:16
    Existem algumas características
    muito importantes
  • 2:16 - 2:18
    que nós temos
    que nos atentar nele,
  • 2:18 - 2:23
    a primeira delas é que esse
    arquivo não tem extensão,
  • 2:24 - 2:28
    a segunda é que ele sempre
    vai começar com D maiúsculo
  • 2:28 - 2:31
    e "Dockerfile" vai estar
    escrito tudo junto.
  • 2:31 - 2:34
    Eu preciso justamente prestar
    atenção em todos esses padrões
  • 2:34 - 2:37
    para que eu não impeça
    o Docker de achar o arquivo
  • 2:37 - 2:40
    e, assim, começar o processo
    de build da imagem.
  • 2:40 - 2:45
    Agora, como eu valido isso aqui
    dentro dos meus arquivos?
  • 2:45 - 2:50
    Basta eu vir na aba de visualização
    do Explorer no Windows
  • 2:50 - 2:56
    e marcar a opção "file name extensions",
    ou mostrar extensões de arquivo.
  • 2:56 - 3:00
    Note que agora todos os meus
    arquivos ganharam uma extensão,
  • 3:00 - 3:02
    menos o Dockerfile.
  • 3:02 - 3:08
    Pode ser que, quando você criou o arquivo
    utilizando, por exemplo, o bloco de notas,
  • 3:08 - 3:12
    ele tivesse mostrado
    uma opção como txt.
  • 3:12 - 3:17
    Caso ele tenha aparecido como txt
    no final, basta apertar a tecla F2
  • 3:17 - 3:23
    e renomear o arquivo, excluindo
    o ".txt" e deixando apenas "Dockerfile".
  • 3:23 - 3:27
    O Windows vai pedir que você confirme
    que aquele arquivo não vai ter uma extensão,
  • 3:27 - 3:31
    basta confirmar e seguir
    para as próximas etapas.
  • 3:31 - 3:34
    Quando nós abrimos o Dockerfile
    dentro de um bloco de notas,
  • 3:34 - 3:37
    nós vamos ter uma estrutura
    até bem simples.
  • 3:37 - 3:41
    A primeira coisa que nós vamos
    ver é justamente um comentário
  • 3:41 - 3:46
    definindo qual tipo de sintaxe nós estamos
    utilizando para a construção desse arquivo.
  • 3:46 - 3:49
    Nesse caso, uma sintaxe de versão 1.
  • 3:49 - 3:55
    As linhas de comando que definem a sintaxe
    estão lá na documentação do Docker.
  • 3:55 - 3:59
    Por hora, você pode simplesmente copiar
    essa linha para todos os seus arquivos
  • 3:59 - 4:02
    e tudo vai correr sem
    maiores problemas.
  • 4:02 - 4:06
    Agora, caso você se torne
    um usuário avançado de Docker,
  • 4:06 - 4:12
    algumas funções só vão estar disponíveis
    em versões específicas do Dockerfile,
  • 4:12 - 4:17
    então você vai ter que ficar atento
    a qual tipo de Dockerfile utilizar
  • 4:17 - 4:21
    para poder criar exatamente
    o container da forma que você precisa.
  • 4:21 - 4:25
    Logo em seguida, eu tenho
    um comando chamado "FROM".
  • 4:25 - 4:31
    Esse comando serve para eu especificar
    qual é a imagem de base que eu vou utilizar.
  • 4:31 - 4:37
    Nesse caso, uma imagem chamada
    "node" na versão "12-alpine".
  • 4:37 - 4:43
    É justamente aqui, por exemplo, que caso eu
    queira criar um container totalmente do zero
  • 4:43 - 4:46
    utilizando só um sistema
    operacional de base,
  • 4:46 - 4:50
    eu vou conseguir especificar que eu
    quero esse sistema operacional.
  • 4:50 - 4:53
    Se eu quisesse, por exemplo,
    criar um servidor Apache do zero,
  • 4:53 - 4:58
    eu poderia fazer um FROM Ubuntu
    e, nos comandos que se seguem,
  • 4:58 - 5:02
    fazer todo o passo a passo
    de instalação do Apache.
  • 5:02 - 5:08
    Nesse caso, nós já estamos reaproveitando
    parte da estrutura do Node que já está pronta
  • 5:08 - 5:11
    e, aí, eu só preciso rodar
    alguns poucos comandos
  • 5:11 - 5:14
    e copiar os meus arquivos
    para dentro do container.
  • 5:14 - 5:19
    Nosso próximo passo, então,
    é rodar um "apk add"
  • 5:19 - 5:25
    para garantir que eu tenho
    o python2, o compilador "c"
  • 5:25 - 5:27
    e o make dentro
    da minha máquina.
  • 5:28 - 5:33
    O nosso próximo passo, então, vai
    ser criar um diretório de trabalho,
  • 5:33 - 5:36
    nesse caso, chamado "app".
  • 5:36 - 5:40
    Esse diretório de trabalho vai
    basicamente informar para o container
  • 5:40 - 5:43
    qual pasta ele deve utilizar
    para poder trabalhar.
  • 5:43 - 5:49
    Note que todo o nosso conteúdo do arquivo
    está dentro de uma pasta chamada "app",
  • 5:49 - 5:53
    dessa forma, eu vou conseguir
    navegar para dentro dessa pasta,
  • 5:53 - 5:55
    utilizar ela como pasta padrão
  • 5:55 - 5:59
    e, a partir de então, começar
    a executar os demais comandos.
  • 5:59 - 6:04
    O comando "COPY" serve justamente para eu
    copiar arquivos para dentro do container.
  • 6:04 - 6:09
    Ele vai copiar todos os arquivos
    da pasta que eu me encontro,
  • 6:09 - 6:15
    por isso o ponto, para a pasta que eu
    estarei utilizando dentro do container,
  • 6:15 - 6:18
    por isso, eu vou utilizar
    "." novamente.
  • 6:18 - 6:20
    E aqui vai vir um ponto
    bem interessante:
  • 6:20 - 6:23
    a cópia do arquivo não é
    exatamente uma boa prática,
  • 6:23 - 6:29
    como nós vimos, se nós não soubermos utilizar
    o armazenamento de arquivos de forma correta,
  • 6:29 - 6:33
    isso vai atrapalhar o bom
    funcionamento de um container.
  • 6:33 - 6:37
    A questão, nesse caso, é que, como eu
    estou criando um container novo,
  • 6:37 - 6:42
    eu preciso passar todos os códigos
    que vão servir de base para ele,
  • 6:42 - 6:47
    então eu posso copiar esses arquivos
    sem a menor dor de cabeça,
  • 6:47 - 6:50
    já que eles vão passar
    a ser parte fundamental
  • 6:50 - 6:53
    de todo o container
    que eu estou criando.
  • 6:53 - 6:54
    O passo seguinte, então,
  • 6:54 - 7:01
    é garantir que esse meu sistema esteja
    utilizando um ambiente de produção.
  • 7:01 - 7:03
    Para isso, eu posso
    executar um "yarn install".
  • 7:03 - 7:07
    Esse comando é um comando
    que pertence ao ambiente Node
  • 7:07 - 7:10
    e serve basicamente para instalar
    todos os pacotes necessários
  • 7:10 - 7:14
    e preparar o ambiente para a execução
    daquela minha aplicação.
  • 7:14 - 7:17
    Em seguida, eu vou
    utilizar o "CMD",
  • 7:17 - 7:23
    que é basicamente uma forma de criar
    linhas de comando dentro do container.
  • 7:23 - 7:27
    Nesse caso, eu estou chamando
    o comando Node e informando para ele
  • 7:27 - 7:35
    que o arquivo de origem da minha aplicação
    está dentro da pasta "src/index".
  • 7:35 - 7:39
    E esse é exatamente o caminho
    que nós checamos agora há pouco
  • 7:39 - 7:42
    de onde estava o index
    da minha aplicação.
  • 7:42 - 7:46
    Então, a partir do momento que eu copiei
    esses dados para dentro do container,
  • 7:46 - 7:49
    eu, agora, mostrei para o Node
    como executá-lo.
  • 7:49 - 7:53
    Por fim, eu estou fazendo
    um "EXPOSE" da porta 3000.
  • 7:53 - 7:56
    Esse comando serve
    justamente para eu informar
  • 7:56 - 7:59
    que eu vou ter que acessar
    uma porta desse container,
  • 7:59 - 8:04
    dessa forma, na hora que eu for criar
    o container para colocá-lo em execução,
  • 8:04 - 8:08
    o Docker vai saber que eu posso
    ter uma conexão de rede ali
  • 8:08 - 8:10
    e vai permitir a criação
    dessa interação.
  • 8:10 - 8:15
    Outro detalhe muito importante é que eu
    tenho duas formas de executar comandos.
  • 8:15 - 8:19
    A primeira é a partir
    do comando "run".
  • 8:19 - 8:25
    O run vai simplesmente executar aquela
    linha de comando dentro do meu container
  • 8:25 - 8:29
    na hora que eu estiver fazendo
    toda a parte de construção dele.
  • 8:29 - 8:33
    Enquanto isso, CMD vão ser
    comandos que vão ser executados
  • 8:33 - 8:35
    posteriormente à criação
    do meu container.
  • 8:35 - 8:41
    Dessa forma, quando eu crio lá o CMD chamando
    um comando Node e passando o index,
  • 8:41 - 8:47
    toda vez que esse container for colocado
    em execução, esse comando vai ser chamado.
  • 8:47 - 8:50
    Agora que todo esse
    processo está finalizado,
  • 8:50 - 8:54
    eu posso utilizar esses arquivos
    para construir o meu container.
  • 8:54 - 9:01
    Utilizando, então, o prompt de comando, eu
    vou poder recorrer a uma função chamada
  • 9:01 - 9:03
    "docker build".
  • 9:03 - 9:05
    Esse comando é
    um comando bem simples
  • 9:05 - 9:08
    e não tem muita coisa que nós
    temos que configurar nele.
  • 9:08 - 9:13
    Nesse caso, por exemplo, nós
    só vamos nomear a imagem
  • 9:13 - 9:17
    e, em seguida, informar o endereço,
    para o Dockerfile, que vai ser utilizado.
  • 9:17 - 9:22
    Para isso, eu vou informar o "-t"
    seguido do nome da imagem.
  • 9:24 - 9:29
    Nesse caso, eu vou chamar ela de "ola"
    e, em seguida, eu vou informar um ponto.
  • 9:29 - 9:36
    A função desse ponto é informar que eu já
    estou na pasta onde eu tenho o Dockerfile,
  • 9:36 - 9:39
    caso eu não esteja nessa pasta,
    em vez de informar o ponto,
  • 9:39 - 9:43
    eu vou ter que informar todo
    o endereçamento de pasta
  • 9:43 - 9:48
    e esse endereçamento vai variar
    entre sistemas operacionais.
  • 9:48 - 9:52
    A forma mais fácil, então, é utilizar
    os comandos de navegação de terminal,
  • 9:52 - 9:56
    como CD, para poder
    navegar pelos diretórios
  • 9:56 - 9:59
    e, chegando no diretório
    que tem o Dockerfile,
  • 9:59 - 10:04
    simplesmente executar o "docker build"
    com o ponto no final.
  • 10:04 - 10:09
    Executando, então, o processo de build,
    várias coisas vão ser executadas.
  • 10:09 - 10:12
    A primeira delas é todo
    o download de imagens,
  • 10:12 - 10:18
    seguido da construção das aplicações,
    e todo o teste de funcionamento
  • 10:18 - 10:21
    para ver se o comando inicial
    vai ser executado com sucesso.
  • 10:21 - 10:28
    Caso você possua alguma falha nesse processo,
    você pode recorrer ao "docker logs".
  • 10:28 - 10:32
    Esse é um comando que nos permite
    checar logs do ambiente Docker.
  • 10:32 - 10:37
    Inclusive é legal que você pode utilizar
    ele para checar logs individualmente
  • 10:37 - 10:38
    de cada container.
  • 10:38 - 10:40
    Com o processo de build concluído,
  • 10:40 - 10:45
    o Docker sempre vai perguntar se você não
    quer fazer um scan de vulnerabilidades.
  • 10:45 - 10:48
    Nesse caso, não
    vai ser preciso.
  • 10:48 - 10:53
    A única coisa que nos falta, agora, é colocar,
    justamente, esse container em execução.
  • 10:53 - 10:56
    Para isso, nós vamos recorrer
    ao comando "docker run",
  • 10:56 - 11:00
    só que, dessa vez, eu vou ter que passar
    alguns parâmetros de execução para ele.
  • 11:00 - 11:03
    O primeiro parâmetro vai
    ser justamente para garantir
  • 11:03 - 11:07
    que essa imagem vai ficar
    em execução o tempo todo.
  • 11:07 - 11:10
    Para isso, vou utilizar o "-d".
  • 11:10 - 11:17
    Enquanto o segundo parâmetro, "-p", vai ser
    para informar o apontamento de portas de rede,
  • 11:17 - 11:22
    dessa forma, todo o conteúdo da minha
    aplicação vai ficar disponível para acesso.
  • 11:22 - 11:25
    Para executar, então, o container
    que nós acabamos de criar,
  • 11:25 - 11:28
    eu vou fazer um "docker run",
  • 11:31 - 11:33
    "-d",
  • 11:33 - 11:36
    "-p", para informar a porta,
  • 11:36 - 11:44
    e, nesse caso, eu expus a porta 3000,
    então eu vou utilizar "3000 : 3000".
  • 11:44 - 11:50
    A razão de eu ter que repetir o 3000 duas vezes
    é porque eu estou falando de duas portas,
  • 11:50 - 11:56
    a primeira é a porta na minha máquina base
    e a segunda é a porta do meu container.
  • 11:57 - 12:02
    Se eu especifico, por exemplo, a primeira
    porta, que é a da máquina base, como 80,
  • 12:02 - 12:08
    ela vai apontar um acesso realizado
    na porta 80 do meu servidor base
  • 12:08 - 12:11
    para a porta 3000
    do meu container.
  • 12:12 - 12:15
    Isso é algo que nós temos
    que prestar bastante atenção.
  • 12:15 - 12:18
    Às vezes, quando nós
    vamos criar uma aplicação,
  • 12:18 - 12:22
    nós temos vários containers
    que têm exposta a porta 80
  • 12:22 - 12:27
    e eu posso apontar diversas portas
    para dentro desses containers,
  • 12:27 - 12:31
    utilizando numerações
    diferentes no meu host base.
  • 12:31 - 12:37
    O próximo passo, então, é informar o nome
    da minha imagem, nesse caso, "ola".
  • 12:37 - 12:42
    Colocando a imagem em execução, eu
    vou receber o código de validação dela
  • 12:42 - 12:45
    e, se eu executar um "docker ps",
  • 12:45 - 12:49
    note que essa minha imagem
    já se encontra em execução
  • 12:49 - 12:56
    e me informando que a porta 3000 está
    apontando para a porta 3000 do container.
  • 12:56 - 12:59
    O último passo, então,
    é abrir o navegador web
  • 12:59 - 13:04
    e acessar, justamente, a nossa
    máquina na porta 3000.
  • 13:04 - 13:11
    O IP que eu informei aqui, 127.0.0.1,
    é o que se chama de local host,
  • 13:11 - 13:14
    ele representa a própria
    máquina na rede.
  • 13:14 - 13:20
    Outra forma que você teria era escrever
    por extenso "local host: 3000".
  • 13:20 - 13:25
    Qualquer uma das duas formas já faria com que
    toda a interface funcionasse normalmente.
  • 13:25 - 13:28
    No nosso caso, após
    acessar a aplicação,
  • 13:28 - 13:33
    todo o código que nós criamos e compilamos
    já está aqui disponível para uso
  • 13:33 - 13:40
    e eu consigo, por exemplo, ir adicionando
    itens dentro dessa minha aplicação.
  • 13:40 - 13:42
    Esse é um exemplo
    de uma aplicação bem simples,
  • 13:42 - 13:47
    só para nós entendermos como é que eu
    começo a construir todo esse ambiente.
  • 13:47 - 13:50
    A partir de agora, você pode
    utilizar esses conhecimentos
  • 13:50 - 13:54
    para começar a containerizar
    as suas próprias aplicações
  • 13:54 - 13:58
    e, com isso, entender um pouco mais
    como todo esse ecossistema funciona.
Title:
CLS CAP09 2022 VA08 DOCKERFILE
Video Language:
Portuguese, Brazilian
Duration:
14:03

Portuguese, Brazilian subtitles

Incomplete

Revisions Compare revisions