Como economizar dinheiro na compra de um laptop: Docker Remote API via TLS

Mais recentemente, decidi comprar um laptop pessoal. O desenvolvimento de um projeto de código aberto ( aplicativo para Flipper ) e a mudança de local de trabalho me obrigaram a não usar mais meu laptop de trabalho para fins pessoais. E aqui já era uma pena dar o custo do Hyndai Solaris suportado para um laptop (no trabalho eu tenho uma configuração de ponta de MacBooks de 16 "). Portanto, foi decidido moderar meu ardor e comprar o MacBook Air 13" mais barato e desonesto por 80 mil rublos. No entanto, no mac Docker consome uma quantidade exorbitante de recursos, então, após a compra, tive que pensar em como resolver esse problema. A ideia surgiu imediatamente para colocar o Docker Engine em algum lugar online. Não antes de dizer que acabou.











Ajuste do servidor



Instalando Docker Engine no servidor



A sobrecarga do docker no Linux é mínima. O Docker no Mac é executado em uma máquina virtual Linux, enquanto no Linux ele usa diretamente o kernel do host. Você pode ler mais sobre isso aqui .



Como um pequeno ping é importante para nós, faz sentido comprar um hosting em Moscou, mas não há muita diferença.



Total: Linux, Moscou, as características dependem de suas necessidades.

Existe apenas uma tarifa pré-fabricada barata para isso em ruvds.com . Também em ruvds.com é possível solicitar uma configuração imediatamente com Docker CE a bordo. Uma bagatela, mas legal.



Procure uma senha e faça login na interface web de sua hospedagem e conecte-se.







Em seguida, instale o Docker. Há uma excelente instrução aqui , abaixo darei brevemente os comandos a partir dela (se de repente você não tiver sudo, não se esqueça de instalá-la apt-get install sudopor baixo su):



sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io


Vamos verificar o trabalho do docker:



docker run hello-world




Gerando chaves



Primeiro você precisa gerar chaves SSL. Você pode seguir o caminho fácil e difícil. Para obter instruções sobre o caminho físico (canônico), consulte a documentação do Docker . Mas boas pessoas colocaram tudo em um contêiner de <10 MB.



Vamos criar uma pasta para o início, onde guardaremos tudo. As pastas podem ser qualquer coisa. O primeiro ( /etc/docker/ssl) armazena as chaves secretas, o segundo ( ~/.docker) as chaves de acesso.



sudo mkdir -p /etc/docker/ssl
mkdir -p ~/.docker


Primeiro, vamos criar certificados de cliente e CA na pasta local



docker run --rm -v ~/.docker:/certs \
    paulczar/omgwtfssl


Vamos criar certificados de servidor usando a CA gerada acima. Especifique ali, separado por vírgulas, o IP por meio do qual você acessará o servidor. No nosso caso, não se esqueça de especificar aí o IP do seu servidor!



sudo cp ~/.docker/ca.pem /etc/docker/ssl/ca.pem
chown -R $USER ~/.docker
docker run --rm -v /etc/docker/ssl:/server \
    -v ~/.docker:/certs \
    -e SSL_IP=127.0.0.1,172.17.8.101,YOUR_IP \
    -e SSL_DNS=docker.local -e SSL_KEY=/server/key.pem \
    -e SSL_CERT=/server/cert.pem paulczar/omgwtfssl


Configurando o docker daemon



A principal tarefa neste estágio é enviar os argumentos da linha de comando com os parâmetros de que precisamos ao iniciar o docker. Como você faz isso não é importante, no Ubuntu você pode fazer assim:



1. Edite o arquivo com o /etc/default/dockerseu editor favorito



nano /etc/default/docker


E adicione a variável `DOCKER_OPTS` ao final. Não se esqueça de inserir seu IP externo lá




DOCKER_OPTS="-H=YOUR_IP:2376 -H unix:///var/run/docker.sock --tlsverify --tlscacert=/etc/docker/ssl/ca.pem --tlscert=/etc/docker/ssl/cert.pem --tlskey=/etc/docker/ssl/key.pem"


2. Adicione argumentos para iniciar o serviço. No Ubuntu, o arquivo de parâmetro de inicialização é /lib/systemd/system/docker.service. Adicione uma linha à subseção [Service]:



EnvironmentFile=/etc/default/docker


E mudamos o comando de inicialização lado a lado:



ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS


Sim, o ponto 1 era opcional, os argumentos do comando poderiam ser inseridos aqui, mas são muitos e é inconveniente ter um comando grande para rodar no arquivo de serviço.



3. Reinicie o daemon



sudo systemctl daemon-reload
sudo systemctl restart docker


4. Verifique nos logs do daemon se tudo funciona:



journalctl -u docker.service -f




5. Vamos tentar conectar via tls:



export DOCKER_HOST=tcp://YOUR_IP:2376
export DOCKER_TLS_VERIFY=1
export DOCKER_CERT_PATH=~/.docker
docker info




Trabalhando!



Configurando no cliente



Antes de iniciar a configuração dos clientes, você precisa baixar a pasta de certificados para o seu computador. Você pode fazer isso de qualquer maneira conveniente. Por exemplo, via `scp`:



Em uma máquina remota:



mkdir /tmp/cert-for-docker && cp -v ~/.docker/{ca,cert,key}.pem /tmp/cert-for-docker


Na máquina local:



scp -r root@YOUR_IP:/tmp/cert-for-docker ~/.docker


Em seguida, use esta pasta para configurar seu cliente docker.



Mac OS CLI



Aqui a configuração se resume ao fato de que você precisa registrar as variáveis ​​em seu ambiente e tudo funcionará. No entanto, surge a pergunta: “Onde posso conseguir um cliente nu? Não precisamos do cliente oficial de peso pesado de 2 GB que vem com o Docker Engine, precisamos? "



Existe uma solução! O Docker moderno há muito foi dividido em partes de cliente e servidor. Você pode baixar binários de cliente separados compilados para macos. As instruções oficiais estão aqui , mas darei um pequeno trecho aqui:



1. Baixe os binários mais recentes ou aqueles correspondentes ao seu servidor (você pode puxá-los com um comando docker info) do link e descompactar

2. Copie os binários para a pasta /usr/local/bin/para funcionar globalmente:

sudo cp docker/docker /usr/local/bin/


3. Registramos em ~/.bashrcou as ~/.zshrcvariáveis ​​de ambiente necessárias. Não se esqueça de inserir seu IP e o caminho para a pasta com os certificados :

export DOCKER_HOST=tcp://YOUR_IP:2376
export DOCKER_CERT_PATH=PATH_TO_CERT
export DOCKER_TLS_VERIFY=1


4. Reinicie o computador (Schaub com certeza), verifique:



docker info
docker run hello-world




Beleza!



IDEs Jetbrains (PyCharm, IDEA, Android Studio etc)



Os estúdios Jetbrains suportam docker via tls fora da caixa. Esta configuração está localizada em Preference->Build, Execution, Deployment->Docker->+. Você precisa selecionar TCP sockete inserir seus dados lá. No entanto, há um porém.





Se tudo for feito conforme planejado, ocorrerá um erro:

Resposta de erro do daemon: o cliente enviou uma solicitação HTTP para um servidor HTTPS.

erros bonita impressão informação
Ou

Não é possível conectar: ​​Status 400: o cliente enviou uma solicitação HTTP para um servidor HTTPS
É necessário prescrever explicitamente ao nosso estúdio o protocolo que usamos https:

YOUR_IP : 2376
Tudo deve funcionar bem depois.



Bônus (Portainer)



A fim de controlar com eficácia os containers em execução e já usados, instalei o Portainer neste servidor. Deve ser colocado em duas linhas:



docker volume create portainer_data
docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce


Depois disso, uma YOUR_IP:9000bela interface da web será suspensa e você poderá ver os contêineres em execução e desativados. Lembra como começamos hello-world? Ele está aqui e você pode limpá-lo diretamente na interface.





O próprio Portainer pode ser conectado a qualquer máquina Docker e gerenciar os contêineres docker de todas as suas máquinas em um só lugar. A métrica (Grafana + Prometheus + Alertas) pode ser configurada facilmente com dois comandos (não se esqueça de instalar gi e docker-compose):



git clone https://github.com/stefanprodan/dockprom && cd dockprom
ADMIN_USER=admin ADMIN_PASSWORD=admin docker-compose up -d








Apenas para armazenamento, você precisa mudar sum(node_filesystem_free_bytes{fstype="aufs"})parasum(node_filesystem_free_bytes{fstype="ext4"})







Conclusão



Quando comprei um laptop, não cedi à esperança de que fosse suficiente para mim para qualquer tarefa, principalmente porque seria o suficiente para o desenvolvimento Java / Android. Mas fiquei agradavelmente surpreso, até agora todos os meus projetos, pessoais e apenas de código aberto, voam no IDE. No entanto, percebi que, apesar de todo o meu amor por esta máquina de escrever, ela não tiraria o Docker. Fiquei muito feliz por tê-lo configurado uma vez em um servidor docker remoto. Durante o processo de desenvolvimento, é absolutamente imperceptível que o servidor não seja local. Não sinto nenhuma restrição, executar o Docker sem a Internet da mesma forma antes de fazer pouco sentido. Em geral, estou muito satisfeito. -1 razão para comprar um laptop poderoso e pesado.



Além disso, a sobrecarga do Docker para Linux é mínima, então você pode alugar um carro por 240 rublos por mês na RuVDS na Rússia (e com um desconto usando o código promocional HABR-10% e até menos) e não se preocupe com o ping e o impacto dos aplicativos de servidor na IU. Além disso, há um IP externo (a capacidade de mostrar aos clientes e manter o desenvolvedor), uma VPN privada e confiabilidade de primeira classe. No geral, estou satisfeito.



Recursos:



  • Artigo de 2016 sobre personalização para CoreOS
  • API Docker Remote sem criptografia
  • Site do Docker e todos os recursos vinculados no próprio artigo









All Articles