环境说明:
# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
IP | Hostname | Services |
---|---|---|
192.168.20.201 | node1 | |
192.168.20.202 | node2 | |
192.168.20.203 | node3 | docker-machine |
在192.168.20.203 node3上安装docker machine,然后通过docker machine命令在其他两台节点上部署docker并管理远程docker服务。
安装machine
官方文档
在node3节点上安装docker-machine:
curl -L https://github.com/docker/machine/releases/download/v0.13.0/docker-machine-`uname -s`-`uname -m` > /usr/local/bin/docker-machine
chmod +x /usr/local/bin/docker-machine
完成后,查看版本信息:
# docker-machine -v
docker-machine version 0.13.0, build 9ba6da9
为了得到更好的体验,我们可以安装 bash completion script
,这样在 bash 能够通过 tab 键补全 docker-mahine
的子命令和参数。
下载方法:
base=https://raw.githubusercontent.com/docker/machine/v0.13.0
for i in docker-machine-prompt.bash docker-machine-wrapper.bash docker-machine.bash
do
sudo wget "$base/contrib/completion/bash/${i}" -P /etc/bash_completion.d
done
确认版本将其放置到 /etc/bash_completion.d
目录下。
然后在你的bash终端中运行如下命令,告诉你的设置在哪里可以找到docker-machine-prompt.bash
你以前下载的文件 。
source /etc/bash_completion.d/docker-machine-prompt.bash
要启用docker-machine shell
提示符,请添加 $(__docker_machine_ps1)
到您的PS1设置中~/.bashrc
。
PS1='[\u@\h \W$(__docker_machine_ps1)]\$ '
创建machine
对于 Docker Machine 来说,术语 Machine 就是运行 docker daemon 的主机。“创建 Machine” 指的就是在 host 上安装和部署 docker。
创建 machine 要求能够无密码登录远程主机
ssh-keygen -t rsa
ssh-copy-id 192.168.20.201
ssh-copy-id 192.168.20.202
创建第一个 machine: host1 - 192.168.20.201:
docker-machine create --driver generic --generic-ip-address=192.168.20.201 host1
因为我们是往普通的 Linux 中部署 docker,所以使用 generic driver,其他 driver 可以参考官方文档 。
generic
:创建一个machines通过SSH使用已经存在的虚拟机或是主机
- 如果docker没有运行在主机上,它将被自动安装.
- 它会更新主机的软件包(apt-get update, yum update).
- 为了确保docker daemon的安全它会生成证书.
- docker daemon 将会重启,因此所有正在运行的容器将会停止.
- 主机的hostname将被更改为machine name.
--generic-ip-address
指定目标系统的 IP,并命名为 host1
。命令执行过程如下:
# docker-machine create --driver generic --generic-ip-address=192.168.20.201 host1
Running pre-create checks...
Creating machine...
(host1) No SSH key specified. Assuming an existing key at the default location. # 通过 ssh 登录到远程主机。
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with centos... # 安装 docker。
Copying certs to the local machine directory... # 拷贝证书。
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon... # 配置 docker daemon
Checking connection to Docker... # 启动 docker
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env host1
查看:
# docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
host1 - generic Running tcp://192.168.20.201:2376 v18.05.0-ce
登陆到host1查看具体配置:在/etc/systemd/system/docker.service.d
目录下文件名是:10-machine.conf
# cat /etc/systemd/system/docker.service.d/10-machine.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --storage-driver devicemapper --tlsverify --tlscacert /etc/docker/ca.pem --tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem --label provider=generic
Environment=
# -H tcp://0.0.0.0:2376 使 docker daemon 接受远程连接。
# --tls*对远程连接启用安全认证和加密
同时我们也看到 hostname 已经设置为 host1:
[root@host1 ~]# hostname
host1
使用同样的方法创建 host2:
docker-machine create --driver generic --generic-ip-address=192.168.20.202 host2
创建成功后 docker-machine ls 可以看到 host1 和 host2 都已经就绪:
# docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
host1 - generic Running tcp://192.168.20.201:2376 v18.05.0-ce
host2 - generic Running tcp://192.168.20.202:2376 v18.05.0-ce
管理 Machine
用 docker-machine
创建 machine 的过程很简洁,非常适合多主机环境。除此之外,Docker Machine 也提供了一些子命令方便对 machine 进行管理。其中最常用的就是无需登录到 machine 就能执行 docker 相关操作
Docker Machine 让执行远程 docker 命令的过程更简单。docker-machine env host1
显示访问 host1 需要的所有环境变量:
# docker-machine env host1
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.20.201:2376"
export DOCKER_CERT_PATH="/root/.docker/machine/machines/host1"
export DOCKER_MACHINE_NAME="host1"
# Run this command to configure your shell:
# eval $(docker-machine env host1)
根据提示,执行 eval $(docker-machine env host1)
:
[root@node3 ~]# eval $(docker-machine env host1)
[root@node3 ~ [host1]]#
[root@node3 ~ [host1]]#
然后,就可以看到命令行提示符已经变了,其原因是我们之前在$HOME/.bashrc
中配置了 PS1='[\u@\h \W$(__docker_machine_ps1)]\$ '
,用于显示当前 docker host。
在此状态下执行的所有 docker 命令其效果都相当于在 host1 上执行,例如启动一个 busybox 容器:
[root@node3 ~ [host1]]# docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
07a152489297: Pull complete
Digest: sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47
Status: Downloaded newer image for busybox:latest
[root@node3 ~ [host1]]#
[root@node3 ~ [host1]]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 8c811b4aec35 2 weeks ago 1.15MB
[root@node3 ~ [host1]]# docker run -dit busybox
03f5e67becbd87b1702a8cfc22f9623553da6cd31a5277182121bb37344121da
[root@node3 ~ [host1]]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
03f5e67becbd busybox "sh" 2 minutes ago Up 3 seconds silly_volhard
[root@node3 ~ [host1]]#
执行 eval $(docker-machine env host2)
切换到 host2:
[root@node3 ~ [host1]]# eval $(docker-machine env host2)
[root@node3 ~ [host2]]#
[root@node3 ~ [host2]]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@node3 ~ [host2]]#
下面再介绍几个有用的 docker-machine 子命令:
1.docker-machine upgrade
更新 machine 的 docker 到最新版本,可以批量执行:
docker-machine upgrade host1 host2
2.docker-machine config
查看 machine 的 docker daemon 配置:
# docker-machine config host1
--tlsverify
--tlscacert="/root/.docker/machine/machines/host1/ca.pem"
--tlscert="/root/.docker/machine/machines/host1/cert.pem"
--tlskey="/root/.docker/machine/machines/host1/key.pem"
-H=tcp://192.168.20.201:2376
3.docker-machine scp
可以在不同 machine 之间拷贝文件,比如:
docker-machine scp host1:/tmp/a host2:/tmp/b
4.stop/start/restart
是对 machine 的操作系统操作,而 不是 stop/start/restart docker daemon。