第142天学习打卡(Docker yaml规则 开源项目 Docker Swarm)

yaml规则

docker-compose.yaml 核心

Reference documentation | Docker Documentation

 # 3层
 version: '' #版本
 services: #服务
  服务1:web
   # 服务配置
  images
  build
  network
  ....
  服务2:redis
  ...
  服务3:redis
   
 #其他配置 网络/卷、全局规则
 volumes:
 networks:
 configs:
 
 

此web项目依赖于redis 和postgres,所以启动的时候启动顺序很重要。

image-20210530153901229

 

学习,要掌握规律!

1.官网文档

Compose file | Docker Documentation

2.开源项目 compose.yaml

开源项目

Quickstart: Compose and WordPress | Docker Documentation

博客

下载程序,安装数据库, 配置...

compose应用。=>一键启动

1.下载项目(docker-compose.yaml)

2.如果需要文件Dockerfile

3.文件准备齐全(直接一键启动项目)

 

前台启动

docker-d

后台启动

docker-compose up -d

image-20210530161904861

 [root@kuangshen home]# mkdir my_wordpress
 [root@kuangshen home]# cd my_wordpress/
 [root@kuangshen my_wordpress]# ll
 total 0
 [root@kuangshen my_wordpress]# vim docker-compose.yml
 
 version: "3.9"
     
 services:
  db:
    image: mysql:5.7
    volumes:
       - db_data:/var/lib/mysql
     restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
     
  wordpress:
    depends_on:
       - db
    image: wordpress:latest
    ports:
       - "8000:80"
     restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
 volumes:
  db_data: {}
   
 [root@kuangshen my_wordpress]# docker-compose up
 

 

image-20210530161127245

 

image-20210530161159115

 

点击 安装文字新闻这个选项 ,然后安装成功后,登录就可以了

image-20210530162010579

 

实战

1.创建spring项目

image-20210530162346552

 

2.编写项目微服务

3.dockerfile构建镜像

4.docker-compose.yaml编排项目

5.丢到服务器中启动 docker-compose up

controller HelloController.java

 package com.kuang.demo1.controller;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 @RestController
 public class HelloController {
    @Autowired
    StringRedisTemplate redisTemplate;
 
    @GetMapping("/hello")
    public String hello(){
        Long views = redisTemplate.opsForValue().increment("views");
        return "hello, kuangshen, thank you, views:" + views;
    }
 
 }
 

application.properties

 
 server.port=8080
 spring.redis.host=redis
 
 

Dockerfile

 FROM java:8
 
 COPY *.jar /app.jar
 
 CMD ["--server.port=8080"]
 
 EXPOSE 8080
 
 ENTRYPOINT ["java", "-jar", "/app.jar"]
 

 

docker-compose.yml

 version: '3.9'
 services:
  kuangapp:
    build: .
    image: kuangapp
    depends_on:
      - redis
    ports:
    - "8080:8080"
  redis:
    image: "library/redis:alpine"
 

打包

image-20210530165155445

在Xftp7下创建一个文件"kuangapp"

image-20210530165912690

 

image-20210530170556402

 

image-20210530170937472

 

image-20210530173431864

 

小结:

未来项目只要有docker-compose 文件。按照这个规则,启动编排容器。

公司:有docker-compose文件, 直接启动

网上开源项目 :docker-compose 一键搞定

假设项目要重新部署打包

 docker-compose up --build #重新构建
 

项目启动成功的页面:

image-20210530174836565

 

image-20210530174904688

 

image-20210530174941722

总结:

工程、服务、容器

项目compose:三层

  • 工程Project

  • 服务

  • 容器 运行实例! docker直接管理 k8s

Docker Swarm

集群

购买服务器

4台服务器 2G

image-20210530185207247

 

image-20210530185504149

 

image-20210530185553478

 

image-20210530185648102

 

点击下一步:

image-20210530190109885

 

image-20210530190333775

 

image-20210530191343901

 

然后点击下一步

image-20210530191511163

 

image-20210530191658801

 

image-20210530191735165

 

image-20210530191845145

到此,服务器购买完毕! 1主 3 从

 

 

image-20210530192259893

填写名称和主机号之后, 点击连接

image-20210530192753120

 

image-20210530193130711

image-20210530193231588

 

image-20210530193604567

重复上面的步骤 配置剩余的三个

image-20210530193821829

image-20210530194424799

4台机器安装Docker

和单机一样

技巧:xshell直接同步操作,省时间!

image-20210530194526824

image-20210530200925769

1.yum安装gcc相关环境(需要确保虚拟机可以上外网)

 yum -y install gcc
 yum -y install gcc-c++

2.

 #1.卸载旧的版本
  yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
   # 2.需要的安装包
  yum install -y yum-utils
   # 3.设置镜像的仓库
  yum-config-manager \
     --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
   
  # 建议安装阿里云
  yum-config-manager \
     --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
 #4更新yum软件包索引
  yum makecache fast
 
 
 # 5安装docker相关的内容   docker-ce 社区   ee企业版
  yum install -y docker-ce docker-ce-cli containerd.io
  #6 启动docker
  systemctl start docker
  #7.使用 docker version 查看是否安装成功
 
 
 # 8 配置镜像加速器
 sudo mkdir -p /etc/docker
 sudo tee /etc/docker/daemon.json <<-'EOF'
 {
   "registry-mirrors": ["https://g6yrjrwf.mirror.aliyuncs.com"]
 }
 EOF
 sudo systemctl daemon-reload
 sudo systemctl restart docker
 

 

image-20210530200029128

 

工作模式

image-20210530200153534

操作都在manager上

Raft一致性算法

搭建集群

image-20210530201027575

image-20210530201157552

 

image-20210530201351089

 

image-20210530202136371

初始化节点docker swarm init --advertise-addr

docker swarm join加入一个节点!

 #获取令牌
 docker swarm join-token manager #主节点令牌
 docker swarm join-token worker

image-20210530202624431

 

image-20210530203051130

 

image-20210530203221133

 

image-20210530203430440

 

image-20210530203501423

集群搭建完毕:

image-20210530203621496

1.生成主节点

2.加入(管理者、 worker 两种角色)

Raft协议

双主双从:假设一个节点挂了, 其他节点是否可用?

Raft协议:保证大多数节点存活才可用。只要 >1 集群至少大于3台!

实验:

1.将docker1机停止,相当于宕机!双主,另外一个节点也不能用了

 #停止的命令
 systemctl stop docker
 # 启动命令
 systemctl start docker
 # 离开集群
 docker swarm leave
 

image-20210530205204356

image-20210530205302923

image-20210530205534747

image-20210530205630851

2.可用将其他节点离开

image-20210530205812017

image-20210530210318350

3.worker就是工作的,管理节点里面使用的命令worker使用不了,管理命令只能在管理节点里面操作。

image-20210530210544260

 

image-20210530210609223

三台机器设置为了管理节点:

image-20210530210827433

把docker1停止之后,docker3,4都可以正常使用

image-20210530211059802

 

image-20210530211135336

image-20210530211202039

继续把docker3停止了, docker-4就使用不了了

image-20210530211429966

 

image-20210530211450655

 

集群要保证可用性, 必须有3个主节点。要有 > 1台管理节点存活!

Raft协议:保证大多数节点存活, 才可以使用,高可用!

体会

弹性 扩缩容 集群

docker-compose up !启动一个项目,单机

集群:swarm docker service

容器=> 服务

容器=> 服务 =>副本

体验:创建服务, 动态扩展服务,动态更新服务!

image-20210530212548349

灰度发布,金丝雀发布:升级不影响使用。

image-20210530213141015

 

 docker run 容器启动! 不具有扩缩容器功能
 docker service 服务!具有扩缩容器功能,滚动更新,灰度发布!
 
 

查看服务: REPLICAS 副本

 [root@iZ2vc9rba8rjfr8lqdfan9Z ~]# docker service create -p 8888:80 --name my-nginx nginx
 ywksjagryj2n7mojxqeujyp9u
 overall progress: 1 out of 1 tasks
 1/1: running   [==================================================>]
 verify: Service converged
 [root@iZ2vc9rba8rjfr8lqdfan9Z ~]# docker service ps my-nginx # 查看服务
 ID             NAME         IMAGE         NODE                     DESIRED STATE   CURRENT STATE           ERROR     PORTS
 dezedmyjs0u8   my-nginx.1   nginx:latest   iZ2vc9rba8rjfr8lqdfan7Z   Running         Running 2 minutes ago            
 [root@iZ2vc9rba8rjfr8lqdfan9Z ~]# docker service ls
 ID             NAME       MODE         REPLICAS   IMAGE         PORTS
 ywksjagryj2n   my-nginx   replicated   1/1 (只启动了一个副本)     nginx:latest   *:8888->80/tcp
 [root@iZ2vc9rba8rjfr8lqdfan9Z ~]#
 [root@iZ2vc9rba8rjfr8lqdfan9Z ~]# docker service inspect my-nginx
 

动态扩缩容:

 [root@iZ2vc9rba8rjfr8lqdfan9Z ~]# docker service update --replicas 3 my-nginx
 my-nginx
 overall progress: 3 out of 3 tasks
 1/3: running   [==================================================>]
 2/3: running   [==================================================>]
 3/3: running   [==================================================>]
 verify: Service converged
 [root@iZ2vc9rba8rjfr8lqdfan9Z ~]# docker service ls
 ID             NAME       MODE         REPLICAS   IMAGE         PORTS
 ywksjagryj2n   my-nginx   replicated   3/3       nginx:latest   *:8888->80/tcp
 [root@iZ2vc9rba8rjfr8lqdfan9Z ~]# docker ps
 CONTAINER ID   IMAGE         COMMAND                 CREATED             STATUS             PORTS     NAMES
 d5c3494b21c6   nginx:latest   "/docker-entrypoint.…"   About a minute ago   Up About a minute   80/tcp   my-nginx.3.jjqt8p1t5ry5bjz7e4l9tqkmc
 [root@iZ2vc9rba8rjfr8lqdfan9Z ~]#
 

就是设置的4台服务器都可以访问

image-20210530214812589

设置了10个my-nginx 服务,集群中任意的节点都可以访问。服务可以有多个副本动态扩缩容实现高可用!

image-20210530215212295

回滚到一个:

 [root@iZ2vc9rba8rjfr8lqdfan9Z ~]# docker service update --replicas 1 my-nginx
 my-nginx
 overall progress: 1 out of 1 tasks
 1/1: running   [==================================================>]
 verify: Service converged
 [root@iZ2vc9rba8rjfr8lqdfan9Z ~]#
 
 [root@iZ2vc9rba8rjfr8lqdfan9Z ~]# docker service scale my-nginx=5
 

 

image-20210530215944025

移除服务:

 [root@iZ2vc9rba8rjfr8lqdfan9Z ~]# docker service rm my-nginx  #移除服务
 my-nginx
 

docker swarm 只要会搭建集群,会启动服务,动态管理容器就可以了!

概念总结

swarm

集群的管理和编号。docker可以初始化一个swarm集群,其他节点可以加入(管理,工作者)

Node

就是一个docker节点。多个节点就组成了一个网络集群。

Service

任务,可以在管理节点或者工作节点来运行。核心,用户访问!

Task

容器内的命令,细节任务。

image-20210530220756258

命令->管理->api->调度->工作节点(创建Task容器维护创建)

服务副本与全局服务

image-20210530221240654

调整service以什么方式运行

 --mode string
 Service mode (replicated or global) (default "replicated")
 
 docker service create --mode replicated --name mytom tomcat:7 默认的
 
 docker service create --mode global --name haha alpine ping baidu.com
 #场景,日志收集
 每一个节点都有自己的日志收集器,过滤。把所有的日志最终再传给日志中心
 服务监控 状态性能
 

扩展:网络模式:"PublishMode":"ingress"

Swarm:

Overlay:

ingress:特殊的Overlay网络!负载均衡的功能! IPVS VIP

虽然docker在4台机器上,实际上网络是一同一个!ingress网络,是一个特殊的Overly网络!

B站学习网址:【狂神说Java】Docker进阶篇超详细版教程通俗易懂哔哩哔哩bilibili

posted @ 2021-05-30 22:32  豆豆tj  阅读(235)  评论(0)    收藏  举报