So sparen Sie beim Kauf eines Laptops Geld: Docker Remote API über TLS

In jüngerer Zeit habe ich mich für einen persönlichen Laptop entschieden. Die Entwicklung eines Open-Source-Projekts ( Anwendung für Flipper ) und der Wechsel des Arbeitsplatzes zwangen mich, meinen Arbeitslaptop nicht mehr für persönliche Zwecke zu verwenden. Und hier war es schon schade, die Kosten für den unterstützten Hyndai Solaris für einen Laptop anzugeben (bei der Arbeit habe ich eine Top-End-Konfiguration von 16 "MacBooks). Daher wurde beschlossen, meine Begeisterung zu mildern und das schurkisch billigste MacBook Air 13" für 80.000 Rubel zu nehmen. Auf dem Mac verbraucht Docker jedoch eine exorbitante Menge an Ressourcen. Nach dem Kauf musste ich mir überlegen, wie ich dieses Problem lösen kann. Die Idee kam sofort, die Docker Engine irgendwo online zu bringen. Gesagt, getan.











Server-Tuning



Installieren von Docker Engine auf dem Server



Der Docker-Overhead unter Linux ist minimal. Docker auf dem Mac läuft in einer virtuellen Linux-Maschine, während es unter Linux direkt den Kernel des Hosts verwendet. Mehr dazu lesen Sie hier .



Da ein kleiner Ping für uns wichtig ist, ist es sinnvoll, ein Hosting in Moskau zu kaufen, aber es gibt keinen großen Unterschied.



Insgesamt: Linux, Moskau, Eigenschaften hängen von Ihren Anforderungen ab.

Auf ruvds.com gibt es dafür nur einen günstigen, vorgefertigten Tarif. Auch auf ruvds.com ist es möglich, ein Setup sofort mit Docker CE an Bord zu bestellen. Eine Kleinigkeit, aber nett.



Suchen Sie nach einem Passwort und melden Sie sich auf der Weboberfläche Ihres Hostings an und stellen Sie eine Verbindung her.







Installieren Sie als Nächstes Docker. Es gibt eine ausgezeichnete Anweisung hier unten Ich werde kurz die Befehle geben (wenn Sie plötzlich es nicht haben sudo, vergessen Sie nicht , es zu installieren apt-get install sudounter 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


Lassen Sie uns die Arbeit von Docker überprüfen:



docker run hello-world




Schlüssel generieren



Zuerst müssen Sie SSL-Schlüssel generieren. Sie können dem einfachen und schwierigen Weg folgen. Anweisungen zum harten Pfad (kanonisch) finden Sie in der Docker-Dokumentation . Aber gute Leute haben alles in einen <10 MB Container gestopft.



Erstellen wir zunächst einen Ordner, in dem wir alles speichern. Ordner können alles sein. Das erste ( /etc/docker/ssl) speichert die geheimen Schlüssel, das zweite ( ~/.docker) die Schlüssel für den Zugriff.



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


Zuerst erstellen wir Client- und CA-Zertifikate im lokalen Ordner



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


Erstellen wir Serverzertifikate mit der oben generierten Zertifizierungsstelle. Geben Sie dort durch Kommas getrennt die IP an, über die Sie auf den Server zugreifen. Vergessen Sie in unserem Fall nicht, dort die IP Ihres Servers anzugeben!



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


Konfigurieren des Docker-Daemons



Die Hauptaufgabe in dieser Phase besteht darin, die Befehlszeilenargumente mit den Parametern zu versehen, die wir beim Starten von Docker benötigen. Wie Sie dies tun, ist nicht wichtig. Unter Ubuntu können Sie dies folgendermaßen tun:



1. Bearbeiten Sie die Datei mit /etc/default/dockerIhrem bevorzugten Editor



nano /etc/default/docker


Und fügen Sie am Ende die Variable `DOCKER_OPTS` hinzu. Vergessen Sie nicht, dort Ihre externe IP einzugeben




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. Fügen Sie Argumente hinzu, um den Dienst zu starten. Unter Ubuntu lautet die Startparameterdatei /lib/systemd/system/docker.service. Fügen Sie dem Unterabschnitt eine Zeile hinzu [Service]:



EnvironmentFile=/etc/default/docker


Und wir ändern den Startbefehl nebeneinander:



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


Ja, Punkt 1 war optional, die Befehlsargumente konnten auch hier eingefügt werden, aber es gibt viele davon, und es ist unpraktisch, einen großen Befehl in der Servicedatei auszuführen.



3. Starten Sie den Daemon neu



sudo systemctl daemon-reload
sudo systemctl restart docker


4. Überprüfen Sie in den Daemon-Protokollen, ob alles funktioniert:



journalctl -u docker.service -f




5. Versuchen wir, eine Verbindung über tls herzustellen:



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




Arbeiten!



Auf dem Client konfigurieren



Bevor Sie mit der Konfiguration von Clients beginnen, müssen Sie den Zertifikatsordner auf Ihren Computer herunterladen. Sie können dies auf jede bequeme Weise tun. Zum Beispiel über `scp`:



Auf einem Remote-Computer:



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


Auf dem lokalen Computer:



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


Verwenden Sie als Nächstes diesen Ordner, um Ihren Docker-Client zu konfigurieren.



Mac OS CLI



Hier kommt es beim Setup darauf an, dass Sie Variablen in Ihrer Umgebung registrieren müssen und alles funktioniert. Es stellt sich jedoch die Frage: „Wo kann ich einen nackten Kunden bekommen? Wir brauchen nicht den offiziellen 2-GB-Schwergewichts-Client, der mit der Docker Engine geliefert wird, oder? "



Es gibt eine Lösung! Modern Docker ist seit langem in Client- und Serverteile unterteilt. Sie können separate Client-Binärdateien herunterladen, die für Macos kompiliert wurden. Die offizielle Anweisung ist hier , aber ich werde hier einen kurzen Auszug geben:



1. Laden Sie die neuesten Binärdateien oder die Ihrem Server entsprechenden Binärdateien (Sie können sie mit einem Befehl herausziehen docker info) über den Link herunter und entpacken Sie sie.

2. Kopieren Sie die Binärdateien in den Ordner /usr/local/bin/, um global zu arbeiten:

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


3. Wir registrieren uns in ~/.bashrcoder die ~/.zshrcnotwendigen Umgebungsvariablen. Vergessen Sie nicht, Ihre IP-Adresse und den Pfad zum Ordner mit den Zertifikaten einzugeben :

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


4. Starten Sie Ihren Computer neu (Schaub sicher), überprüfen Sie:



docker info
docker run hello-world




Schönheit!



Jetbrains IDEs (PyCharm, IDEA, Android Studio usw.)



Jetbrains Studios unterstützen Docker über tls out of the box. Diese Einstellung befindet sich in Preference->Build, Execution, Deployment->Docker->+. Dort müssen Sie TCP socketIhre Daten auswählen und eingeben. Es gibt jedoch einen Haken.





Wenn alles wie beabsichtigt ausgeführt wird, wird ein Fehler ausgegeben:

Fehlerantwort vom Daemon: Der Client hat eine HTTP-Anforderung an einen HTTPS-Server gesendet.

Fehler hübsche Druckinformationen
Oder

Verbindung nicht möglich: Status 400: Client hat eine HTTP-Anforderung an einen HTTPS-Server gesendet
Es ist notwendig, unserem Studio ausdrücklich vorzuschreiben, welches Protokoll wir verwenden https:

YOUR_IP : 2376
Danach sollte alles gut funktionieren.



Bonus (Portainer)



Um laufende und bereits verwendete Container effektiv zu verfolgen, habe ich Portainer auf diesem Server installiert. Es sollte in zwei Zeilen platziert werden:



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


Danach YOUR_IP:9000bleibt eine schöne Weboberfläche hängen und Sie können die laufenden und getöteten Container sehen. Erinnerst du dich, wie wir angefangen haben hello-world? Es ist hier und Sie können es direkt von der Schnittstelle reinigen.





Portainer selbst kann mit jedem Docker-Computer verbunden werden und die Docker-Container aller Ihrer Computer von einem Ort aus verwalten. Die Metrik (Grafana + Prometheus + Alerts) kann genauso einfach mit zwei Befehlen eingestellt werden (vergessen Sie nicht zu installieren gi und docker-compose):



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








Nur für Storage müssen Sie ändern sum(node_filesystem_free_bytes{fstype="aufs"})zusum(node_filesystem_free_bytes{fstype="ext4"})







Fazit



Als ich einen Laptop kaufte, gab ich mir nicht die Hoffnung, dass es für jede Aufgabe für mich ausreichen würde, zumal es für mich für die Java / Android-Entwicklung ausreichen würde. Aber ich war angenehm überrascht, bis jetzt fliegen alle meine Projekte, persönlich und nur Open Source, in der IDE. Ich erkannte jedoch, dass diese Schreibmaschine trotz meiner Liebe zu Docker nicht ausgeschaltet werden würde. Ich war sehr glücklich, es einmal auf einem Remote-Docker-Server zu konfigurieren. Während des Entwicklungsprozesses ist es absolut nicht wahrnehmbar, dass der Server nicht lokal ist. Ich spüre keine Einschränkungen, es ist egal, Docker ohne Internet auszuführen, bevor es wenig Sinn macht. Im Allgemeinen bin ich sehr zufrieden. -1 Grund, einen leistungsstarken und schweren Laptop zu kaufen.



Darüber hinaus ist der Docker-Overhead für Linux minimal, sodass Sie bei RuVDS in Russland ein Auto für 240 Rubel pro Monat mieten können (und dies mit einem Rabatt unter Verwendung des HABR-Gutscheincodes )-10% und noch weniger) und machen Sie sich keine Sorgen über Ping und die Auswirkungen von Serveranwendungen auf die Benutzeroberfläche. Außerdem gibt es eine externe IP (die Fähigkeit, Clients anzuzeigen und Entwickler zu behalten), ein privates VPN und erstklassige Zuverlässigkeit. Insgesamt bin ich zufrieden.



Ressourcen:












All Articles