一.簡介
1.Docker Machine
- Docker Machine 是 Docker 官方編排(Orchestration)項目之一,負責在多種平臺上快速安裝 Docker環境。
- Docker Machine支持在常規Linux操作系統、虛擬化平臺、openstack、公有云等不同環境下安裝配置docker
host。 - Docker Machine 項目基於 Go 語言實現,目前在 Github 上的維護地址:
https://github.com/docker/machine/
2.Docker compose
- compose 是用來定義和運行一個或多個容器(通常都是多個)運行和應用的工具。使用 compose可以簡化容器鏡像的構建以及容器的運行。
- compose 使用 YAML 文件來定義多容器之間的關係。一個 docker-compose up 就可以把完整的應用跑起來。 本質上, compose 把 YAML 文件解析成 docker 命令的參數,然後調用相應的 docker命令行接口,從而將應用以容器化的方式管理起來。它通過解析容器間的依賴關係順序地啓動容器。而容器間的依賴關係由 YAML 文件中的 links 標記指定。
3.Docker Swarm
- Swram是Docker公司推出的官方容器集羣平臺,基於go語言實現,代碼開源在
https://github.com/docker/swarm .2016年2月對架構進行重新設計,推出了v2版本,支持超過1千個節點。作爲容器集羣管理器,Swarm最大的優勢之一就是100%支持標準的DockerAPI及工具(如Compose,docker-py等),Docker本身就可以很好地與Swarm進行集成。
- Manager:接收客戶端服務定義,將任務發送到agnet節點,維護集羣期望狀態和集羣管理功能以及leader選舉。默認情況下manager節點也會運行任務,也可以配置只做管理任務。
- agent:接收並執行從管理節點分配的任務,並報告任務當前的狀態,以便Manager節點維護每個服務期望狀態。
二.創建docker-machine
1.在server1上面部署docker-machine,下載二進制可執行文件,重命名並授予執行權限。
[root@server1 ~]# mv docker-machine-Linux-x86_64-0.16.1 /usr/local/bin
[root@server1 ~]# mv /usr/local/bin/docker-machine-Linux-x86_64-0.16.1 /usr/local/bin/docker-machine
[root@server1 ~]# chmod +x /usr/local/bin/docker-machine
[root@server1 ~]# docker-machine --v ##查看版本號
[root@server1 ~]# docker-machine --help
2.查看本機docker版本(後面會用到)
[root@server1 ~]# docker version
3.免密登陸
[root@server1 ~]# ssh-keygen
[root@server1 ~]# ssh-copy-id server2:
[root@server1 ~]# ssh-copy-id server3:
4.讓真機從互聯網上拉取get.docker.com
[root@foundation11 html]# wget https://get.docker.com/
5.修改index.html
6.修改server2、server3的發行版本號和yum配置文件
[root@server2 yum.repos.d]# vim /etc/os-release
[root@server2 yum.repos.d]# vim /etc/yum.conf
7.給server2和server3自動部署docker。
[root@server1 ~]# docker-machine create --driver generic --engine-install-url="http://172.25.16.250" --generic-ip-address=172.25.16.2 server2
[root@server1 ~]# docker-machine create --driver generic --engine-install-url="http://172.25.16.250" --generic-ip-address=172.25.16.2 server3
若安裝過程出現錯誤,需刪除刪除server2生成的.repo文件
[root@server1 ~]# docker-machine ls
[root@server1 ~]# docker-machine rm server
server2和server3生成的配置文件:
從配置文件中可以看出,docker daemon啓用了TLS驗證功能,docker-machine已經爲其生成好了所需的證書文件。
[root@server2 ~]# cat /etc/systemd/system/docker.service.d/10-machine.conf
[root@server3 ~]# cat /etc/systemd/system/docker.service.d/10-machine.conf
三.管理docker-machine
1.顯示訪問server2和server3主機的所需的環境變量信息。
[root@server1 ~]# docker-machine env server2
[root@server1 ~]# docker-machine env server3
連接遠程docker主機時需要執行以下命令
[root@server1 ~]# docker -H tcp://172.25.16.2:2376 ps
3.安裝bash腳本
[root@server1 ~]# cd /etc/bash_completion.d/
[root@server1 bash_completion.d]# ls
docker-machine.bash rct rhsm-debug
docker-machine-prompt.bash redefine_filedir rhsm-icon
docker-machine-wrapper.bash rhn-migrate-classic-to-rhsm subscription-manager
iprutils rhsmcertd
[root@server1 bash_completion.d]# source docker-machine.bash
[root@server1 bash_completion.d]# source docker-machine-prompt.bash
[root@server1 bash_completion.d]# source docker-machine-wrapper.bash
4.編輯環境,並測試
[root@server1 ~]# vim .bashrc
[root@server1 ~]# source .bashrc
[root@server1 ~]# docker-machine use server2
Active machine: server2
[root@server1 ~ [server2]]# docker-machine use -u #切會server1
Active machine:
[root@server1 ~]# cat .bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
PS1='[\u@\h \W$(__docker_machine_ps1)]\$ ' ##添加的內容
[root@server1 ~]#
docker-machine常見命令:
docker-machine upgrade server2 更新docker版本
docker-machine config server2 查看machine配置
docker-machine scp 可以在machine中複製文件
docker-machine ssh 連接machine
docker-machine rm 刪除machine
四.docker-compose
root@server1 ~]# docker-compose ##tap
.bash_logout
.bash_profile
.bashrc
containerd.io-1.2.5-3.1.el7.x86_64.rpm
container-selinux-2.21-1.el7.noarch.rpm
.cshrc
docker-ce-18.09.7-3.el7.x86_64.rpm
docker-ce-cli-18.09.7-3.el7.x86_64.rpm
index.html
libsemanage-2.5-8.el7.x86_64.rpm
libsemanage-python-2.5-8.el7.x86_64.rpm
pigz-2.3.4-1.el7.x86_64.rpm
policycoreutils-2.5-17.1.el7.x86_64.rpm
policycoreutils-python-2.5-17.1.el7.x86_64.rpm
.ssh/
.tcshrc
.viminfo
[root@server1 ~]# cd /mnt
[root@server1 mnt]# ls
[root@server1 mnt]# mkdir compose
導入haproxy鏡像
[root@server1 ~]# docker load -i haproxy.tar
[root@server1 ~]# docker history haproxy:latest
[root@server1 ~]# cd /mnt/compose/
[root@server1 compose]# ls
[root@server1 compose]# vim docker-compose.yml
文件內容如下:
web1:
image: nginx
expose:
- 80
volumes:
- ./web1:/usr/share/nginx/html
web2:
image: nginx
expose :
- 80
haproxy:
image: haproxy:lastest
volumes:
- ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
links:
- web1
- web2
ports:
- "80:80"
expose:
- "80"
編輯配置文件
vim haproxy.cfg
global
log 127.0.0.1 local0
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
stats uri /status
frontend balancer
bind 0.0.0.0:80
default_backend web_backends
backend web_backends
balance roundrobin
server server1 web1:80 check
server server2 web2:80 check
測試:出現輪詢
五.Swam管理集羣
1.部署集羣
1.清理實驗環境
刪除server1、server2的容器
2.爲server3安裝docker(server1、server2已經安裝好了)
[root@server1 ~]# scp -r docker server3:
[root@server3 ~]# ls
docker
[root@server3 ~]# cd docker/
[root@server3 docker]# ls
container-selinux-2.21-1.el7.noarch.rpm
docker-ce-18.06.1.ce-3.el7.x86_64.rpm
libsemanage-2.5-8.el7.x86_64.rpm
libsemanage-python-2.5-8.el7.x86_64.rpm
pigz-2.3.4-1.el7.x86_64.rpm
policycoreutils-2.5-17.1.el7.x86_64.rpm
policycoreutils-python-2.5-17.1.el7.x86_64.rpm
repodata
[root@server3 docker]# yum install *.rpm -y
3.打開server3的docker服務
[root@server3 docker]# systemctl start docker.service
4.初始化server1(管理節點)的swarm集羣
[root@server1 ~]# docker swarm init
5.查看server1的橋接,和網絡信息
[root@server1 ~]# yum install bridge-utils.x86_64 -y ##提供brctl命令
[root@server1 ~]# brctl show
[root@server1 ~]# docker network ls
6.server2、server3加入集羣
[root@server2 docker]# docker swarm join --token SWMTKN-1-5m3v8gviqk7r5e1zs9h8vsr16shhti2mp1o5qa23i7tgml08ut-bqrt2diawswa860qqmabblw4x 172.25.16.1:2377
[root@server2 docker]# docker swarm join --token SWMTKN-1-5m3v8gviqk7r5e1zs9h8vsr16shhti2mp1o5qa23i7tgml08ut-bqrt2diawswa860qqmabblw4x 172.25.16.1:2377
7.在管理節點查看到所有節點信息和狀態
2.部署應用
1.server1中創建網絡webnet,用於容器間通信。
[root@server1 ~]# docker service create --name web --network webnet --publish 80:80 --replicas 3 nginx:1.16
##-replicas 3代表集羣的個數爲3;nginx後面要帶版本號,默認是laster(可以修改標籤)
image nginx:1.16 could not be accessed on a registry to record
its digest. Each node will access nginx:1.16 independently,
possibly leading to different nodes running different
versions of the image.
qchyxe0yjm7005e8rb2l5f9fz
overall progress: 3 out of 3 tasks
1/3: running
2/3: running
3/3: running
verify: Service converged
[root@server1 ~]#
2.查看服務列表
[root@server1 ~]# docker service ls
[root@server1 ~]# docker service ps web
4.給server3加載nginx鏡像
5.擴容(增加到六個負載)
[root@server1 ~]# docker service scale web=6
web scaled to 6
overall progress: 6 out of 6 tasks
1/6: running
2/6: running
3/6: running
4/6: running
5/6: running
6/6: running
verify: Service converged
6.縮減到3個(夠用就行)
[root@server1 ~]# docker service scale web=3
web scaled to 3
overall progress: 3 out of 3 tasks
1/3: running
2/3: running
3/3: running
verify: Service converged
此時每個主機開啓一個nginx服務
7.在三個虛擬機上編寫nginx發佈默認文件,並cp到容器內nginx的html下
測試:
物理機中訪問三臺虛擬機,成功訪問並實現輪詢
[root@foundation60 ~]# for i in {1..10};do curl 172.25.16.2/index.html;done
[root@foundation60 ~]# for i in {1..10};do curl 172.25.16.2/index.html;done
[root@foundation60 ~]# for i in {1..10};do curl 172.25.16.3/index.html;done
3.部署監控
1.在每個節點上導入visualizer.tar鏡像
[root@server1 ~]# docker load -i visualizer.tar
[root@server2 ~]# docker load -i visualizer.tar
[root@server3 ~]# docker load -i visualizer.tar
2.創建swarm的監控容器,使監控和docker連接起來
[root@server1 ~]# docker service create --name=viz --publish=8080:8080/tcp --constraint=node.role==manager --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock dockersamples/visualizer
3.查看容器viz和8080端口開啓情況
測試:
瀏覽器輸入:172.25.16.1:8080