一.简介
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