Salve, beleza? Continuamos a saca aqui no nosso Docker, nosso módulo de Docker. Agora, a gente vai pegar aquele run-c que nós falamos na aula passada, que é o run-containers, e fazer o uso dele diretamente ali, porque vai ser importante para entender o que está acontecendo por debaixo dos panos quando a gente roda um container para valer. Porque no primeiro capítulo, a gente estava simulando ali um container para valer. Porque no primeiro capítulo, a gente estava simulando ali um container do zero. Mas quando, normalmente, a maioria dos ferramentas que a gente tem hoje vai usar esse runc por debaixo dos panos. Então, bora lá para o VS Code. Eu tenho aqui mais a descrição do que a gente vai ver aqui na aula. Inclusive, esse runc, ele está ali no container D, que a gente vai ver mais especificamente ao trabalhar com o Docker. E ele também está no CRI, a sua, que é o padrão ali para o Kubernetes. Na Kubernetes você vai ver mais para a frente aqui nesse modo. Então esse RunC, como eu mostrei na última aula, ele pode ser instalado aí no seu Linux, tranquilamente. Só seguir aqui o que está presente, mas como eu estou utilizando o Ubuntu, eu vou até iniciar o meu Ubuntu aqui, ele já vem dentro do Ubuntu. Se você tiver numa distribuição Debian, por exemplo, que não tem, aí você pode fazer o apt install runc. Então, vamos lá. Estamos aqui. Então, a gente vai trabalhar com a seguinte ideia. Porque eu quero prover um container, é como se a gente estivesse provendo ali um sistema operacional inteiro. Então, a gente vai usar aquele userland, porque sempre quando você pegar um container, depois que a gente começar a trabalhar com o Docker, a gente vai baixar uma imagem e vai ter a UserLand lá dentro. Às vezes, essa UserLand é mais focada em um Alpine, em um outro Linux qualquer, mas sempre você vai ter ali aquelas pastas que a gente está acostumado a ver no Linux. Então, faz o download com o wget, depois faz a descompactação. Aí a gente vai fazer o seguinte, vamos pegar aqui o nosso projeto, vou rodar runc, só para ver se está tudo ok. Então, eu tenho aqui os comandos, eu posso criar um container, excluir containers, fazer a execução de algo dentro de um container, enfim, então o runc consegue fazer essa gerência básica do que a gente precisa para poder trabalhar. A gente vai rodar aqui o comando runc spec. Agora, nós vamos ver que foi gerado um config.json. Vamos usar aqui o vim para poder inspecionar esse arquivo. Esse arquivo a gente pode definir como se fosse o contrato de como que esse container tem que ser criado, o padrão de mercado, que está ali na OCI, na Open Container Initiative. Então, nós temos a versão que a gente está usando aqui da especificação da OCI, e aqui em Process, como que esse container tem que ser criado. Então, isso aqui vai definir tudo. Então, ele vai ter o modo terminal, nós podemos definir lá dentro qual vai ser o usuário padrão que nós vamos utilizar ali, quando, por exemplo, abrir o terminal do container, qual vai ser o usuário que vai estar lá? Qual o argumento que vai abrir ali o container? Variáveis de ambiente, aqui é o padrão, porque a gente tem que colocar o srbin, o srlocalbin, enfim. O cwd, que é qual o diretório, que é o diretório de trabalho, qual o diretório, que é o diretório de trabalho, o diretório corrente que nós queremos trabalhar. Às vezes eu quero já jogar para uma pasta específica. Então, toda vez que eu abrir o terminal, ele vai abrir nessa pasta específica. Tudo que ele fizer ali por default, faria nessa pasta. Aí vem aqui os Linux Capabilities, que são as permissões do que esse container vai ter ou não. Inclusive, você pode até dar uma olhadinha, eu coloquei um link aqui embaixo, aqui nas fontes, na documentação das Capabilities. Assim, a gente consegue fazer uma série de permissões para ver o que esse container pode fazer ou não. Por exemplo, a gente pode pegar uma capability dizendo se ele vai ter disponibilidade para poder rodar se eu tenho um usuário que está abaixo ali do mil, ele tem disponibilidade para poder rodar o processo na porta 80, porque você tem que ter uma permissão elevada para poder fazer isso. E aí tem outras permissões também do que você pode ou não fazer em cima do Linux. Então, nós temos a divisão aqui entre esse bounding, o permitted e o ambient. Eles definem o que está disponível, o que está aplicado, o que está permitido. Eu coloquei essas informações aqui também. Eu coloquei aqui um exemplo. Então, nós informações aqui também. Vou colocar aqui um exemplo. Então, nós temos aqui embaixo, deixa eu ver se eu coloquei. O balde define as capacidades que estão disponíveis em uma árvore de processos. As efetivas definem as capacidades ativas para um processo durante a execução, que está disponível para ele ou não. As permitidas, o conjunto permitido é um conjunto intermediário entre o balde e o conjunto efetivo. Ele define as capacidades que um processo pode adquirir, mas ainda não estão ativas. Enfim, então, isso aqui funciona no Linux de uma forma geral. Tem essa que eu coloquei, por exemplo, é o CapNetBindService, que permite se um processo escute uma porta abaixo de 1024, somente se você tiver ali uma permissão elevada que você consegue fazer isso. Então, isso aqui vai definindo uma série de coisas. Tem o hostname também, como eu estou dentro do namespace, eu consigo, como se eu estivesse rodando uma máquina, eu tenho um nome de máquina, que inclusive depois eu posso colocar uma rede virtualizada que os vários containers vão se encontrar através desse nome. E tem os pontos de montagem. Então, eu tenho montagem aqui do PROC, do DEV, e os vários outros, filas de mensagem, Cgroups também, tem as montagens e os namespaces que a gente está fazendo isolamento. Então, lembra que aquilo que a gente aprendeu aqui, ele já está vai ativar ali com onshare, o PID, o network, então ele está isolando já um monte de coisas, enfim, então ele está isolando já um monte de coisas, enfim. Então, pronto. O que a gente vai fazer aqui vai ser o diretório que nós vamos montar. Cadê o diretório? Aqui, ó. Ele já reconheceu por padrão ali o rootfs, mas aqui eu tenho que colocar o caminho completo. Então, vou colocar barra home, barra luiz, barra o diretório que ele vai montar, ou seja, que ele vai fazer ali o change root. Pronto. Agora, para poder rodar um container, a gente vai usar o sudo, porque ele precisa de fazer aquela habilitação de namespace, que senão ele vai dar uma mensagem. E a gente vai rodar o runc, run, e aí pode ser qualquer nome que você quiser, que vai ser aqui o nome do container. Então, estou colocando um hello world. Pronto. Já estou dentro e aqui ele já faz aquelas montagens ali. Eu posso colocar o barra mount aqui. Está vendo que ele não tem a montagem, eu não consigo ver a montagem do meu sistema global. Estou aqui dentro do meu namespace. Se eu fizer um PSAux, só vou conseguir ver os processos que estão rodando aqui dentro do meu namespace, se eu fizer um PS-AUX, só vou conseguir ver os processos que estão rodando aqui dentro. Então, tem o SH, que é esse que eu executei, que ele estava lá com aquele SH, lembra que eu falei o que ia acontecer, eu poderia mudar para o Bash se eu quisesse. Então, tem os QSpeeds baixinhos. E a gente vai ver mais uma vez, inclusive acho que eu tinha deixado aquele script da aula passada rodando aqui. Vamos rodar aqui um ps-aux. E a gente vai ver aqui... Vamos rodar um Python, para poder ficar mais fácil. Barra o sr. para poder ficar mais fácil, //usr o problema de executar dentro de VM é que às vezes o terminal fica bugado aqui. Iniciei o Python então a gente vai ver a mesma coisa. Então, grep python. Está aqui. O pid é alto, porque a gente está vendo no contexto global, mas ele está sendo executado também como um processo. Então, na verdade, no final das contas, o container é um processo que está totalmente numa jaula. A gente pode chegar aqui também, por exemplo, fazer um sudo runc list. Nós conseguimos ver os containers que estão não necessariamente só rodando, porque eu posso ter um container criado, mas eu tenho um ID para ele, então sempre um container vai ter um ID, não pode ter dois containers com o mesmo nome, com o mesmo ID. Qual é o PID que ele está rodando na minha máquina? PID que ele está rodando na minha máquina, é porque olha só, comparando aqui com a parte de cima, o 5672 não é o que está rodando o Python. Então, tem o container rodando num processo, mas o Python está rodando num outro processo mais dentro daquele namespace. O status está running de onde que a gente está rodando da nossa máquina aqui, e ele pertence ao root, porque a gente não fezando da nossa máquina aqui. E ele pertence ao root, porque a gente não fez nenhuma delimitação para poder colocar o usuário não root. Isso aí a gente conversa mais para frente no curso. Então, olha que interessante. E dessa forma que está aqui, como ele já fez isolamento de rede, por exemplo, se eu rodasse um servidor web com Python, com Java aqui, eu não conseguiria ver fora, a não ser que eu fizesse um byte, porque a minha rede também aqui está sob o domínio do namespace local. A gente vai vendo isso mais com o doc, mas isso aqui é muito esclarecedor. Com o Run-C, como a gente já tinha visto, nós podemos fazer várias coisas com o Content. Então, eu poderia executar os containers sem ter que instalar a Docker na nossa máquina, mas a gente vai entender os benefícios de utilizar essa ferramenta. Show de bola, pessoal. Então, vamos evoluir nossa saga. É isso aí. E até a próxima.