docker(6)--Machine、Compose、Swarm

本文详细介绍了Docker的三个重要工具:Machine用于在多平台上快速配置Docker环境,Compose用于管理和编排多容器应用,Swarm则提供了Docker集群管理。内容涵盖Machine的安装和使用,Compose的YAML文件配置及服务概念,以及Swarm的节点管理、任务调度和服务部署。还涉及到安全工具和Docker Swarm的负载均衡与更新策略。
摘要由CSDN通过智能技术生成

Docker安全的顶尖开源工具:

    Docker Bench for Security        对照安全基准审计Docker容器的脚本
    Clair        API驱动的静态容器安全分析工具,拥有庞大的CVE数据库
    Cilium        内核层可感知API的网络和安全工具
    Anchore        使用CVE数据和用户定义的策略检查容器安全的工具
    OpenSCAP Workbench        用于为各种平台创建和维护安全策略的环境
    Dagda         用于在Docker容器中扫描漏洞、特洛伊木马、病毒和恶意软件的工具
    Notary         使用服务器加强容器安全的框架,用于以加密方式委派责任
    Sysdig Falco        提供了行为活动监控,可深入了解容器

一、docker Machine

  • Docker Machine是Docker官方编排项目之一,负责在多种平台上快速安装Docker 环境。
  • Docker Machine支持在常規Linux操作系统、虚拟化平台、openstack、公有云等不同环境下安装配置docker host。
  • Docker Machine项目基于Go语言实现

安装:

[root@server1 ~]# mv docker-machine-Linux-x86_64-0.16.2 /usr/local/bin/docker-machine
[root@server1 ~]# chmod +x /usr/local/bin/docker-machine

创建machine要求免密登陆远程主机:
[root@server1 ~]# ssh-keygen 
[root@server1 ~]# ssh-copy-id server2
[root@server1 ~]# ssh-copy-id server3

 

创建主机:

[root@server1 ~]# docker-machine create --driver generic --generic-ip-address=172.25.70.2 server2

server2开启2376端口 

 server2切换到/etc/docker目录,可以看到如图证书文件

在server1中machines目录下有server2文件夹,里面有server2的证书文件

  登陆到server2:

[root@server1 ~]# docker-machine config server2
[root@server1 ~]# docker-machine env server2
[root@server1 ~]# eval $(docker-machine env server2)
[root@server1 ~]# docker info

  登陆之后没有符号显示,安装bash脚本

[root@localhost file_recv]# scp docker-machine*.bash root@172.25.70.1:/etc/bash_completion.d/

[root@server1 ~]# rpm -qa | grep bash
bash-4.2.46-31.el7.x86_64
bash-completion-2.1-6.el7.noarch

[root@server1 ~]# cd /etc/bash_completion.d/

[root@server1 bash_completion.d]# ls
docker-machine.bash          iprutils          rhn-migrate-classic-to-rhsm  rhsm-icon
docker-machine-prompt.bash   rct               rhsmcertd                    subscription-manager
docker-machine-wrapper.bash  redefine_filedir  rhsm-debug

[root@server1 ~]# vim .bashrc

PS1='[\u@\h \W$(__docker_machine_ps1)]\$ '


[root@server1 ~]# logout
Connection to 172.25.70.1 closed.
[root@localhost Desktop]# ssh -l root 172.25.70.1
root@172.25.70.1's password: 
Last login: Fri Mar 11 16:46:30 2022 from foundation0.ilt.example.com
[root@server1 ~]# eval $(docker-machine env server2)
[root@server1 ~ [server2]]# 

 docker的主机server3中创建:

物理机:

[root@localhost ~]# curl https://get.docker.com/ -o get-docker.sh
[root@localhost Desktop]# cd /var/www/html/
[root@localhost html]# ls
docker-ce.repo  get-docker.sh  rhel7.6  rhel8.2  westos
[root@localhost html]# vim get-docker.sh 

[root@localhost html]# vim 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

[extras]
name=CentOS-$releasever - Extras - mirrors.aliyun.com
baseurl=http://mirrors.aliyun.com/centos/7/extras/$basearch/
gpgcheck=0

get-docker.sh

server1:

通过server1给server3部署docker:

docker-machine create --driver generic --generic-ip-address=172.25.70.3 --engine-install-url "http://172.25.70.250/get-docker.sh" server3

 出错:虚拟机没联网,无法访问阿里云,下载失败

但server1上依然在server3上创建了,状态是unknow,需要删除

 处理完网络问题,重新创建:

 在server1创建时,可在server3进程中查看:

二、Docker Compose

1.Docker Compose简介

  • 微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知。
  • Docker Compose是一种编排服务,基于pyhton语言实现,是一个用于在Docker上定义并运行复杂应用的工具,可以让用户在集群中部署分布式应用。
  •  用户可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。
  •  解决了容器与容器之间如何管理编排的问题。

Docker Compose中两个重要概念:

  •  服务(service) :一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  •  项目(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义。

2.Docker Compose实践 

官网:Compose file version 3 reference | Docker Documentation

docker-compose.yml属性

    Image: 指定为镜像名称或镜像ID,如果镜像在本地不存在,Compose将会尝试拉取这个镜像。
    Build:指定Dockerfile所在文件夹的路径。Compose将会利用它自动构建这个镜像,然后使用这个镜像。
    Command:覆盖容器启动后默认执行的命令。
    Links:链接到其它服务中的容器。
    Ports: 端口映射。
    Expose:暴露端口信息
    Volumes:卷挂载路径设置

[root@server1 ~]# mkdir compose
[root@server1 ~]# cd compose/
[root@server1 compose]# docker pull haproxy
[root@server1 compose]# docker network prune 
[root@server1 compose]# docker network ls
[root@server1 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:ro
    ports:
      - "80:5000"

networks:
  mynet:
[root@server1 compose]# mkdir web1     在compose目录下创建web1和web2两个文件夹,分别写入对应的页面
[root@server1 compose]# echo web1 > web1/index.html
[root@server1 compose]# mkdir web2
[root@server1 compose]# echo web2 > web2/index.html
[root@server1 compose]# mkdir haproxy     在compose目录下创建haproxy目录,在里面创建haproxy.cfg的配置文件

[root@server1 compose]# mkdir haproxy
[root@server1 compose]# ls
docker-compose.yml  haproxy  web1  web2
[root@server1 compose]# cd haproxy/
[root@server1 haproxy]# vim haproxy.cfg
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
        daemon
 
defaults
        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
        #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
        server          b web2:80 check inter 1000
[root@server1 haproxy]# ls
haproxy.cfg
[root@server1 haproxy]# cd ..
[root@server1 compose]# ls
docker-compose.yml  haproxy  web1  web2
[root@server1 compose]# pwd
/root/compose

 启动:必须要和docker-compose.yml文件在同一路径下

[root@server1 compose]# docker-compose up
[root@server1 compose]# docker-compose ps
[root@server1 compose]# docker-compose start

curl访问:负载均衡

 网页访问:

三、Docker Swarm 

        Swarm在Docker 1.12 版本之前属于一个独立的项目,在Docker1.12版本发布之后,该项目合并到了Docker中,成为Docker的一个子命令。Swarm是Docker社区提供的唯一一个原生支持Docker集群管理的工具,可以把多个Docker主机组成的系统转换为单一的虚拟Docker主机,使得容器可以组成跨主机的子网网络。Docker Swarm是一个为IT运维团队提供集群和调度能力的编排工具。

docker swarm相关概念

  • 节点分为管理(manager)节点和工作(worker)节点
  • 任务(Task) 是Swarm中的最小的调度单位,目前来说就是一个单一的容器。
  • 服务(Services) 是指一组任务的集合,服务定义了任务的属性。

 将server2和server3加入集群

[root@server1 compose]# docker pull dockersamples/visualizer:stable
[root@server1 compose]# docker swarm init
    docker swarm join --token SWMTKN-1-34qg06chym8uq7vpmdc0po2y1thls7r51vufkz0d7bt355q6dv-e5vdmvm58smgs1hu3zf9kvzgb 172.25.70.1:2377
[root@server2 ~]# cd /etc/sysctl.d/
[root@server2 sysctl.d]# scp docker.conf server3:/etc/sysctl.d/    ###复制docker.conf文件到server3

[root@server3 ~]# sysctl --system

[root@server2 ~]# docker swarm join --token SWMTKN-1-34qg06chym8uq7vpmdc0po2y1thls7r51vufkz0d7bt355q6dv-e5vdmvm58smgs1hu3zf9kvzgb 172.25.70.1:2377
[root@server3 ~]# docker swarm join --token SWMTKN-1-34qg06chym8uq7vpmdc0po2y1thls7r51vufkz0d7bt355q6dv-e5vdmvm58smgs1hu3zf9kvzgb 172.25.70.1:2377           ###将server2和server3分别加入集群,server1为leader
[root@server1 compose]# docker node ls

 docker swarm init

复制文件

 

 加入集群:

 在server1部署私有仓库 :

[root@server1 ~]# docker node promote server2    ###将leader交给server2
[root@server1 ~]# docker node demote server1
[root@server1 ~]# docker swarm leave           ###退出集群
[root@server2 ~]# docker node rm -f server1     ###server2上删除server1
[root@server2 ~]# docker node ls

[root@server1 ~]# cd harbor/
[root@server1 harbor]# docker-compose up -d

 

 

[root@server2 ~]# cd /etc/docker/
[root@server2 docker]# scp -r certs.d/ server3:/etc/docker/   ###拷贝docker配置文件和证书到server3
[root@server2 docker]# scp -r daemon.json server3:/etc/docker/

[root@server3 ~]# vim /etc/hosts     ###添加reg.westos.org
172.25.70.1 server1 reg.westos.org
[root@server3 ~]# cd /etc/docker/
[root@server3 docker]# ls       ###查看证书
ca.pem  certs.d  daemon.json  key.json  server-key.pem  server.pem
[root@server3 docker]# systemctl daemon-reload 
[root@server3 docker]# systemctl reload docker
[root@server3 docker]# docker info

 添加新节点server4:

[root@server4 ~]# yum install -y docker-ce
[root@server3 docker]# cd /etc/yum.repos.d/
[root@server3 yum.repos.d]# ls
docker-ce.repo  dvd.repo  redhat.repo
[root@server3 yum.repos.d]# scp docker-ce.repo server4:/etc/yum.repos.d/
[root@server3 yum.repos.d]# cd /etc/sysctl.d/
[root@server3 sysctl.d]# ls
99-sysctl.conf  docker.conf
[root@server3 sysctl.d]# scp docker.conf server4:/etc/sysctl.d/

[root@server4 ~]# systemctl start docker
[root@server4 ~]# systemctl enable docker
[root@server4 ~]# vim /etc/hosts
172.25.70.1      server1 reg.westos.org

[root@server3 sysctl.d]# cd /etc/docker/
[root@server3 docker]# ls
ca.pem  certs.d  daemon.json  key.json  server-key.pem  server.pem
[root@server3 docker]# scp -r certs.d/ daemon.json server4:/etc/docker/

[root@server4 ~]# cd /etc/docker/
[root@server4 docker]# ls
certs.d  daemon.json  key.json
[root@server4 docker]# systemctl restart docker
[root@server4 docker]# docker pull busybox

 server4上下载docker-ce并设置开机自启,添加地址解析

复制docker配置文件到server4

使用私有仓库拉取busybox

 负载均衡:

[root@server2 docker]# docker service ls
[root@server2 docker]# docker service create --name webcluster -p 80:80 --replicas 3 nginx
[root@server2 docker]# docker service ls
[root@server2 docker]# docker service ps webcluster 
将server4加入集群:
[root@server4 docker]# docker swarm join --token SWMTKN-1-34qg06chym8uq7vpmdc0po2y1thls7r51vufkz0d7bt355q6dv-e5vdmvm58smgs1hu3zf9kvzgb 172.25.70.2:2377

[root@server2 docker]# docker service scale webcluster=6   ###动态拉伸
[root@server2 docker]# docker service ps webcluster 
[root@server2 docker]# docker service ls
[root@server2 docker]# docker node ls

[root@server2 docker]# docker service scale webcluster=12
[root@server2 docker]# docker service ps webcluster 

 部署swarm监控

官网地址:https://github.com/dockersamples/docker-swarm-visualizer

在server1中将镜像上传到私有仓库:

[root@server1 harbor]# docker tag dockersamples/visualizer:stable reg.westos.org/library/visualizer:latest
[root@server1 harbor]# docker push reg.westos.org/library/visualizer:latest

[root@server2 docker]# docker service scale webcluster=3
[root@server2 docker]# 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
nz823uqmx5md10f1jxddkz8z5
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service converged 
[root@server2 docker]# docker service ls
[root@server2 docker]# docker service ps viz 

  访问http://172.25.70.2:8080/

负载均衡测试:

[root@server3 docker]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS         PORTS     NAMES
6a992f7a24a9   nginx:latest   "/docker-entrypoint.…"   15 seconds ago   Up 9 seconds   80/tcp    webcluster.2.mlmja4iaug1vh1ihqsw6mm2u0
[root@server3 docker]# docker stop 6a992f7a24a9   ##停止后它会自动start
6a992f7a24a9
[root@server3 docker]# systemctl stop docker   ##如果docker服务stop,会负载均衡到其他节点
 [root@server3 docker]# systemctl start docker  ##再次将server3中的docker服务开启之后,进程仍旧在另一个节点上

 滚动更新:

[root@server2 docker]# docker service rm webcluster 

[root@server1 harbor]# docker search ikubernetes
[root@server1 harbor]# docker pull ikubernetes/myapp:v1
[root@server1 harbor]# docker pull ikubernetes/myapp:v2
[root@server1 harbor]# docker tag ikubernetes/myapp:v1 reg.westos.org/library/myapp:v1
[root@server1 harbor]# docker tag ikubernetes/myapp:v2 reg.westos.org/library/myapp:v2
[root@server1 harbor]# docker push reg.westos.org/library/myapp:v1
[root@server1 harbor]# docker push reg.westos.org/library/myapp:v2

[root@server2 docker]# docker service create --name webcluser -p 80:80 --replicas 3 myapp:v1
[root@server2 docker]# docker service ls
[root@server2 docker]# docker service ps webcluser 

 在客户端,用curl访问测试负载均衡

  [root@server2 docker]# docker service scale webcluser=10


     [root@server2 ~]# docker service update --image myapp:v2 --update-parallelism 2 --update-delay 5s webcluser        ##滚动更新为v2

    [root@server2 ~]# docker service ls   
    [root@server2 ~]# docker service rm webcluser

  用脚本更新:

[root@server2 docker]# docker service rm webcluser
[root@server2 ~]# vim webcluser.yml
version: "3.9"
services:

  webcluster:
    image: myapp:v1
    ports:
      - "80:80"
    deploy:
      replicas: 3
      update_config:
        parallelism: 2
        delay: 5s
      restart_policy:
        condition: on-failure
[root@server2 ~]# docker stack deploy web -c webcluser.yml 

 

 版本仍旧为v1,进程个数改为6个

[root@server2 ~]# vim webcluser.yml 
[root@server2 ~]# docker stack deploy web -c webcluser.yml

[root@server2 ~]# vim webcluser.yml   ##修改版本为v2
[root@server2 ~]# docker stack deploy web -c webcluser.yml

 

 

  node.role == manager指定这个service的实例均运行在swarm manager节点上,不会分到worker节点

[root@server2 ~]# docker service rm viz  ##删除之前的监控
viz
[root@server2 ~]# vim webcluser.yml

  visualizer:
    image: visualizer
    ports:
      - "8080:8080"
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints:
          - "node.role==manager"
[root@server2 ~]# docker stack deploy web -c webcluser.yml 
Updating service web_webcluster (id: srfnr5buaoxdkq4a4b38jbf2c)
Creating service web_visualizer
[root@server2 ~]# docker stack ls
[root@server2 ~]# docker stack ps web

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值