目录
一. Docker Machine
简介:
Docker Machine安装
二.docker compose
三.docker swarm
实验环境
Docker Machine项目基于 Go 语言实现,是 Docker 官方编排(Orchestration)项目之一,负责在多种平台上快速安装 Docker 环境。
Docker Machine支持在常规Linux操作系统、虚拟化平台、openstack、公有云等不同环境下安装配置docker host。
维护地址:https://github.com/docker/machine
实验环境vm2和vm3已经安装好docker-ce
开启新的机器vm4
在vm2上安装Docker Machine
https://github.com/docker/machine/releases/tag/v0.16.2 下载
curl -L https://github.com/docker/machine/releases/download/v0.16.2/docker-machine-`uname -s`-`uname -m` > /usr/local/bin/docker-machine
chmod +x /usr/local/bin/docker-machine
对vm3和vm4进行免密设置
之后,vm2上安装docker
docker–generic-ip-address #指定要安装宿主机的IP,这里是本地的IP。也就是说,你也可以给别的主机装Docker,前提是SSH root用户免交互登录或私钥认证。
docker-machine create --driver generic --generic-ip-address=172.25.7.7 vm3
Key的生成
[root@vm2 ~]# cd .docker/
[root@vm2 .docker]# cd machine/
cd machines/
[root@vm2 machines]# ls
vm3
[root@vm2 machines]# cd vm3/
[root@vm2 vm3]# ls
ca.pem cert.pem config.json key.pem server-key.pem server.pem
eval $(docker-machine env vm3)
远程加密使用vm3
env查看环境变量
安装脚本可以看出使用的主机
docker-machine.bash 100% 12KB 7.2MB/s 00:00
docker-machine-prompt.bash 100% 1469 1.7MB/s 00:00
docker-machine-wrapper.bash
编辑环境变量的行提示符
[root@vm2 bash_completion.d]# vim ~/.bashrc
[root@vm2 bash_completion.d]# cat ~/.bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
PS1='[\u@\h \W$(__docker_machine_ps1)]\$ '
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
要退出重新连接
vm4部署docker
/var/www/html
[root@students72 html]# wget https://get.docker.com/
--2022-01-13 15:07:50-- https://get.docker.com/
Resolving get.docker.com (get.docker.com)... 99.84.206.68, 99.84.206.5, 99.84.206.114, ...
Connecting to get.docker.com (get.docker.com)|99.84.206.68|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 18617 (18K) [text/plain]
Saving to: ‘index.html’
index.html 100%[====================================================================>] 18.18K 95.4KB/s in 0.2s
2022-01-13 15:07:51 (95.4 KB/s) - ‘index.html’ saved [18617/18617]
[root@students72 html]# ls
index.html mitaka pub rhel7.6 westos.cfg westosir
[root@students72 html]#
[root@students72 html]# mv index.html get-docker.sh
[root@students72 html]# vim get-docker.sh
[root@students72 html]# vim docker-ce.repo
[root@students72 html]# cat docker-ce.repo
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/stable
enabled=1
gpgcheck=0
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[extras]
name=CentOS-$releasever - Extras - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/extras/$basearch/
gpgcheck=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
vm节点进行部署
docker-machine create --driver generic --engine-install-url "http://172.25.7.250/get-docker.sh" --generic-ip-address=172.25.7.8 vm4
第一次失败,vm4无法用网
让vm4可以上网成功
Docker Compose是一种编排服务,基于pyhton语言实现,是一个用于在 Docker 上定义并运行复杂应用的工具,可以让用户在集群中部署分布式应用。用户可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。
解决了容器与容器之间如何管理编排的问题。
Docker Compose 中有两个重要的概念:
服务 (service) :一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
项目 (project) :由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
vm2安装仓库时已经安装了Docker Compose
[root@vm2 ~]# cd /usr/local/bin/
[root@vm2 bin]# ls
convoy convoy-pdata_tools docker-compose docker-machine
[root@vm2 bin]# cd /root/
[root@vm2 ~]# mkdir compose
[root@vm2 ~]#
使用haproxy和nginx(在这作web服务器
)作负载均衡
[root@vm2 ~]# docker pull haproxy
[root@vm2 ~]# cd compose/
[root@vm2 compose]# ls
[root@vm2 compose]# vim docker-compose.yml
version: "3.9"
services:
web1:
image: nginx
networks:
- mynet
volumes:
- ./web1:/usr/share/nginx/html
web2:
image: nginx
networks:
- mynet
volumes:
- ./web2:/usr/share/nginx/html
haproxy:
image: haproxy
networks:
- mynet
volumes:
- ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
ports:
- "80:80" #端口修改为80:5000 后面的才可以监听
networks:
mynet:
[root@vm2 compose]# mkdir web1
[root@vm2 compose]# mkdir web2
[root@vm2 compose]# echo web1 > web1/index.html
[root@vm2 compose]# echo web2 > web2/index.html
创建haproxy目录并编辑修改haproxy.cfg的主配置文件
[root@vm2 compose]# mkdir haproxy
[root@vm2 compose]# vim haproxy.cfg
[root@vm2 haproxy]# vim haproxy.cfg
[root@vm2 haproxy]# cat haproxy.cfg
#
# This is a sample configuration. It illustrates how to separate static objects
# traffic from dynamic traffic, and how to dynamically regulate the server load.
#
# It listens on 192.168.1.10:80, and directs all requests for Host 'img' or
# URIs starting with /img or /css to a dedicated group of servers. URIs
# starting with /admin/stats deliver the stats page.
#global
maxconn 65535
#stats socket /var/run/haproxy.stat mode 600 level admin
log 127.0.0.1 local0
#uid 200
#gid 200
# chroot /var/empty
daemondefaults
mode http
log global
option httplog
option dontlognull
monitor-uri /monitoruri
maxconn 8000
timeout client 30s
retries 2
option redispatch
timeout connect 5s
timeout server 5s
stats uri /admin/stats# The public 'www' address in the DMZ
frontend public
bind *:5000 name clear #监听所有ip的80端口#bind 192.168.1.10:443 ssl crt /etc/haproxy/haproxy.pem
#use_backend static if { hdr_beg(host) -i img }
#use_backend static if { path_beg /img /css }
default_backend dynamic# The static backend backend for 'Host: img', /img and /css.
backend dynamic
balance roundrobin
server a web1:80 check inter 1000 #1000ms健康检测
server b web2:80 check inter 1000
[root@vm2 haproxy]#
[root@vm2 compose]# docker-compose up / down
docker-compose start 要在compose目录中读取yml 文件
docker-compose ps
测试
主机
浏览器http://172.25.7.6/
如果有自动生成https需要对浏览器进行设置
选择自定义
访问
http://172.25.7.6/admin/stats
[root@vm2 compose]# docker ps
[root@vm2 compose]# docker stop compose-web1-1
compose-web1-1
[root@vm2 compose]# docker start compose-web1-1
compose-web1-1
stop a变红 start 恢复
https://docs.docker.com/compose/compose-file/compose-file-v3/#compose-file-structure-and-examples
在 Docker 1.12 版本发布之后,swarm合并到了 Docker 中,成为 Docker 的一个子命令。Swarm 是 Docker 社区提供的唯一一个原生支持 Docker 集群管理的工具,它可以把多个 Docker 主机组成的系统转换为单一的虚拟 Docker 主机,使得容器可以组成跨主机的子网网络。
Docker swarm 是一个为 IT 运维团队提供集群和调度能力的编排工具。
Docker Swarm 优点
Docker swarm节点分为manager管理节点和worker工作节点。
Task任务是swarm中的最小调度单位,可以理解为一个单一的容器。
Services服务是指一组任务的集合,服务定义了任务的属性。
初始化
[root@vm2 ~]# docker swarm init
vm4中复制文件
scp /etc/sysctl.d/docker.conf vm4:/etc/sysctl.d/docker.conf
将光标命令在 vm3,vm4运行
在vm2
[root@vm2 ~]# docker node ls
默认网络
[root@vm2 ~]# docker node promote vm3
[root@vm2 ~]# docker node demote vm2
docker swarm leave
改变Leader
[root@vm3 ~]# docker node rm -f vm2
vm2
vm2脱离集群,仓库运行打入后台
[root@vm2 harbor]# docker-compose up -d
让仓库为vm3和vm4可用
查看docker仓库
拉起新的虚拟机vm5
docker 安装好
vm2仓库
vm3/4/5与仓库连接
vm5加入集群
docker swarm join --token SWMTKN-1-3f8v7h2j6pebml6or66xwuovnpek2cusste1iwr8c64s7j41st-6zqp2y51768t3rm3bn5wqdvam 172.25.7.7:2377
vm3:
docker service create --name webcluster -p 80:80 --replicas 3 nginx
集群的伸缩
docker service scale webcluster=3/6/12 自己选数字
部署swarm 监控
https://github.com/dockersamples/docker-swarm-visualizer
[root@vm2 harbor]# docker tag dockersamples/visualizer:stable reg.westos.org/library/visualizer:latest
[root@vm2 harbor]# docker push reg.westos.org/library/visualizer:latest
vm3 leader
[root@vm3 sysctl.d]#
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 \
> visualizer
访问172.25.7.7:8080
systemctl stop docker.service
[root@vm3 docker]# docker service rm webcluster
webcluster
[root@vm3 docker]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
yyu0mal5hjqj viz replicated 1/1 visualizer:latest *:8080->8080/tcp
vm2拉取myapp,并上传到harbor仓库
docker search ikubernetes
docker pull ikubernetes/myapp:v1
docker pull ikubernetes/myapp:v2
[root@vm2 harbor]# docker tag ikubernetes/myapp:v1 reg.westos.org/library/myapp:v1
[root@vm2 harbor]# docker tag ikubernetes/myapp:v2 reg.westos.org/library/myapp:v2
docker push reg.westos.org/library/myapp:v1
vm3重新创建容器集群
docker service create --name webcluster -p 80:80 --replicas 3 myapp:v1
负载均衡测试
测试
[root@students72 images]# for i in {1..10}; do curl 172.25.7.8/hostname.html; done
docker service scale webcluster=12
docker service update webcluster --help
docker service update --image myapp:v2 --update-parallelism 2 --update-delay 5s webcluster
webcluster
每次更新两个,每五秒更新一次
可以指定yml文件
[root@vm3 ~]# vim webcluster.yml
[root@vm3 ~]# cat webcluster.yml
version: "3.9"
services:
redis:
image: myapp:v1
ports:
- "80:80"
deploy:
replicas: 3
update_config:
parallelism: 2
delay: 5s
restart_policy:
condition: on-failure
[root@vm3 ~]# docker stack deploy web -c webcluster.yml
Creating network web_default
Creating service web_redis
[root@vm3 ~]# vim webcluster.yml
[root@vm3 ~]# docker stack deploy web -c webcluster.yml
Updating service web_redis (id: ogd07mkp3l58s4mmzfnzgyvg8)
修改了3为6