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