< 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:24
    Para isso, nós vamos ter que utilizar
    algumas ferramentas.
  • 0:24 - 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:42
    Antes de mais nada, eu vou precisar
    pelo menos de algum código
  • 0:42 - 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:07
    Nesse caso, nós vamos
    utilizar um código em Node
  • 1:07 - 1:12
    e, justamente por isso, eu preciso utilizar,
    como base para a minha imagem,
  • 1:12 - 1:16
    uma imagem que já tenha um Node
    pronto para eu poder utilizar.
  • 1:16 - 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:30
    e disponibilize todo aquele
    ambiente montado para nós.
  • 1:30 - 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:35
    Eu preciso justamente prestar
    atenção em todos esses padrões
  • 2:35 - 2:38
    para que eu não impeça
    o Docker de achar o arquivo
  • 2:38 - 2:40
    e, assim, começar o processo
    de build da imagem.
  • 2:40 - 2:45
    Agora, como que 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 no dockerfile.
  • 3:02 - 3:07
    Pode ser que quando você criou o arquivo
    utilizando, por exemplo, o bloco de notas,
  • 3:07 - 3:12
    ele tivesse mostrado
    uma opção como txt.
  • 3:12 - 3:16
    Caso ele tenha aparecido como txt
    no final, basta apertar a tecla F2
  • 3:16 - 3:23
    e renomear o arquivo excluindo ".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:47
    definindo qual tipo de sintaxe nós estamos
    utilizando para construção desse arquivo.
  • 3:47 - 3:50
    Nesse caso, uma sintaxe de versão 1.
  • 3:50 - 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:03
    e tudo vai correr sem
    maiores problemas.
  • 4:03 - 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:22
    para poder criar exatamente
    o container da forma que você precisa.
  • 4:22 - 4:25
    Logo em seguida
    eu tenho um comando chamado FROM.
  • 4:26 - 4:28
    Esse comando serve para eu especificar
  • 4:28 - 4:31
    qual a imagem de base
    que eu vou estar utilizando.
  • 4:31 - 4:35
    Nesse caso, uma imagem chamada Node
  • 4:35 - 4:37
    na versão 12 ao painel.
  • 4:37 - 4:41
    É justamente aqui, por exemplo,
    que caso queira criar um container
  • 4:41 - 4:46
    totalmente do zero, utilizando
    só um sistema operacional de base,
  • 4:46 - 4:49
    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:57
    eu poderia fazer um from Ubuntu
    e nos comandos
  • 4:57 - 5:02
    que se seguem fazer todo o passo
    a passo de instalação do Apache.
  • 5:02 - 5:07
    Nesse caso, a gente já está reaproveitando
    parte da estrutura do Node
  • 5:07 - 5:11
    que já está pronta e aí
    eu só preciso rodar alguns poucos comandos
  • 5:11 - 5:14
    e copiar os meus arquivos
    para dentro do container.
  • 5:15 - 5:19
    Nosso próximo passo então é rodar a PK
  • 5:19 - 5:23
    Red pra
    garantir aí que eu tenho um Python dois,
  • 5:23 - 5:28
    o compilador C e o
    make dentro da minha máquina.
  • 5:28 - 5:30
    Nosso próximo passo então
  • 5:30 - 5:34
    vai ser criar um diretório de trabalho,
  • 5:34 - 5:36
    nesse caso chamado EPP.
  • 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:46
    Note que todo nosso conteúdo do arquivo
  • 5:46 - 5:49
    está dentro de uma pasta chamada EPP.
  • 5:49 - 5:53
    Dessa forma eu vou conseguir navegar
    para dentro dessa pasta,
  • 5:53 - 5:56
    utilizar ela como parte da padrão
    e a partir de
  • 5:56 - 5:59
    então começar a executar os demais
    comandos.
  • 5:59 - 6:05
    O comando copy serve justamente para
    copiar arquivos para dentro do container.
  • 6:05 - 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
    vou estar utilizando dentro do contêiner.
  • 6:15 - 6:16
    Por isso eu vou utilizar.
  • 6:16 - 6:20
    Ponto novamente
    e aqui vai vir um ponto bem interessante.
  • 6:20 - 6:25
    A cópia do arquivo não é exatamente
    uma boa prática, como a gente viu.
  • 6:25 - 6:28
    Se a gente não souber
    utilizar o armazenamento de arquivos
  • 6:28 - 6:33
    de forma correta, isso vai atrapalhar
    o bom funcionamento de um ponteiro.
  • 6:33 - 6:38
    A questão nesse caso é que,
    como eu estou criando um container novo,
  • 6:38 - 6:42
    eu preciso passar a 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:51
    já que eles vão passar
    a ser parte fundamental
  • 6:51 - 6:53
    de todo o container que eu estou criando.
  • 6:53 - 6:57
    O passo seguinte,
    então, é garantir que esse meu sistema
  • 6:57 - 7:01
    esteja utilizando o ambiente de produção.
  • 7:01 - 7:03
    Para isso,
    eu posso executar um Warning Stall.
  • 7:03 - 7:07
    Esse comando é um comando
    que pertence ao ambiente novo e serve
  • 7:07 - 7:10
    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 C MD,
  • 7:18 - 7:20
    que é basicamente uma forma de criar
  • 7:20 - 7:23
    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:34
    que o arquivo de origem da minha aplicação
    está dentro da pasta SCR
  • 7:34 - 7:35
    index.
  • 7:35 - 7:39
    E esse é exatamente
    o caminho que a gente checou agora a 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 novo de
    como executá lo.
  • 7:49 - 7:53
    Por fim, eu estou fazendo um ex
    pouso da porta 3000.
  • 7:53 - 7:56
    Esse comando serve justamente
    para eu informar
  • 7:56 - 8:00
    que eu vou ter que acessar
    uma porta desse conta e dessa forma,
  • 8:00 - 8:05
    na hora que eu for criar o container para
    colocá lo em execução, o Docker vai saber
  • 8:05 - 8:10
    que eu posso ter uma conexão de rede ali
    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
    O primeiro é a partir do comando run.
  • 8:19 - 8:22
    O run vai simplesmente executar
    aquela linha
  • 8:22 - 8:25
    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, sem MD,
    vão ser comandos que vão ser executados
  • 8:33 - 8:36
    posteriores à criação do meu container.
  • 8:36 - 8:38
    Dessa forma, quando eu crio lá o C.
  • 8:38 - 8:41
    MD chamando um comando novo
    e passando o index,
  • 8:42 - 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:53
    eu posso utilizar esses arquivos
  • 8:53 - 8:57
    para construir o meu container,
    utilizando então o prompt de comando.
  • 8:57 - 9:01
    Eu vou poder recorrer a uma função chamada
  • 9:01 - 9:03
    Docker build.
  • 9:03 - 9:07
    Esse comando é um comando bem simples
    e não tem muita coisa que a gente deve
  • 9:07 - 9:08
    configurar nele.
  • 9:08 - 9:13
    Nesse caso, por exemplo,
    a gente só vai nomear a imagem
  • 9:13 - 9:17
    e em seguida informar o endereço
    do Dockerfile que vai ser utilizado.
  • 9:17 - 9:20
    Para isso
    eu vou informar o menos ter seguido
  • 9:20 - 9:23
    do nome da imagem,
  • 9:24 - 9:26
    nesse caso vou chamar ela de Olá
  • 9:26 - 9:29
    e em seguida eu vou informar um ponto.
  • 9:29 - 9:34
    A função desse ponto
    é para informar que eu já estou na pasta
  • 9:34 - 9:38
    aonde eu tenho o Dockerfile,
    caso não esteja nessa pasta,
  • 9:38 - 9:44
    ao invés de informar o ponto eu vou ter
    que informar todo o endereçamento de pasta
  • 9:44 - 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
  • 9:52 - 9:56
    de terminal 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
    ou simplesmente executar o Docker build
    com o ponto no final.
  • 10:04 - 10:07
    Executando então o processo de build,
  • 10:07 - 10:09
    várias coisas vão ser executadas.
  • 10:09 - 10:12
    A primeira delas
    é todo download de imagens,
  • 10:12 - 10:16
    seguido da construção das aplicações
  • 10:16 - 10:20
    e todo o teste de funcionamento
    para ver se o comando inicial
  • 10:20 - 10:21
    vai ser executado com sucesso.
  • 10:21 - 10:24
    Caso você
    possua alguma falha nesse processo,
  • 10:24 - 10:28
    você pode recorrer ao Docker Logs.
  • 10:28 - 10:32
    Esse é um comando que permite a gente
    checar logo o ambiente Docker.
  • 10:32 - 10:36
    Inclusive é legal que você pode utilizar
    ele para checar logs
  • 10:36 - 10:41
    individualmente de cada contêiner
    com o processo de build concluído.
  • 10:41 - 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:50
    A única coisa que nos falta agora
  • 10:50 - 10:53
    é colocar justamente
    esse container em execução.
  • 10:53 - 10:56
    Para isso a gente vai 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 ao menos o D,
  • 11:10 - 11:13
    enquanto o segundo parâmetro menos p,
  • 11:13 - 11:17
    vai ser para informar o apontamento de
    portas de rede.
  • 11:17 - 11:20
    Dessa forma,
    todo o conteúdo da minha aplicação
  • 11:20 - 11:23
    vai ficar disponível
    para acesso para executar então
  • 11:24 - 11:29
    o container que a gente acabou de criar,
    eu vou fazer um Docker run
  • 11:29 - 11:33
    em menos de
  • 11:33 - 11:36
    menos P para informar a porta
  • 11:36 - 11:40
    e nesse caso eu expus a porta 3000.
  • 11:40 - 11:44
    Então vou utilizar 3002 pontos, 3000.
  • 11:44 - 11:46
    A razão de eu ter que repetir O31000
  • 11:46 - 11:50
    duas vezes
    é porque eu estou falando de duas portas.
  • 11:50 - 11:53
    A primeira é a porta na minha máquina base
  • 11:54 - 11:58
    e a segunda é a porta do meu container,
    que específico por exemplo,
  • 11:58 - 12:02
    a primeira porta,
    que é a da máquina base, como 80.
  • 12:02 - 12:05
    Ela vai apontar um acesso
  • 12:05 - 12:08
    realizado na porta 80 do meu servidor base
  • 12:08 - 12:12
    para a porta 3000 do meu container.
  • 12:12 - 12:15
    Isso é algo que a gente tem que prestar
    bastante atenção.
  • 12:15 - 12:18
    Às vezes,
    quando a gente vai criar uma aplicação,
  • 12:18 - 12:22
    a gente tem vários containers
    que tem expostas 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 rosto base.
  • 12:31 - 12:37
    O próximo passo então é informar o nome da
    minha imagem, nesse caso o LA
  • 12:37 - 12:39
    colocando a imagem em execução
  • 12:39 - 12:42
    eu vou receber o código de validação dela
  • 12:42 - 12:45
    e se eu executar um Docker PRS?
  • 12:45 - 12:49
    Note que essa minha imagem
    já se encontra em execução
  • 12:49 - 12:53
    e me informando que a porta 3000
    está apontando para a porta
  • 12:53 - 12:56
    3000 do contêiner.
  • 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:07
    O IP que eu informei aqui 127,0
  • 13:07 - 13:11
    ponto zero
    ponto um é o que se chama de local Rust.
  • 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 rows de 2,3000.
  • 13:20 - 13:21
    Qualquer uma das duas formas
  • 13:21 - 13:25
    já faria com que toda a interface
    funcionasse normalmente.
  • 13:25 - 13:28
    No nosso caso, após acessar a aplicação,
  • 13:29 - 13:33
    todo o código que a gente criou e compilou
    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:43
    Esse é um exemplo de uma aplicação
    bem simples,
  • 13:43 - 13:47
    só pra gente entender como é que eu começo
    a construir todo esse ambiente.
  • 13:47 - 13:51
    A partir de agora,
    você pode utilizar esses conhecimentos
  • 13:51 - 13:54
    para começar a renderizar
    as suas próprias aplicações
  • 13:54 - 13:58
    e com isso entender um pouco mais
    de 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