Namespaces
Namespaces foram adicionados no kernel Linux na versão 2.6.24 e são eles que permitem o isolamento de processos quando estamos utilizando o Docker.
-
PID namespace: Permite que cada container tenha seus próprios identificadores de processos.
-
Net namespace: Permite que cada container possua sua interface de rede e portas. Para que seja possível a comunicação entre os containers, é necessário criar dois Net Namespaces diferentes, um responsável pela interface do container (normalmente, chamada de
eth0) e outro responsável por uma interface do host, normalmente chamada deveth*(veth + um identificador aleatório). Essas duas interfaces estão “linkadas” através da bridgeDocker0no host, que permite a comunicação entre containers através de roteamento de pacotes. -
Mnt namespace: É a evolução do
chroot. Permite que cada container possa ser o dono do seu ponto de montagem, bem como de seu sistema de arquivos raiz. Ele garante que um processo rodando em um sistema de arquivos não consiga acessar outro sistema de arquivos montado por outro Mnt namespace. -
IPN namespace: Provê um SystemV IPC (Comunicação Interprocessual) isolado, além de uma fila de mensagens POSIX própria.
-
UTS namespace: Responsável por prover o isolamento de hostname, nome de domínio, versão de SO, etc.
-
User namespace: Mantém o mapa de identificação de usuários em cada container.
Usando os Namespace em uma VM
Section titled “Usando os Namespace em uma VM”Criando um container sem usar o Docker, só com Namespaces.
Executar os comandos abaixo em uma VM.
Instalação do debootstrap
Section titled “Instalação do debootstrap”O debootstrap é uma ferramenta que irá instalar um sistema base Debian em um subdiretório de outro sistema já instalado.
apt-get install debootstrap -yUso do debootstrap
Section titled “Uso do debootstrap”O debootstrap faz o download de um sistema base no diretório indicado no comando.
debootstrap stable /debian http://deb.debian.org/debianstable: Versão do Debian/debian: Diretório de destinohttp://deb.debian.org/debian: Endereço do repositório
Comando unshare
Section titled “Comando unshare”O comando unshare executa um programa com alguns namespaces não compartilhados do processo pai.
unshare --mount --uts --ipc --net --map-root-user --user --pid --fork chroot /debian bash--mount: Isola o namespace de montagens--uts: Isola o namespace UTS (hostname, etc.)--ipc: Isola o namespace de IPC do SystemV--net: Isola o namespace de rede--map-root-user: mapeia usuário atual para root--user: Isola o namespace do usuário--pid: Isola o namespace do pid--fork: faz um fork antes de executar o<programa>chroot /debian bash: Ochrootaltera o diretório raiz do host para que os arquivos que estão no diretório /debian quando executado pelo bash no ambiente isolado.
No ambiente isolado, para conseguir visualizar os processos, é necessário montar o diretório /proc.
mount -t proc none /procTambém é interessante montar os diretórios /sys e /tmp que são utilizados por sistemas Linux.
mount -t sysfs none /sysmount -t tmpfs none /tmpListar as Namespaces
Section titled “Listar as Namespaces”No host, para listar as namespaces utilizadas, use o comando lsns.
A saída do comando será semelhante à abaixo:
NS TYPE NPROCS PID USER COMMAND4026531834 time 108 1 root /sbin/init4026531835 cgroup 108 1 root /sbin/init4026531836 pid 107 1 root /sbin/init4026531837 user 106 1 root /sbin/init4026531838 uts 104 1 root /sbin/init4026531839 ipc 106 1 root /sbin/init4026531840 net 106 1 root /sbin/init4026531841 mnt 103 1 root /sbin/init4026532163 mnt 1 300 root ├─/usr/lib/systemd/systemd-udevd4026532164 uts 1 300 root ├─/usr/lib/systemd/systemd-udevd4026532291 mnt 1 592 root ├─/usr/lib/systemd/systemd-logind4026532292 uts 1 592 root └─/usr/lib/systemd/systemd-logind4026531862 mnt 1 25 root kdevtmpfs4026532230 user 2 10557 root unshare --mount --pid --net --map-root-user --user --uts --fork --ipc chroot /debian bash4026532231 mnt 2 10557 root unshare --mount --pid --net --map-root-user --user --uts --fork --ipc chroot /debian bash4026532232 uts 2 10557 root unshare --mount --pid --net --map-root-user --user --uts --fork --ipc chroot /debian bash4026532233 ipc 2 10557 root unshare --mount --pid --net --map-root-user --user --uts --fork --ipc chroot /debian bash4026532234 pid 1 10558 root └─bash4026532235 net 2 10557 root unshare --mount --pid --net --map-root-user --user --uts --fork --ipc chroot /debian bashSaiba mais
Section titled “Saiba mais”namespaces(7) — Linux manual page
Isolate containers with a user namespace
What Are Namespaces and cgroups, and How Do They Work?