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

Posted doudoutj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第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++
#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

以上是关于第142天学习打卡(Docker yaml规则 开源项目 Docker Swarm)的主要内容,如果未能解决你的问题,请参考以下文章

第141天学习打卡(Docker Docker Compose )

第156天学习打卡(Kubernetes 搭建监控平台 高可用集群部署 )

第139天学习打卡(Docker 发布自己的镜像 Docker网络)

第139天学习打卡(Docker 发布自己的镜像 Docker网络)

第137天学习打卡(Docker DockerFile)

第138天学习打卡(Docker 实战测试 Tomcat)