GNU/Linux >> Znalost Linux >  >> Linux

Jak vytvořit vzdálený virtuální počítač pomocí generického ovladače SSH docker-machine

Pomocí dockeru můžete zabalit vaši podnikovou aplikaci do jednoho samostatného kontejneru, který zaručeně poběží na libovolném prostředí.

To usnadňuje správu aplikace jak pro vývojáře, tak pro správce systému. Pokud jste správce, nemusíte už od vývojáře slyšet tuto výmluvu:„Ale, v mém vývojářském prostředí to funguje!“

Pomocí Docker Machine můžete nainstalovat a nakonfigurovat Docker Engine na vzdálený server. Po instalaci dockeru z místního počítače (notebooku) můžete docker vzdáleně spravovat.

V tomto tutoriálu budeme konkrétně mluvit o obecném ovladači používaném docker-machine, který bude používat klienta SSH ke správě vzdáleného hostitele dockeru.

1. Vytvořte uživatele dockeradmin na vzdáleném hostiteli

Nejprve vytvořte uživatelský účet Linux na vzdáleném serveru. Jako uživatelské jméno opravdu nemusíte používat „dockeradmin“, může to být cokoliv. Můžete dokonce použít své vlastní uživatelské jméno.

adduser dockeradmin

passwd dockeradmin

2. Vygenerujte pár veřejných a soukromých klíčů SSH na místním hostiteli

Dále na svém místním hostiteli (notebooku) vytvořte veřejný a soukromý klíč SSH pomocí ssh-keygen. Také byste měli zkopírovat soukromý klíč na vzdálený server.

Jak to udělat, jsme vysvětlili v tomto článku:Proveďte vzdálené přihlášení SSH bez hesla

Stručně řečeno, zde je to, co pro to musíte udělat:

ssh-keygen

ssh-copy-id dockeradmin@remote-server

Poznámka:Během ssh-keygen nezadávejte žádnou přístupovou frázi. Nechte pole prázdné.

3. Povolit přístup Sudo pro dockeradmin

Na vašem vzdáleném serveru do souboru /etc/sudoers přidejte následující řádek, který poskytne plné oprávnění sudo účtu dockeradmin. To znamená, že účet dockeradmin může spouštět jakýkoli příkaz root.

# visudo
dockeradmin     ALL=(ALL) NOPASSWD: ALL

Poznámka:Příkaz visudo upraví soubor /ec/sudoers. Nemusíte používat „vi /etc/sudoers“.

4. Povolit externí přístup na vzdáleném serveru

Ujistěte se, že váš vzdálený server může komunikovat s internetem. To je vyžadováno, protože příkaz docker-machine vyvolá několik příkazů yum k instalaci určitých požadovaných balíčků.

Takže jen pro účely testování se ujistěte, že na vašem serveru funguje následující.

ping google.com

Pokud nemáte odpovídající nastavení jmenného serveru, upravte svůj /etc/resolve.conf a přidejte následující řádek. Nebo použijte jeden z jmenných serverů poskytnutých správcem systému.

# vi /etc/resolv.conf
nameserver 4.2.2.2

5. Syntaxe příkazu obecného ovladače docker-machine

Když používáte obecný ovladač, v příkazu vytvoření docker-machine jsou k dispozici následující možnosti.

Následující syntaxe docker-machine zobrazuje všechny povinné možnosti:

docker-machine create -d generic --generic-ip-address {ip-address} {docker-vm-name}

Ve výše uvedené syntaxi:

  • příkaz je docker-machine
  • volba vytvořit říká docker-machine, aby vytvořil vzdáleného hostitele docker-vm
  • Možnost
  • -d určuje, jaký typ ovladače se má použít. Zde používáme „generický“ ovladač, který bude používat klienta SSH pro připojení ke vzdálenému hostiteli
  • –generic-ip-address určuje vzdálenou IP-adresu, kde má být vytvořen hostitel docker-vm.
  • jméno docker-vm je název, který chcete přidělit vzdálenému docker-vm, který bude vytvořen příkazem docker-machine. To může být cokoliv.

Následující syntaxe docker-machine zobrazuje všechny dostupné možnosti:

docker-machine create -d generic --generic-ip-address {ip-address} --generic-ssh-key {private-key} --generic-ssh-user {username} --generic-ssh-port {ssh-port} {docker-vm-name}

Ve výše uvedené syntaxi:

  • –generic-ssh-key Toto je volitelné. Když toto nezadáte, bude mluvit s ssh-agentem běžícím na vašem místním systému. Pokud na svém lokálním systému (notebooku) nepoužíváte ssh-agent, použijte tuto možnost a zadejte umístění svého soukromého klíče na místním systému.
  • –generic-ssh-user Toto je volitelné. Ve výchozím nastavení bude používat root. Ale ve většině situací to možná nebudete chtít udělat. Zadejte tedy uživatelské jméno, které má docker-machine používat při připojování ke vzdálenému hostiteli.
  • –generic-ssh-port Toto je port SSH vzdáleného serveru. Ve výchozím nastavení je to 22.
  • Další možnosti jsou vysvětleny ve výše uvedené syntaxi

6. Vytvořte vzdáleného hostitele virtuálního počítače Docker

Nyní je čas vytvořit vzdáleného hostitele docker-vm pomocí příkazu docker-machine create.

docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db

Následující příkaz je stejný jako výše, ale pro snadnou čitelnost jsem jej rozdělil na více řádků.

docker-machine create -d generic \
  --generic-ip-address 192.168.100.2 \ 
  --generic-ssh-key $HOME/.ssh/id_rsa \
  --generic-ssh-user dockeradmin \
  --generic-ssh-port 22 \
  dev-db

Ve výše uvedeném příkazu:

  • Všechny možnosti jsme vysvětlili ve výše uvedené části syntaxe.
  • 192.168.100.2 je IP adresa našeho vzdáleného hostitele, kde by měl být vytvořen hostitel docker-vm.
  • $HOME/.ssh/id_rsa je soukromý klíč, který se nachází ve vašem místním systému (notebooku)
  • dockeradmin je název uživatelského jména systému Linux na vzdáleném hostiteli
  • dev-db je název, který jsem zadal hostiteli docker-vm, kterého chci vytvořit na vzdáleném hostiteli. To může být cokoliv.

Poznámka:Opět budete provádět výše uvedený příkaz docker-machine na vašem místním systému. Můžete použít příkaz docker-machine, který je součástí vašeho Docker Toolbox.

7. Výstup úspěšného vytvoření docker-machine

Pokud vše fungovalo správně, uvidíte následující výstup příkazu docker-machine create.

$ docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db
Running pre-create checks...
Creating machine...
(dev-db) Importing SSH key...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Provisioning with centos...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect Docker to this machine, run: C:\Program Files\Docker Toolbox\docker-machine.exe env dev-db

Nakonec, pokud vše funguje správně, uvidíte vzdáleného hostitele docker vm, kterého jsme vytvořili. V místním systému proveďte následující:

$ docker-machine ls
NAME     ACTIVE   DRIVER       STATE     URL  SWARM  DOCKER    ERRORS
default  *        virtualbox   Running   tcp://192.168.100.10:2376
dev-db   -        generic      Running   tcp://192.168.100.11:2376

Poznámka:Z velké části nic nejde podle plánu a může se zobrazit nějaká chybová zpráva. Níže jsou uvedeny některé typické problémy, kterým jsem čelil, a jejich řešení.

8. Chyba 1:Neplatný OS

Aktuální verze docker-machine podporuje pouze určitou verzi operačního systému na vzdáleném serveru.

Pokud například váš vzdálený server běží na CentOS 6, zobrazí se následující chybová zpráva „/etc/os-release:Žádný takový soubor nebo adresář“. Je to proto, že pro CentOS hledá CentOS 7.

$ docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db
Running pre-create checks...
Creating machine...
Waiting for machine to be running, this may take a few minutes...
(dev-db) Importing SSH key...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Error creating machine: Error detecting OS: Error getting SSH command: Something
 went wrong running an SSH command!
command : cat /etc/os-release
err     : exit status 1
output  : cat: /etc/os-release: No such file or directory

9. Chyba 2:Nelze provést příkaz root (žádný sudo přístup)

Pokud se vám po řádku „Provisioning with centos…“ zobrazuje chybová zpráva „Chyba při vytváření počítače:Chyba při zřizování:stav ukončení 1“, nejde o problém s připojením. docker-machine se dokázal správně připojit ke vzdálenému serveru.

V tomto případě však nemůže provést příkaz root jako uživatel dockeradmin. Použijte tedy visudo a povolte uživateli dockeradmin plný přístup sudo, jak jsme vysvětlili v jednom z předchozích kroků.

$ docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db
Running pre-create checks...
Creating machine...
(dev-db) Importing SSH key...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Provisioning with centos...
Error creating machine: Error running provisioning: exit status 1

10. Chyba 3:Chybí příkaz netstat

Pokud se vám po řádku „Nastavení konfigurace Docker na vzdáleném démonu…“ zobrazuje chybová zpráva „Chyba při spuštění příkazu SSH:stav ukončení 127“, nejedná se také o problém s připojením.

V tomto případě je docker-machine připojen ke vzdálenému SSH a má příslušný sudo přístup k provedení příkazu root, ale některé příkazy, které zkouší, selhaly, protože chybí příkaz „netstat“.

$ docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db
Running pre-create checks...
Creating machine...
(dev-db) Importing SSH key...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Provisioning with centos...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Error running SSH command: exit status 127
Error running SSH command: exit status 127
...
Error running SSH command: exit status 127
Error creating machine: Error running provisioning: Unable to verify the Docker
daemon is listening: Maximum number of retries (10) exceeded

Chcete-li tento problém vyřešit, nainstalujte na vzdálený server balíček net-tools, který obsahuje příkaz „netstat“.

yum install net-tools

Doufám, že v další verzi docker-machine na začátku pravděpodobně zkontrolují, zda na vzdáleném serveru existuje „netstat“ nebo ne, a vydají příslušnou platnou chybovou zprávu.

11. Chyba 4:Neshoda verze klienta Docker

Pokud se vám zobrazuje následující chybová zpráva „Chyba při vytváření počítače:Chyba při zřizování:stav ukončení 1“, existuje možnost, že klient dockeru ve vašem místním systému (notebooku) neodpovídá dokovacímu klientovi ve vzdáleném systému.

$ docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db
Running pre-create checks...
Creating machine...
(dev-db) Importing SSH key...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Provisioning with centos...
Error creating machine: Error running provisioning: exit status 1

Například v místním systému:

$ docker version
Client:
 Version:      1.9.1

Na vzdáleném serveru:

# docker version
Client:
 Version:      1.8.2

Ve výše uvedeném příkladu je verze místního dockeru 1.9.1, ale verze vzdáleného dockeru je starší 1.8.2. Takže zde došlo k chybné shodě a vytvoření docker-machine nebude fungovat a selže, jak je uvedeno výše.

Ve výše uvedeném scénáři byl modul docker nainstalován samostatně na vzdálený server, který měl jinou verzi klienta dockeru než verzi klienta dockeru dodávanou s docker-machine (docker toolbox) v místním systému.

V tomto případě tedy odeberte docker ze vzdáleného systému, jak je znázorněno níže.

# rpm -qa | grep docker
docker-selinux-1.8.2-10.el7.centos.x86_64
docker-1.8.2-10.el7.centos.x86_64

# rpm -ev docker-selinux
Preparing packages...
docker-selinux-1.8.2-10.el7.centos.x86_64

# rpm -ev docker
Preparing packages...
docker-1.8.2-10.el7.centos.x86_64

Nyní, když na svém místním systému spustíte příkaz docker-machine, automaticky se nainstaluje příslušný docker engine a klient docker na vzdálený server, který bude kompatibilní s klientem docker na místním počítači.

12. Chyba 5:SELinux nebo Firewall Blocking Access

Ve výchozím nastavení bude nový počítač docker vm, který jsme vytvořili, spuštěn na portu TCP 2376.

Na vzdáleném serveru se ujistěte, že máte příslušné pravidlo brány firewall, které povolí TCP port 2376. Pokud problém přetrvává, pouze dočasně vyloučte možnost blokování přístupu firewallem, zastavte firewall a uvidíte, co se stane.

systemctl stop firewalld

Opět jen pro účely ladění, z nějakého důvodu, pokud chcete vypnout firewall, můžete to udělat, jak je uvedeno níže:

systemctl disable firewalld

Nejnovější verze Dockeru funguje skvěle se SELinuxem, žádné problémy. Ale v dřívější verzi dockeru byly některé chyby související s dockerem a SELinuxem.

Pokud tedy narazíte na nějaké problémy, zkuste dočasně deaktivovat SELinux a zjistěte, zda problém vyřeší. Chcete-li SELinux trvale zakázat, upravte odpovídajícím způsobem soubor /etc/selinux/config.

setenforce Permissive

getenforce

Všimněte si také, že pokud SSH není schopno navázat spojení z vašeho místního systému se vzdáleným serverem, docker-machine zobrazí následující chybovou zprávu „Chyba při čekání na SSH:Příliš mnoho opakování čekání na SSH“. Chcete-li to vyřešit, ujistěte se, že jste implementovali autentizaci bez hesla SSH, jak je vysvětleno v jednom z výše uvedených kroků.

$ docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db
Running pre-create checks...
Creating machine...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Error creating machine: Error waiting for SSH: Too many retries waiting for SSH
to be available.  Last error: Maximum number of retries (60) exceeded

Po vyřešení všech výše uvedených problémů bude docker-machine fungovat bez problémů, jak je znázorněno níže:

$ docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db

$ docker-machine ls
NAME     ACTIVE   DRIVER       STATE     URL  SWARM  DOCKER    ERRORS
default  *        virtualbox   Running   tcp://192.168.100.10:2376
dev-db   -        generic      Running   tcp://192.168.100.11:2376

Linux
  1. Jak vytvořit roli IAM v AWS pomocí Terraform

  2. Jak vytvořit uživatele Linuxu pomocí Ansible

  3. Ssh – Jak se připojit k počítači přes jiný počítač pomocí Ssh?

  1. Jak vytvořit fyzický svazek v Linuxu pomocí LVM

  2. Jak SSH na server pomocí jiného serveru?

  3. jak tunelovat vzdálenou plochu Windows přes ssh pomocí linuxového boxu?

  1. Jak spravovat vzdáleného hostitele Windows pomocí Ansible

  2. Jak vytvořit S3 Bucket pomocí Pythonu Boto3 na AWS

  3. Jak připojit vzdálený hostitel pomocí příkazu ssh