以前咱們作的實驗都是在一個host上面的,其實在真正的環境中有多個host,容器在這些host上面啓動,運行,中止和銷燬,相關容器會經過網絡相互通訊,不管他們是否運行在相同的host上面。linux
對於這種歌multi-host環境,咱們該如何高效的進行管理呢?git
第一個問題就是:爲全部host安裝和配置dockergithub
以前咱們手工安裝了一個docker host:docker
1.安裝https CA證書centos
2.添加GPG key安全
3.添加docker apt源bash
4.安裝docker網絡
對於多主機的環境手工方式效率低且不容易保證一致性,只對這個問題,docker給出的解決方案是docker machineapp
用docker machine能夠批量安裝和配置docker host,這個host能夠是本地的虛擬機,物理機,也能夠是公有云中的雲主機ssh
Docker Machine支持在不一樣環境下安裝配置docker host,包括:
1.常規Linux操做系統;
2.虛擬化平臺-VirtualBox,VMware,Hyper-V
3.Openstack
4.公有云-Amazon Web Services,Microsoft Azure,Google Compute Engine,Digital Ocean等
Docker Machine爲這些環境起了一個統一的名字:provider
對於特定的某個provider,Docker Machine使用相應的driver安裝配置docker host
安裝docker machine
實驗環境:主機名 IP 操做系統
docker 192.168.7.222 centos7
docker1 192.168.7.235 centos7
docker2 192.168.7.231 centos7
我將在192.168.7.222 docker上安裝docker machine,而後經過docker machine命令在其餘兩臺host上部署docker
安裝docker machine,參照官方文檔:https://docs.docker.com/machine/install-machine/#install-machine-directly
執行docker-machine version驗證命令是否可用
注:建議根據官方文檔搭建
安裝bash completion script,這樣bash能夠經過tab來補全命令和參數:
下載completion script:docker-machine-prompt.bash docker-machine-wrapper.bash docker-machine.bash 將其放在/etc/bash_completion.d目錄下
命令爲:scripts=( docker-machine-prompt.bash docker-machine-wrapper.bash docker-machine.bash ); for i in "${scripts[@]}"; do sudo wget https://raw.githubusercontent.com/docker/machine/v0.13.0/contrib/completion/bash/${i} -P /etc/bash_completion.d; done
而後將以下代碼添加到~/.bashrc
PS1='[\u@\h \W$(__docker_machine_ps1)]\$ '
若出現一下狀況:
更改~/.bashrc,在bashrc中添加如下三行:
source /etc/bash_completion.d/docker-machine-wrapper.bash
source /etc/bash_completion.d/docker-machine-prompt.bash
source /etc/bash_completion.d/docker-machine.bash
從新source下bashrc
source /root/.bashrc
到此位置docker-machine就安裝完成了!
如何卸載docker-machine,能夠參考官方文檔!
建立machine
對於docker machine來將,術語Machine就是運行docker daemon的主機,建立machine就是在host上安裝docker
執行docker-macine ls查看當前的machine
當前尚未一個machine,接下來咱們建立第一個machine:docker1-192.168.7.235
建立machine要求可以無密碼遠程登錄主機,因此須要下經過以下命令將ssh key拷貝到192.168.7.235
1.ssh-keygen -t rsa 在192.168.7.222上面生成密鑰
注:這裏要回車三次
2.在用戶的家目錄下生成一個 .ssh的 目錄
3.在 .ssh下存放生成的密鑰文件
id_rsa :生成的私鑰文件
id_rsa.pub:生成的公鑰文件
若是但願公鑰生效,需知足如下兩個條件:
1) .ssh目錄的權限必須是700
2) .ssh/authorized_keys文件權限必須是600
3.將密鑰拷貝到192.168.7.235裏面
ssh-copy-id
4.經過ssh 192.168.7.235測試是否成功
一切準備就緒,執行docker-machine create建立第一個docker1
docker-macine create --driver generic --generic-ip-address=192.168.7.235 docker1
由於咱們用的是普通的linux部署docker,因此使用generic driver通用driver,其餘driver能夠參考:https://docs.docker.com/machine/drivers/
咱們的docker1已經建立成功,步驟以下
1.ssh遠程登陸主機
2.安裝docker
3.複製證書
4.配置docker
5.啓動docker
再次執行;docker-machine ls
如今看到docker1已經運行
咱們登錄到docker1查看具體配置
在/etc/systemd/system/docker.service.d下文件名是:10-machine.conf
注:-H tcp://0.0.0.0:2376 使docker daemon接受遠程鏈接
--tls*對遠程鏈接啓用安全認證和加密
注:主機名hostname也會被更改
使用一樣的方法建立docker2
docker-machine create --driver generic --generic-ip-address=192.168.7.231 docker2
因爲我忘記傳送密鑰,致使的報錯
當我把密鑰傳進去後從新建立docker2時提示:docker2已經存在,經過docker-machine ls查看docker2已經處於運行的狀態,沒法識別docker版本
注:這裏的docker的版本還不能指定,默認安裝的是repo的版本
可使用docker-machine rm -f刪除docker2
從新傳送密鑰,而後從新建立docker2
在密鑰傳送不成功以及網絡沒法ping通baidu的狀況下,終於將docker2建好了:
盜圖:
管理machine:
學習無需登陸machine就能夠執行docker相關的命令
1.docker-machine env docker1顯示訪問docker1須要的全部環境變量
根據提示,執行eval $(docker-machine env docker1)
能夠看到,命令提示符變成了docker1,其緣由是咱們以前在/root/.bashrc裏面配置了 PS1='[\u@\h \W$(__docker_machine_ps1)]\$ ',用於顯示當前的docker host
注:若是咱們輸入eval $(docker-machine env docker1)沒有顯示出docker1的命令提示符,咱們能夠從新輸入一遍 PS1='[\u@\h \W$(__docker_machine_ps1)]\$ '
在此狀態下執行的docker命令其效果都至關於在docker1上執行
docker-machine子命令:
docker-machine upgrate docker1 docker2批量更新docker host版本
docker-machine config docker1 查看host的docker daemon配置
docker-machine start/status/restart/kill docker1是對docker host所在的系統的操做,不是對服務的操做
docker-machine scp是在docker host之間複製
docker-machine rm docker1刪除一個docker host
其餘請參考