之前我們做的實驗都是在一個host上面的,其實在真正的環境中有多個host,容器在這些host上面啟動,運行,停止和銷毀,相關容器會通過網絡相互通信,無論他們是否運行在相同的host上面。
對於這種歌multi-host環境,我們該如何高效的進行管理呢?
第一個問題就是:為所有host安裝和配置docker
之前我們手工安裝了一個docker host:
1.安裝https CA證書
2.添加GPG key
3.添加docker apt源
4.安裝docker
對於多主機的環境手工方式效率低且不容易保證一致性,只對這個問題,docker給出的解決方案是docker machine
用docker machine可以批量安裝和配置docker host,這個host可以是本地的虛擬機,物理機,也可以是公有雲中的雲主機
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
其他請參考