Já
vos aconteceu usarem a instalação mínima e não terem ferramentas como o
VI ou o Ping?! E depois reconfigurar a rede sem estas ferramentas?!
Aqui ficam alguns comandos rápidos para desenrascar:
Trago aqui um caso prático que me deparei esta semana. Aumentar um volume (VG - Volume Group) que contém 2 discos, ou seja, 2 Physical Volumes, onde um deles é uma partição e o outro é o disco inteiro:
vg-01 = /dev/sda2 (49GB) + /dev/sdb (151GB)
Podemos ver obter a informação acima com o comando pvdisplay.
Existem 3 tipos de rede por defeito no Docker: Bridge, None e Host.
Bridge - docker run ubuntu
O
Docker cria esta rede privada interna por defeito no anfitrião (host,
máquina virtual ou computador físico onde está a correr o Docker) e
todos os containers obtêm um IP interno normalmente na gama 172.17.x.x.
Os containers ligam-se uns aos outros usando esta rede interna.
Para
as redes externas se ligarem a estes containers é preciso mapear portos
de rede entre si (anfitrião:80 <-->container:8080).
None - docker run ubuntu --network=none
Os containers estão desligados de qualquer rede estando completamente isolados.
Host - docker run ubuntu --network=host
Outra forma de redes externas obterem acesso aos containers é associar o
container à rede do anfitrião quebrando-se desta forma o isolamento que
existe entre o anfitrião e o container. Assim, qualquer aplicação a
correr no container num porto qualquer fica imediatamente exposto ao exterior no
mesmo porto.
Por
defeito o Docker cria uma rede interna para os containers comunicarem
entre si na gama 172.17.x.x. É possível criar outra rede interna, noutra
gama, com o seguinte comando:
Os
containers conseguem comunicar entre si usando o seu nome que por sua
vez é um nome DNS no servidor de nomes embebido no Docker.
Quando
queremos que uma aplicação num container, aceda a outra noutro
container, no mesmo Docker Host, podemos usar o IP interno (por exemplo:
172.17.0.3 <--> 172.17.0.8). Mas a forma mais correta é usar o
nome do container, uma vez que ao reiniciar o container, este pode não
assumir o mesmo IP.
O servidor DNS embebido no Docker é executado com o IP 127.0.0.11.
Deixo aqui alguns dos comandos (básico) mais usados no Docker:
$ docker ps
$ docker ps -a
$ docker rm CONTAINER
$ docker rmi IMAGEM
$ docker run ubuntu
# -it disponibiliza uma shell interativa $ docker run -it ubuntu $ docker run -it ubuntu bash
$ docker run -d centos sleep 500
$ docker images
$ docker pull nginx
$ docker run -d ubuntu sleep 500
$ docker exec CONTAINER_ID cat /etc/*release*
$ docker stop $(docker ps -aq)
$ docker rm $(docker ps -aq)
$ docker run -i CONTAINER
# -p mapeia o porto 80 do anfitrião para o 5050 do container nginx $ docker run -p 80:5050 nginx $ docker run -p 3306:3306 mysql
# Executa o container mysql mapeando a dir /var/lib/mysql na dir /dados/mysql do anfitrião(host), de forma a persistir os dados: $ docker run -v /dados/mysql:/var/lib/mysql mysql
# Obter informações do container no formato json: $ docker inspect CONTAINER
Não duvidem que a grande maioria das aplicações que acedemos via internet está assente em Kubernetes. No seguimento do estudo que tenho vindo a fazer, deixo mais abaixo uma lista dos comandos mais usados e a sua função.
Nota:Esta lista estará em constante atualização.
Comandos relativos à criação do cluster com o Minikube:
$ minikube start #Cria um cluster com 1 nó. $ minikube start --nodes 2 -p multinode-cluster $ minikube status $ minikube ip $ minikube ssh $ minikube dashboard #Dashboard web que mostra alguns dados. $ minikube logs $ minikube delete #Remove o cluster. $ minikube delete --purge #Remove o cluster e todos os ficheiros associados.
$ minikube tunnel - Cria uma rota de rede para o IP do cluster como se fosse um gateway. Para testar por exemplo um serviço a correr em LB.
### Get informação $ kubectl get pods $ kubectl get namespaces #Ver os vários NS existentes. $ kubectl get namespaces $ kubectl get pod -n Development #Ver os pods do NS Development. $ kubectl get pods -A #Ver todos $ kubectl get pods -A -o wide #Devolve mais informação como o IP, etc. $ kubectl get pods NOME_DO_POD -o yaml/json # ver dados do pod em yaml/json. $ kubectl cluster-info $ kubectl get nodes $ kubectl get pod meuPod -o jsonpath='{.spec.containers[*].name}' #Devolve o nome dos containers que estão no Pod meuPod. $ kubectl describe pod meuPod #Toda a informação sobre o Pod, numero de containers, estado, etc. $ kubectl replace --force -f meuPod.yaml #Elimina e cria um novo pod.
### Criar um pod básico $ kubectl run meuNginx --image nginx #Cria um pod com um container a partir da imagem nginx. $ kubectl delete pod meuNginx
### Criar pods a partir de um manifesto yaml
$ kubectl apply -f podTemplate.yaml #Cria um pod a partir do manifesto yaml. $ kubectl delete -f podTemplate.yaml #Elimina o pod baseado no seu manifesto $ kubectl get pod meuPod -o yaml > podTemplate.yaml $ kubectl run meuNginx --image nginx --dry-run=client -o yaml > podTemplate.yaml #Cria um modelo yaml que servirá para criar um pod. $ kubectl run meuPod --image=redis --dry-run=client -o yaml #Outro exemplo $ kubectl run meuNginx --image nginx --port 80 --dry-run=client -o yaml > podTemplate.yaml #Cria um modelo yaml especificando o porto que fica à escuta no container.
$ kubectl expose pod meunginx #Este comando cria um Service, que é utilizado para expor o pod para ser acessivel externamente. $ kubectl get services #Ver os serviços ativos com respectivos IP e portos.
### Mais Get: $ kubectl get all
$ kubectl get pod,service
$ kubectl get pod,svc ### Eliminar o que se criou: $ kubectl delete -f podTemplate.yaml
$ kubectl delete service meuNginx $ kubectl run hello-minikube $ kubectl get pods -o jsonpath="{..image}" #Lista todas as imagens usadas nos containers no Default NS $ kubectl delete --all pods
### Labels e Selectors $ kubectl get all --show-labels $ kubectl get pod --selector env=prod
### Mais comandos (ainda em organização) $ kubectl cluster-info dump
$ kubectl delete pod pod-info-deployment-869667679b-6zbcd -n development
$ kubectl exec -it busybox-55fdb79844-chq95 -- /bin/sh #Entrar no Contentor busybox $ kubectl logs pod-info-deployment-869667679b-sz786 -n development
$ kubectl get svc - devolve o IP externo do cluster, por exemplo.
$ kubectl get deployment nginx-deplyment -o yaml $ kubectl api-resources $ kubectl -n kube-system get pods #Pods de sistema.
$ kubectl describe rs replica-set $ kubectl create -f podTemplate.yml #Cria um replica set. $ kubectl get replicaset $ kubectl delete replicaset minhaApp-replicaset. $ kubectl replace -f podTemplate.yml #Atualiza por exemplo o ReplicaSet no caso de pretendermos alterar o número de replicas. $ kubectl scale --replicas=6 -f podTemplate.yaml #O mesmo que o anterior, mas não é preciso editar antes o podTemplate.yml. $ kubectl scale replicaset meuApp-replicaset --replicas=6 #O mesmo que os anteriores. $ kubectl explain replicaset #Mostra a documentação do resource replicaset. $ kubectl edit rs meuApp-replicaset