【狂神说】Docker【进阶篇】

导读:本篇文章讲解 【狂神说】Docker【进阶篇】,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

【狂神说Java】Docker进阶篇超详细版教程通俗易懂_哔哩哔哩_bilibili

官网:https://www.docker.com/

文档地址: https://docs.docker.com/ (Docker 官网文档超级详细)

仓库地址:https://hub.docker.com/

容器单独没有什么意义,有意义的是容器编排

1、Docker Compose

1.1 Compose 概念

Docker Compose 作用

Docker
DockerFile build run手动操作,单个容器!
微服务。100个微服务!依赖关系。
Docker Compose来轻松高效的管理容器i。

作用:批量容器编排

Docker Compose 概念

Compose是一个用于定义和运行多容器Docker应用程序的工具

使用Compose,您可以使用yaml文件配置应用程序的服务。然后,使用一个命令,从配置中创建并启动所有服务

使用Compose基本上是一个三步过程:

  1. 使用 定义应用的环境,以便可以在任何位置重现它。Dockerfile
  2. 定义构成应用的服务,以便它们可以在隔离的环境中一起运行。docker-compose.yml
  3. 运行,Docker 撰写命令将启动并运行整个应用。您也可以使用 docker-compose 二进制文件运行

docker-compose.yml (yaml配置文件)示列:

version: "3.9"  # optional since v1.27.0
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

理解

Compose是Docker官方的开源项目。需要安装!
Dockerfile让程序在任何地方运行。web服务。redis、mysqk nginx …多个容器。run

docker-compose up 100 个服务。
Compose :重要的概念。

  • 服务services: 容器。应用。(web、redis、mysql…)
  • 项目project: 一组关联的容器。博客、web网站

1.2 安装 Compose

Install Docker Compose | Docker Documentation

官方下载地址慢,不推荐官方的下载地址,使用国内的镜像

1、运行以下命令下载 Docker Compose 的当前稳定版本:

curl -L https://dn-dao-github-mirror.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
[root@192 compose]# curl -L https://dn-dao-github-mirror.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 16.7M  100 16.7M    0     0  2672k      0  0:00:06  0:00:06 --:--:-- 3033k

2、将可执行权限应用于二进制文件:

chmod +x /usr/local/bin/docker-compose

3、安装成功

[root@192 bin]# docker-compose version
docker-compose version 1.25.5, build 8a1c60f6
docker-py version: 4.1.0
CPython version: 3.7.5
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

1.3 Compose 快速开始

目标

​ 在此页面上,您将构建一个在 Docker Compose 上运行的简单 Python Web 应用程序。该应用程序使用 Flask 框架,并在 Redis 中维护一个命中计数器。虽然该示例使用 Python,但即使您不熟悉此处演示的概念,也应该可以理解它。

先决条件

​ 确保你已经安装了 Docker 引擎Docker Compose。您不需要安装Python或Redis,因为两者都是由Docker映像提供的。

1.3.1 设置

定义应用程序依赖项。

1、为项目创建目录:

$ mkdir composetest
$ cd composetest

项目目录:/home/composetest

[root@192 composetest]# pwd
/home/composetest

2、创建一个在项目目录中调用的文件,并将其粘贴到:app.py(pythonw文件)

import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits') # 自增
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)

@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

在此示例中,是应用程序网络上 redis 容器的主机名。我们使用 Redis 的默认端口(6379)。

创建在项目目录中调用的另一个文件,并将其粘贴到:`requirements.txt`
flask
redis

1.3.2 创建 Docker 文件

​ 在此步骤中,您将编写一个构建 Docker 映像的 Docker 文件。该映像包含 Python 应用程序所需的所有依赖项,包括 Python 本身。

​ 在项目目录中,创建一个名为以下内容并粘贴以下内容的文件:Dockerfile

# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]

这告诉 Docker:

  • 从 Python 3.7 映像开始构建映像。
  • 将工作目录设置为 。/code
  • 设置命令使用的环境变量。flask
  • 安装 gcc 和其他依赖项
  • 复制并安装 Python 依赖项。requirements.txt
  • 向映像添加元数据以描述容器正在侦听端口 5000
  • 将项目中的当前目录复制到映像中的 workdir。.``.
  • 将容器的缺省命令设置为 。flask run

有关如何编写 Dockerfile 的更多信息,请参阅 Docker 用户指南Dockerfile 参考

1.3.3 在撰写文件中定义服务

创建在项目目录中调用的文件并粘贴以下内容:docker-compose.yml

version: "3"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

此文件定义了两个服务: web(网络服务) 和redis

  • 网络服务

该服务使用从 当前目录中生成的映像。然后,它将容器和主机绑定到公开的端口 。此示例服务使用 Flask Web 服务器的缺省端口。web Dockerfile 5000:5000

  • Redis 服务

该服务使用从 Docker Hub 注册表中提取的公共 Redis 映像。

  • 版本问题version

    version版本不要填太高

docker-compose.yml 版本问题 – soowin – 博客园 (cnblogs.com)

项目文件汇总

[root@192 composetest]# ls
app.py  docker-compose.yml  Dockerfile  requirements.txt

1.3.4 使用撰写构建和运行应用

1、从项目目录中,通过运行 启动应用程序。docker-compose up

$ docker-compose up

在这里插入图片描述

[root@192 composetest]# docker-compose up
Creating network "composetest_default" with the default driver
Building web
Step 1/10 : FROM python:3.7-alpine
# ...
Successfully built f34d94accbfe # 成功built
Successfully tagged composetest_web:latest
# ...
redis_1  | 1:C 05 Feb 2022 03:43:44.272 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1  | 1:C 05 Feb 2022 03:43:44.272 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1  | 1:M 05 Feb 2022 03:43:44.274 * monotonic clock: POSIX clock_gettime
redis_1  | 1:M 05 Feb 2022 03:43:44.275 * Running mode=standalone, port=6379. # redis 端口6379
# ...
redis_1  | 1:M 05 Feb 2022 03:43:44.275 * Ready to accept connections
web_1    |  * Serving Flask app 'app.py' (lazy loading)  # Flask app 'app.py
web_1    |  * Environment: production
web_1    |    Use a production WSGI server instead.
web_1    |  * Debug mode: off
web_1    |  * Running on all addresses.
# 警告:这是一个开发服务器。不要在生产部署中使用它。
web_1    |    WARNING: This is a development server. Do not use it in a production deployment.
web_1    |  * Running on http://172.18.0.2:5000/ (Press CTRL+C to quit) # Flask网页运行成功
web_1    | 192.168.64.1 - - [05/Feb/2022 03:45:00] "GET / HTTP/1.1" 200 - # 访问常规

2、Compose 将拉取 Redis 映像,为代码生成映像,并启动您定义的服务。在这种情况下,代码在生成时静态复制到映像中。

3、内网和外网在浏览器中输入 http://ip:5000/ 以查看正在运行的应用程序,访问成功。

[root@192 ~]# curl http://127.0.0.1:5000/
Hello World! I have been seen 6 times.

在这里插入图片描述

查看运行容器和下载的镜像

[root@192 ~]# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS          PORTS                                       NAMES
69e3e717caab   redis:alpine      "docker-entrypoint.s…"   12 minutes ago   Up 11 minutes   6379/tcp                                    composetest_redis_1
6ee894e2943d   composetest_web   "flask run"              12 minutes ago   Up 11 minutes   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   composetest_web_1

[root@192 ~]# docker images
REPOSITORY        TAG          IMAGE ID       CREATED          SIZE
composetest_web   latest       f34d94accbfe   17 minutes ago   189MB
python            3.7-alpine   e72b511ad78e   5 hours ago      46.4MB
redis             alpine       3900abf41552   2 months ago     32.4MB

composetest_web_1 默认服务名: 文件名_服务名_num
多个服务器,集群。 _num 代表 副本数量

集群状态。服务都不可能只有一个运行实例。弹性,高可用

kubectl service 负载均衡

网络

[root@192 ~]# docker network ls
NETWORK ID     NAME                  DRIVER    SCOPE
72d780a6ab91   bridge                bridge    local
a21a2d695614   composetest_default   bridge    local # 桥接
7e6c1bad6c42   host                  host      local
285b996502c9   none                  null      local
[root@192 ~]# docker network inspect composetest_default 
[root@192 ~]# docker network inspect composetest_default 
[
    {
        "Name": "composetest_default",
        # ...
        "Containers": {
            "69e3e717caab28b75bbc1e7a2ade520efd94508f7835cb6641bb61c530f259a8": {
                "Name": "composetest_redis_1",
                "EndpointID": "982cad680954face54af1e60034399a3d32888ecdfdbf0fbc0de9481966c942a",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            },
            "6ee894e2943d88c35d075f036ebbdab0a46cd5252b48296413c8e95d364b514b": {
                "Name": "composetest_web_1",
                "EndpointID": "1a1e07335b2c8ae04b40f9d2283cf0a0c7d46921fb11aebfbca46a7e2259bc28",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": { # compose
            "com.docker.compose.network": "default",
            "com.docker.compose.project": "composetest",
            "com.docker.compose.version": "1.25.5"
        }
    }
]

关闭服务

docker-compose down

1.4 Yaml配置文件规则

对着文档学习:撰写文件版本 3 参考|Docker 文档

​ yaml配置文件共三层:

version: "3" #第一层 版本

services: #第二层 服务
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

#第三层 其他配置  网络/卷、全局规则
volumes: 
networks: :
config:

学习方法

对着文档学习,不会的找就行,官方文档要详细的解释 撰写文件版本 3 参考|Docker 文档

在这里插入图片描述

depends_on

depends_on:表达服务之间的依赖关系。depends(取决于)

  • 示例:
version: "3.9"
services:
  web:
    build: .
    depends_on: # 表示启动web服务前要先启动db和redis服务
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

服务依赖关系会导致以下行为:

  • docker-compose up按依赖关系顺序启动服务。在示例中,和 db在redis之web前启动。
  • docker-compose up SERVICE自动包含 的依赖项。在示例中,SERVIC Edocker-compose up还创建web 并启动 db 和 redis。
  • docker-compose stop按依赖关系顺序停止服务。在示例中,web 在 db 和 redis 之前停止。

deploy

​ deploy(部署):指定与服务的部署和运行相关的配置。这仅在部署到部署了 docker 堆栈的群 时生效,并且被docker-compose updocker-compose run忽略。

2、使用Compose一键部署博客

使用Compose一键部署WordPress博客(推荐一个开源博客系统,FutureCMS)

Quickstart: Compose and WordPress | Docker Documentation

​ 使用 Docker Compose 在使用 Docker 容器构建的独立环境中轻松运行 WordPress。本快速入门指南演示了如何使用撰写来设置和运行WordPress。

2.1 定义项目

1、创建项目目录/home/my_wordpress

例如,如果您将目录命名为 :my_wordpress

cd my_wordpress/

2、创建一个启动博客的文件和一个单独的实例,其中包含用于数据持久性的卷装载:

docker-compose.yml

version: "3"
    
services:
  db:
    image: mysql:5.7
    volumes:				 # 挂载
      - db_data:/var/lib/mysql 
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress # root用户 的 密码
      MYSQL_DATABASE: wordpress # 数据库名
      MYSQL_USER: wordpress # 数据库用户
      MYSQL_PASSWORD: wordpress # 数据库密码
    
  wordpress:
    depends_on: # 依赖项
      - db
    image: wordpress:latest
    volumes:
      - wordpress_data:/var/www/html
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
volumes:
  db_data: {}
  wordpress_data: {}

2.2 生成项目

现在,从项目目录运行。docker-compose up -d

这将在分离模式下运行 docker-compose,拉取所需的 Docker 映像,并启动 wordpress 和数据库容器,如下面的示例所示。

$ docker-compose up -d
[root@192 my_wordpress]# docker-compose up -d
Creating network "my_wordpress_default" with the default driver
Creating volume "my_wordpress_db_data" with default driver
Creating volume "my_wordpress_wordpress_data" with default driver
Pulling db (mysql:5.7)...
5.7: Pulling from library/mysql
# ...
Digest: sha256:3e28e1e0b732e1828028d7d500eb73f273fc8365215f633414e60cdc631e0d91
Status: Downloaded newer image for wordpress:latest
Creating my_wordpress_db_1 ... done
Creating my_wordpress_wordpress_1 ... done

2.3 启动WordPress

此时,WordPress应该在Docker主机的端口8000上运行,您可以作为WordPress管理员完成”著名的五分钟安装”。

注意:WordPress站点不会立即在端口8000上可用,因为容器仍在初始化中,并且可能需要几分钟才能首次加载。

如果您使用的是 Docker Desktop for Mac 或 Docker Desktop for Windows,则可以将其用作 IP 地址,并在 Web 浏览器中打开。 http://localhost:8000或 http://ip:8000

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.4 关机和清理

查看容器

[root@192 ~]# docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED          STATUS          PORTS                                   NAMES
434c7968618f   wordpress:latest   "docker-entrypoint.s…"   16 minutes ago   Up 16 minutes   0.0.0.0:8000->80/tcp, :::8000->80/tcp   my_wordpress_wordpress_1
93d0e3cbbe5b   mysql:5.7          "docker-entrypoint.s…"   16 minutes ago   Up 16 minutes   3306/tcp, 33060/tcp                     my_wordpress_db_1

命令 docker-compose 将删除容器和默认网络,但保留您的 WordPress 数据库。

该命令删除容器、默认网络和 WordPress 数据库。

$ docker-compose down --volumes

3、实战:自己编写微服务上线

3.1 创建项目

1、控制器

package com.example.compose.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  view = redisTemplate.opsForValue().increment("views");
        return "hello,this views is: "+view;
    }
}

2、application.properties配置文件

# 应用名称
spring.application.name=Compose
# 应用服务 WEB 访问端口
server.port=8080


spring.redis.host=redis

3、编写Dockerfile,用于构建镜像

FROM java:8

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

4、docker-compose.yml 编排项目
在这里插入图片描述

version: "3"
services:
  myapp:
    build: .
    image: myapp
    depends_on:
      - redis
    ports:
      - "8080:8080"
  redis:
    image: "redis:alpine"

5、 macen打包

在这里插入图片描述

3.2 FTP安装与配置

关闭防火墙

#关闭防火墙
$ systemctl stop firewalld.service   

#禁止防火墙开机启动
$ systemctl  disable firewalld.service     

安装

#安装
yum install -y vsftpd

#设置开机启动
systemctl enable vsftpd.service

#启动
systemctl start vsftpd.service

#停止
systemctl stop vsftpd.service

#查看状态
systemctl status vsftpd.service

3.3 上传文件并运行

上传文件

在这里插入图片描述

运行

失败原因是关闭防火墙之后docker需要重启,执行以下命令重启docker即可:

[root@192 myapp]# service docker restart
Redirecting to /bin/systemctl restart docker.service
docker-compose up
  • 运行成功

在这里插入图片描述

访问测试成功

[root@192 ~]# curl http://127.0.0.1:8080/hello
hello,this views is: 6

在这里插入图片描述

3.4 重新构建

假如项目出错,需要重新构建

docker-compose ip --build

4、Swarm集群搭建

Swarm mode overview | Docker Documentation

4.1 环境准备

MobaXterm免费版都比Xshell好用的多,

学生还是用虚拟机吧,内存不够,两台机子用虚拟机桥接网络就可以连通(推荐工具[RdViewer 远程控制软件)

服务器(虚拟机)ip

192.168.64.134、192.168.64.135、192.168.64.136、192.168.64.137 (4台服务器: 二主(管理)二从(工作))

在这里插入图片描述

1、4台服务器安装docker

​ 同时操作服务器,用虚拟机时用同一镜像时不推荐

在这里插入图片描述

在这里插入图片描述

2、 启动Docker并设置开机自启动

# 启动Docker
$ systemctl start docker

# 查看当前版本号,是否启动成功
$ docker version

# 设置开机自启动
$ systemctl enable docker

4.3 Swarm集群介绍

Docker Swarm 常用命令 – kevin.Xiang – 博客园 (cnblogs.com)

节点工作模式
在这里插入图片描述

搭建集群

$ docker swarm --help

Usage:  docker swarm COMMAND

Manage Swarm 

Commands:
  ca          # Display and rotate the root CA
  init        # 初始化一个Swarm
  join        # 加入一个集群作为一个节点 和/或 管理者
  join-token  # 管理生成的令牌
  leave       # 离开swarm
  unlock      # 解锁swarm
  unlock-key  # 解锁密钥管理
  update      # 更新swarm
$ docker swarm init --help

1、设置主节点(192.168.64.134)

$ docker swarm init --advertise-addr 192.168.64.134
[root@192 ~]# docker swarm init --advertise-addr 192.168.64.134
# Swarm初始化: 当前节点(...)现在是一个manager(管理节点)。
Swarm initialized: current node (n2ws0fm7fvsiniuo9wjmq3dfh) is now a manager.

# 翻译:要添加一个worker(工作节点)到这个swarm,运行以下命令(令牌)
To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-56fs1oaww5jkhsq7f3v2f3fazgm1jgxrvjc1n4cttab8v6bmr8-04efiil88xkppw186vk82y5f1 192.168.64.134:2377

# 翻译:要添加一个swarm(管理节点)到swarm,运行'docker swarm join-token manager',
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

2、生成令牌(管理生成的令牌)

# 生成管理节点的令牌
$ docker swarm join-token manager

# 生成工作节点的令牌
$ docker swarm join-token worker
[root@192 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
# 【添加一个管理节点的命令】
    docker swarm join --token SWMTKN-1-56fs1oaww5jkhsq7f3v2f3fazgm1jgxrvjc1n4cttab8v6bmr8-4bocoqdhfypuppql3yqxt0u2p 192.168.64.134:2377

[root@192 ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:
# 【添加一个工作节点的命令】
    docker swarm join --token SWMTKN-1-56fs1oaww5jkhsq7f3v2f3fazgm1jgxrvjc1n4cttab8v6bmr8-04efiil88xkppw186vk82y5f1 192.168.64.134:2377

3、将服务器(192.168.64.135)加入工作节点(在192.168.64.135运行命令)

# 【添加一个工作节点的命令】
$ docker swarm join --token SWMTKN-1-56fs1oaww5jkhsq7f3v2f3fazgm1jgxrvjc1n4cttab8v6bmr8-04efiil88xkppw186vk82y5f1 192.168.64.134:2377
[root@192 ~]# docker swarm join --token SWMTKN-1-56fs1oaww5jkhsq7f3v2f3fazgm1jgxrvjc1n4cttab8v6bmr8-04efiil88xkppw186vk82y5f1 192.168.64.134:2377
This node joined a swarm as a worker.# 成功变为工作节点

4、查看所有节点信息

[root@192 ~]# docker node ls
ID                            HOSTNAME         STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
n2ws0fm7fvsiniuo9wjmq3dfh *   192.168.64.134   Ready     Active         Leader           20.10.12
y1clyylemoiqbrquha4hpgdg7     192.168.64.135   Ready     Active                          20.10.12

5、将服务器(192.168.64.136)加入工作节点

# 【添加一个工作节点的命令】
$ docker swarm join --token SWMTKN-1-56fs1oaww5jkhsq7f3v2f3fazgm1jgxrvjc1n4cttab8v6bmr8-04efiil88xkppw186vk82y5f1 192.168.64.134:2377
[root@192 ~]# docker swarm join --token SWMTKN-1-56fs1oaww5jkhsq7f3v2f3fazgm1jgxrvjc1n4cttab8v6bmr8-04efiil88xkppw186vk82y5f1 192.168.64.134:2377
This node joined a swarm as a worker.
# 查看所有节点信息
[root@192 ~]# docker node ls 
ID                            HOSTNAME         STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
n2ws0fm7fvsiniuo9wjmq3dfh *   192.168.64.134   Ready     Active         Leader           20.10.12
y1clyylemoiqbrquha4hpgdg7     192.168.64.135   Ready     Active                          20.10.12
29g0dvdvrtajsxr5d6lgutddr     192.168.64.136   Ready     Active                          20.10.12

6、移除节点

# 从swarm中删除一个节点 | -f 删除多个节点
$ docker node rm 节点id
# 管理节点自己离开
$ docker swarm leave --force

[root@192 ~]# docker swarm leave --force
Node left the swarm.

7、将服务器(192.168.64.137)加入管理节点

这里manager加不进去的话应该也是要防火墙开放2377端口或关闭防火墙

# 永久关闭防火墙
$ systemctl disable firewalld
$ systemctl stop firewalld

# 停止并禁用开机启动
$ systemctl disable firewalld
# 【添加一个管理节点的命令】
$ docker swarm join --token SWMTKN-1-56fs1oaww5jkhsq7f3v2f3fazgm1jgxrvjc1n4cttab8v6bmr8-4bocoqdhfypuppql3yqxt0u2p 192.168.64.134:2377
[root@192 ~]# docker swarm join --token SWMTKN-1-56fs1oaww5jkhsq7f3v2f3fazgm1jgxrvjc1n4cttab8v6bmr8-4bocoqdhfypuppql3yqxt0u2p 192.168.64.134:2377
This node joined a swarm as a manager. # 成功进入管理节点

8、查看所有节点信息

[root@192 ~]# docker node ls
ID                            HOSTNAME         STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
n2ws0fm7fvsiniuo9wjmq3dfh *   192.168.64.134   Ready     Active         Leader           20.10.12
y1clyylemoiqbrquha4hpgdg7     192.168.64.135   Ready     Active                          20.10.12
29g0dvdvrtajsxr5d6lgutddr     192.168.64.136   Ready     Active                          20.10.12
mbtufs92q1q1kbsrdkfh3gx7s     192.168.64.137   Ready     Active         Reachable        20.10.12

4.3 Raft一致性协议了解

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

Raft协议:保证大多数节点存活才可用

  • 三个管理器的群体最多可以容忍一个管理器的损失。
  • 一个五管理器群可以容忍最大同时丢失两个管理器节点。
  • 一个N管理器集群最多可以容忍管理器的丢失 (N-1)/2。
  • Docker 建议一个群最多有七个管理器节点。

ps:manager 节点不是越多越好

  • 三个manager节点,停止一个manager之后仍可用
  • 三个manager节点,停止两个manager之后不可用

实验:

1、一个主节点挂了,另一个主节点也不能用了

[root@tencent-h1 ~]# systemctl docker 
[root@tencent-h1 ~]# docker node ls
# 日志含义可能在线的managers太少了。确保半数以上的managers在线。
Error response from daemon: rpc error: code = Unknown desc = The swarm does not have a leader. It's possible that too few managers are online. Make sure more than half of the managers are online.

2、将某一个worker节点离开,仍可用

image-20220101174838615

3、work节点不能查看节点信息,仅用来工作,命令只能在manager(管理节点)上执行

[root@192 ~]# docker node ls
# 来自daemon的错误响应:这个节点不是一个集群管理器。工作节点不能用于查看或修改集群状态。请在管理节点上执行此命令或将当前节点提升为管理节点。
Error response from daemon: This node is not a swarm manager. Worker nodes can't be used to view or modify cluster state. Please run this command on a manager node or promote the current node to a manager.

5、Swarm集群弹性创建服务

扩缩容功能,创建服务,动态扩展服务,更新服务,日志,灰度发布(更新网站(服务)时依旧提出服务,不挂404)

功能:扩缩容功能(扩容:增加容器,缩容:减少容器),灰度发布

目的:创建 nginx 服务、动态扩展服务、动态更新服务

[root@192 ~]# docker service --help

Usage:  docker service COMMAND

Manage services

Commands:
  create      # 创建一个新服务
  inspect     # 显示一个或多个服务的详细信息
  logs        # 获取服务或任务的日志
  ls          # 服务列表
  ps          # 列出一个或多个服务的任务
  rm          # 删除一个或多个服务
  rollback    # 回滚恢复对服务配置的更改
  scale       # 扩展扩展一个或多个复制业务
  update      # 更新服务

1、创建服务(192.168.64.134)

​ 以前是docker run(单机),现在是 docker service (集群)

$ docker service create -p 8888:80 --name my-nginx nginx

2、查看服务(192.168.64.134)

$ docker service ls
[root@192 ~]# docker service ls
ID             NAME       MODE         REPLICAS   IMAGE          PORTS
cccvbtrm38lt   my-nginx   replicated   1/1        nginx:latest   *:8888->80/tcp

虽然是在192.168.64.134机器上创建的,但也有可能跑在其他机器上

$ docker ps
[root@192 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS              PORTS     NAMES
a9c147315120   nginx:latest   "/docker-entrypoint.…"   About a minute ago   Up About a minute   80/tcp    my-nginx.1.z9q9ym9npjh6nx5mrmz0whcfa

查看my-nginx 服务的状态

[root@192 ~]# docker service ps my-nginx
ID             NAME         IMAGE          NODE             DESIRED STATE   CURRENT STATE            ERROR     PORTS
z9q9ym9npjh6   my-nginx.1   nginx:latest   192.168.64.134   Running         Running 28 minutes ago  

3、动态扩缩容,扩容到3个副本 集群中的任意节点都可访问,实现高可用

$ docker service update --replicas 3 my-nginx

[root@192 ~]# 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@192 ~]# docker service ls
ID             NAME       MODE         REPLICAS   IMAGE          PORTS
cccvbtrm38lt   my-nginx   replicated   3/3        nginx:latest   *:8888->80/tcp

4、动态扩缩容(scale 同 updata)

$ docker service scale my-nginx=10
[root@192 ~]# docker service ls
ID             NAME       MODE         REPLICAS   IMAGE          PORTS
cccvbtrm38lt   my-nginx   replicated   10/10       nginx:latest   *:8888->80/tcp

动态更新nginx成3个副本,三台主机上都有nginx服务。(但用第四台主机的ip也能访问到nginx)

在这里插入图片描述

5、动态缩容,回滚到1个

$ docker service scale my-nginx=1
[root@192 ~]# docker service scale my-nginx=1
my-nginx scaled to 1
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service converged 
[root@192 ~]# docker service ls
ID             NAME       MODE         REPLICAS   IMAGE          PORTS
cccvbtrm38lt   my-nginx   replicated   1/1        nginx:latest   *:8888->80/tcp

k8s更难,功能更多。swarm相当于简单版的k8s

Swarm概念总结

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

  • Node
    就是一个docker节点。多个节点就组成了一个网络集群。(管理、工作者)

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

  • Task
    容器内的命令,细节任务!

image-20220101202222870

  • 未完待续

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/92656.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!