Docker Machine快速入门
从笔记本电脑上的boot2docker(不建议使用)切换到Docker Machine (或者我应该说是Mac上的Docker Toolbox )之后,并通过Docker Machine尝试使用Google Cloud Engine之后,我很想知道是否可以管理所有Docker从Docker Machine运行在VPS或专用服务器上的主机。
Docker Machine是一个方便的工具,可以选择要使用的Docker守护进程:可以是在Virtual Box VM中运行的Docker守护进程,也可以是在EC2,GCE,Digital Ocean等上运行的Docker守护进程,也可以是在Docker守护程序上运行一个Linux机器(只是使用哪个驱动程序的问题)
virtualbox驱动程序允许您在Virtual Box中创建一个新的VM,启动它,并使用tls(默认通过2376端口)配置客户端/守护程序tcp链接; 诸如google之类的云驱动程序允许您在“云”中做同样的事情,而通用驱动程序不会创建新主机,而是使用ssh在现有主机上使用tls配置客户端/守护程序tcp链接。
设置完成后,“ docker-machine ls”将为您提供与之交互的Docker守护进程列表:
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM
my.host.com generic Running tcp://my.host.com:2376
default virtualbox Running tcp://192.168.99.104:2376
docker-vm * virtualbox Running tcp://192.168.99.102:2376
要与my.host.com守护进程对话,只需发出以下命令:
$ eval "$(docker-machine env my.host.com)"
现在您正在与my.host.com守护进程通信:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77aa96cf6db9 flexget "/usr/local/bin/flexg" 46 hours ago Up 21 hours
方便吗?
将我的所有docker主机(守护程序)与笔记本电脑上的docker-machine集成在一起将带来以下好处:
- 不再需要在我的(远程)Docker盒中使用ssh
- 我所有的Docker映像工作(Dockerfiles)都可以留在我的笔记本电脑上,我可以从我的笔记本电脑舒适的地方从远程主机上的本地Dockerfiles启动新容器
Docker Machine:通用驱动程序
要将通过ssh访问的主机(例如my.host.com)集成到Docker Machine守护程序列表中,需要使用通用驱动程序。 (此驱动程序将负责配置您的远程守护程序以侦听端口2376并生成和分发tls的必要密钥)
从带有Docker 1.8.2的Docker Machine 0.4.2开始,您需要遵守一些约束以集成启用ssh的Docker主机; 这是一个列表(很难获得……):
- 确保您可以使用公钥身份验证从笔记本电脑连接到远程Docker主机(这意味着您在笔记本电脑上生成了一个公钥,并添加到了远程主机上的授权密钥列表中:ssh-keygen,ssh-copy- id将对此有所帮助)
- 如果在主机上使用“ sudo”,请确保配置无密码sudo:
# visudo
%sudo ALL=(ALL) NOPASSWD:ALL
- 确保服务器上的Docker守护程序版本与笔记本电脑上的Docker客户端版本相同
- 在远程主机上打开端口2376(在Debian / Ubuntu上为“ ufw allow 2376”):便携式Docker客户端将通过端口2376上的TCP连接以与远程守护程序通信
完成这些验证后,建议您现在将远程Docker守护程序(在my.host.com上运行)添加到Docker Machine中:
$ docker-machine create --driver generic \
--generic-ip-address my.host.com \
--generic-ssh-user anthony \
my.host.com
那没起效 ? 好吧,我让您了解下一章!
Docker机器通用驱动程序常见问题
在Mac OS X上,它一直在问我我的密钥密码。
sudo:不存在tty且未指定askpass程序
SSH cmd error!
command: sudo hostname my.host.com && echo "my.host.com" | sudo tee /etc/hostname
err : exit status 1
output : Saving password to keychain failed
Identity added: /Users/anthony/.docker/machine/machines/my.host.com/id_rsa (/Users/anthony/.docker/machine/machines/my.host.com/id_rsa)
sudo: no tty present and no askpass program specified
确保远程用户已配置无密码sudo,如上一章所述:
%sudo ALL=(ALL) NOPASSWD:ALL
docker-machine将永远等待
可能是它试图连接到端口2376,但已被阻塞; 看一下远程主机上的系统日志,
sudo tail -f /var/log/syslog
并检查是否没有与此行相似的行:
Oct 7 01:26:54 my.host kernel: [1859460.411738] [UFW BLOCK] IN=eth0 OUT= MAC=XX:XX SRC=199.99.99.99 DST=92.12.12.12 LEN=64 TOS=0x00 PREC=0x00 TTL=52 ID=37574 DF PROTO=TCP SPT=49855 DPT=2376 WINDOW=65535 RES=0x00 SYN URGP=0
嗡嗡声,UFW BLOCK和2376在同一行上? 听起来您需要更新防火墙配置:
$ sudo ufw allow 2376
三重检查笔记本电脑和远程主机上的docker版本是否对齐
无法加载主机密钥:/ etc / ssh / ssh_host_ecdsa_key
如果您遇到麻烦,则可能正在查看ssh日志
sudo tail -f /var/log/auth.log
也许您看到了这两行:
Oct 7 01:04:41 host sshd[29920]: error: Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Oct 7 01:04:41 host sshd[29920]: error: Could not load host key: /etc/ssh/ssh_host_ed25519_key
您只需要在远程主机上生成这些密钥:
$ sudo ssh-keygen -A
他们将被生成
ssh-keygen: generating new host keys: ECDSA ED25519
无法执行操作:文件存在
SSH cmd error!
command: sudo systemctl enable docker
err : exit status 1
output : Synchronizing state for docker.service with sysvinit using update-rc.d...
Executing /usr/sbin/update-rc.d docker defaults
Executing /usr/sbin/update-rc.d docker enable
Failed to execute operation: File exists
显然, 这是Debian 8特有的问题 ,好消息是:它并没有阻止将远程主机添加到Docker Machine中
不重要的警告
Importing SSH key...
Warning: got an invalid line error parsing /etc/os-release: %sExpected Saving password to keychain failed to split by '=' char into two strings, instead got 1 strings
Warning: got an invalid line error parsing /etc/os-release: %sExpected Identity added: /Users/anthony/.docker/machine/machines/my.host.com/id_rsa (/Users/anthony/.docker/machine/machines/my.host.com/id_rsa) to split by '=' char into two strings, instead got 1 strings
您可以放心地忽略这些警告
胜利了!
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM
my.host.com * generic Running tcp://my.host.com:2376
现在,您可以从笔记本电脑上享受在远程主机上运行的docker了!