re.containerbase.startinternal 子容器启动失败_Python项目容器化实践(二) Docker Machine和Docker Swarm...

前言

这篇文章介绍Docker生态中的常被提到的Engine、Machine和Swarm,大家以了解为主,工作需要再深入。

Engine

Docker Engine其实就是我们常说的「Docker」,它是一个C/S模型(Client/Server)的应用,包含如下组件:

  • Daemon。守护进程,属于C/S中的Server( dockerd)

  • REST API。Daemon向外暴露的REST 接口

  • CLI。向外暴露的命令行接口(Command Line API: docker)

f20c1916a0eddc842c2299746f90dc3d.png

客户端访问服务端的方式有三种:

  • 使用命令行工具,如 docker run、 docker ps等等

  • 直接通过调用REST API,如发送一个 curl请求

  • 通过脚本直接和Daemon交互

用户通过Docker CLI向Docker Daemon发送REST API请求。Daemon创建和管理Docker objects(对象),如:

  • images。镜像

  • containers。容器

  • networks。网络

  • volumes。数据卷

ccfc7c0fc821158f8ce4bb7d5ad147ae.png

Machine

在没有Machine之前,Docker的安装流程非常复杂,首先需要登录到相应的主机上,根据官方的安装和配置指南来安装Docker,而且不同的操作系统的安装步骤也不同。

Machine是一个简化Docker Engine安装和管理的命令行工具,这样通过一个简单的命令即可在相应的平台上安装Docker,如本地(macOS、Linux和Windows)、虚拟化平台(VirtualBox、macOS xhyve等),公有云(AWS、Azure、Digital Ocean等)等。使用Machine可以启动、审查、停止和重新启动托管的宿主机、升级 Docker 客户端和守护程序、并配置 Docker 客户端与宿主机通信。

653dce59529dd4166fe3b4b44177b3a8.png

通过图示可以看出来,Machine是管理本地/远程带有Docker Engine的主机的工具, docker-machine create创建的「machine」包含了Daemon和REST API这2部分,Machine自己包含CLI。

我大概演示一下使用Machine的方法:

  • 创建machine。 docker-machine create--driver virtualboxdefault,这就会可以创建一个叫做 default的「机器」,它是Virtualbox类型的,所以可以在Virtualbox管理器里面看到这个虚拟机。

  • 连接到machine。 eval"$(docker-machine env default)",其实就是做了对应的环境变量设置

  • 使用Docker CLI。之后就可以使用 docker ps等命令查看和管理这个主机里面的镜像/容器等内容了

Swarm Mode

Docker Swarm是Docker 官方的集群管理和编排工具,可以将多个Docker主机封装为单个大型的虚拟Docker主机,成为一个容器平台。从 Docker1.12.0+开始 SwarmMode已经内嵌入 Docker Engine,成为子命令 docker swarm可以直接使用。

SwarmMode主要特性如下:

  • 具有容错能力的去中心化设计

  • 服务发现。可以做到Docker集群中节点的动态加入和退出的感知,支持主流的etcd、consul和zookeeper。

  • 负载均衡。让资源分配负载,以达到最优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载。

  • 动态伸缩。服务在判断监测指标超出所设定的上下限时,会按照你的设置触发扩容或缩容。

  • 滚动更新(Rolling updates)。可以实现「零停机时间部署」,下节我们还会再说。

  • 安全传输。集群中的每个节点都执行TLS的相互认证和加密,以确保自己与所有其他节点之间的通信安全。

  • 确保期望状态。Swarm会在后台进行轮训检查,确保实际状态能够满足期望状态的要求。

Swarm 是使用SwarmKit构建的 Docker 引擎内置(原生)的集群管理和编排工具。它包含如下三个重要概念: 节点、服务和任务,我们挨个看。

节点(Node)

运行 Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的 Swarm 集群,这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点。节点分为管理 (manager) 节点和工作 (worker) 节点。

管理节点用于 Swarm 集群的管理,管理节点分发工作单元(称为Task「任务」)到工作节点。docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为领导(leader, 通过Raft协议实现)。管理节点还要通过leader执行维护集群所需状态所需的编排和集群管理任务。

工作节点接收并执行从管理节点分派的任务。默认情况下,管理器节点也作为工作节点运行服务(Service),但是你可以将它们配置为专门运行管理器任务,并且只运行管理器节点。代理在每个工作节点上运行,并报告分配给它的任务。工作节点通知管理节点其分配任务的当前状态,以便管理器可以维护每个工作的所需状态。

c76a5d03e10efea2e644655b6e23858f.png

任务(Task)

任务是Swarm中的最小的调度单位,任务携带Docker容器和在容器中运行的命令。管理节点根据服务中设置的副本(Replicas)数量将任务分配给工作节点。一旦任务被分配给一个节点,它就不能移动到另一个节点。它只能在指定的节点上运行或失败

任务是这么调度的:

14c89d9023c7576f25f4742eb18774b0.png

服务(Service)

服务是指一组任务的集合,它定义了任务的属性,是Swarm系统的中心结构:

e708250ab508fab1befa6cacd5268982.png

服务有两种模式:

  • Replicated services。按照一定规则在各个工作节点上运行指定个数的任务

  • Global services。每个可用节点上运行一个任务

5225c0d1f4edf87a0f0a30979b3f6dc2.png

PS: 两种模式通过 docker service create--mode参数指定。

基本用法

我们创建一个最小的 Swarm 集群,包含一个管理节点和两个工作节点。创建Docker 主机使用Docker Machine:

# 管理节点

❯ docker-machine create -d virtualbox manager # 创建管理节点,名字为manager

❯ docker-machine ssh manager # 登录到管理节点

docker@manager:~$ /sbin/ifconfig eth1 | grep 'inet addr' | cut -d: -f2 | awk '{print $1}'

192.168.99.104 # 获得IP

docker@manager:~$ docker swarm init --advertise-addr 192.168.99.104 # 在管理节点初始化一个Swarm集群,另外Docker主机有多个网卡,所以有多个IP,必须使用 --advertise-addr 指定IP

Swarm initialized: current node (k8cdrnrylrkxpsk4qoyybwpca) is now a manager.

To add a worker to this swarm, run the following command:

docker swarm join --token SWMTKN-1-2gfzia6yrk172e8352jxpolevjr9gx1a9xu95hg0ibkhqat52p-d6j79273adew38s5mzmewgwoo 192.168.99.104:2377 # 记住这句命令

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

❯ docker-machine create -d virtualbox worker1 # 创建工作节点,名字worker1

❯ docker-machine ssh worker1

docker@worker1:~$ docker swarm join --token SWMTKN-1-2gfzia6yrk172e8352jxpolevjr9gx1a9xu95hg0ibkhqat52p-d6j79273adew38s5mzmewgwoo 192.168.99.104:2377 # 从上面直接粘贴来

This node joined a swarm as a worker.

❯ docker-machine create -d virtualbox worker2 # 创建工作节点,名字worker2

❯ docker-machine ssh worker2

docker@worker2:~$ docker swarm join --token SWMTKN-1-2gfzia6yrk172e8352jxpolevjr9gx1a9xu95hg0ibkhqat52p-d6j79273adew38s5mzmewgwoo 192.168.99.104:2377

This node joined a swarm as a worker.

这样集群就做好了,在管理节点看一下状态:

❯ docker-machine ssh manager

docker@manager:~$ docker node ls

ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION

k8cdrnrylrkxpsk4qoyybwpca * manager Ready Active Leader 18.09.9

puzrum9ixbt6holgfk5d8aokl worker1 Ready Active 18.09.9

sqwpb00zh5fp9z2o6r7vnebbt worker2 Ready Active 18.09.9

然后部署Nginx(只能在管理节点运行):

docker@manager:~$ docker service create --replicas 3 -p 80:80 --name nginx nginx:1.17.4-alpine # 创建服务,三个副本,服务监听在80端口

pydkv5ffwfqiv1aua1ylmwhum

overall progress: 3 out of 3 tasks

1/3: running [==================================================>]

2/3: running [==================================================>]

3/3: running [==================================================>]

verify: Service converged

docker@manager:~$ docker service ls # 查看当前Swarm集群运行的服务

ID NAME MODE REPLICAS IMAGE PORTS

pydkv5ffwfqi nginx replicated 3/3 nginx:1.17.4-alpine *:80->80/tcp

# 现在我们使用浏览器,输入任意节点IP(如管理节点的192.168.99.104),都能看到nginx默认页面

docker@manager:~$ docker service logs nginx # 查看Nginx服务的日志

... # 省略输出

docker@manager:~$ docker service scale nginx=5 # 业务高峰期时,扩展服务运行的容器数量

nginx scaled to 5

overall progress: 5 out of 5 tasks

1/5: running [==================================================>]

2/5: running [==================================================>]

3/5: running [==================================================>]

4/5: running [==================================================>]

5/5: running [==================================================>]

verify: Service converged

docker@manager:~$ docker service ps nginx # 查看服务详情

i6xkgnneqbbq nginx.1 nginx:1.17.4-alpine worker2 Running Running 4 minutes ago

f517ogp705ne nginx.2 nginx:1.17.4-alpine manager Running Running 5 minutes ago

... # 省略输出

docker@manager:~$ docker service scale nginx=2 # 业务平稳期时,减少服务运行的容器数量

在Swarm集群中使用Compose文件

在第一篇中我使用 docker-compose.yml一次配置、启动多个容器,在Swarm集群中也可以使用compose文件来配置、启动多个服务。在上一小节中,使用 docker service create一次只能部署一个服务(Nginx),使用 docker-compose.yml可以一次启动多个关联的服务。还是拿lyanna项目的docker-compose.yml体验一下,不过需要修改配置项,添加deploy(如mode和副本数等项),也要去掉一些stack不支持的项(如build、restart等):

version: '3'

services:

db:

image: mysql

environment:

MYSQL_DATABASE: 'test'

MYSQL_USER: 'root'

MYSQL_PASSWORD: ''

MYSQL_ROOT_PASSWORD: ''

MYSQL_ALLOW_EMPTY_PASSWORD: 'true'

volumes:

- my-datavolume:/var/lib/mysql

deploy:

placement:

constraints: [node.role == manager]

redis:

image: redis:alpine

deploy:

mode: replicated

replicas: 3

memcached:

image: memcached:1.5-alpine

deploy:

mode: replicated

replicas: 3

web:

image: 127.0.0.1:5000/lyanna-app

build: .

ports:

- '8000:8000'

volumes:

- .:/app

- ./local_settings.py.tmpl:/app/local_settings.py

depends_on:

- db

- redis

- memcached

environment:

PYTHONPATH: $PYTHONPATH:/usr/local/src/aiomcache:/usr/local/src/tortoise:/usr/local/src/arq:/usr/local/src

command: sh -c './setup.sh && python app.py'

visualizer:

image: dockersamples/visualizer:stable

ports:

- "8080:8080"

stop_grace_period: 1m30s

volumes:

- "/var/run/docker.sock:/var/run/docker.sock"

deploy:

placement:

constraints: [node.role == manager]

volumes:

my-datavolume:

其中有3个需要着重说明的点:

  • visualizer服务提供一个可视化页面,可以从浏览器中很直观的查看集群中各个服务的运行节点,一会会感受到

  • db/redis/memcached/visualizer这几项都添加了deploy项, mode指服务模式, replicas指副本数, placement可以限定满足条件的Node,而避免在不合适的Node进行部署,这里限制db/visualizer都要在管理节点上

  • web加了image项,是一个注册服务的API地址,下面会看到如何注册和推送镜像上去

接着部署:

❯ eval "$(docker-machine env manager)" # 本机切换到管理主机

❯ git clone https://github.com/dongweiming/lyanna # 下载lyanna项目源码,如果原来已经clone了不用再做

❯ cd lyanna

❯ docker service create --name registry --publish published=5000,target=5000 registry:2 # 创建注册服务(名字叫registry),启动在5000端口上

❯ docker-compose -f docker-compose.swarm.yml build # 用Compose的方式启动,这个过程会构建lyanna-app镜像

❯ docker-compose -f docker-compose.swarm.yml push # 把lyanna-app推送给本地的注册服务

❯ docker stack deploy -c docker-compose.swarm.yml lyanna # 部署服务

Ignoring unsupported options: build

Creating network lyanna_default

Creating service lyanna_web

Creating service lyanna_visualizer

Creating service lyanna_db

Creating service lyanna_redis

Creating service lyanna_memcached

现在在浏览器输入 任一节点IP:8080 即可看到各节点运行状态,类似如下效果:

3afb4c07961181b4f1456b2ee7ae6031.png

可以看到:

  • db、visualizer限定在管理节点manager

  • redis/memcached由于副本数和节点数一致,所以每个节点都有一个

  • web和registry由于负载平衡的作用分配到了2个工作节点上,让服务整体看起来比较均衡

在浏览器新的标签页输入 任一节点IP:8000 即可看到lyanna博客效果!

延伸阅读

  1. https://docs.docker.com/engine/docker-overview/

  2. https://www.docker.com/products/container-runtime

  3. https://docs.docker.com/machine/

  4. https://docs.docker.com/engine/swarm/key-concepts/

  5. https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/

  6. https://docs.docker.com/engine/swarm/stack-deploy/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370712.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于设备树的TQ2440的中断(2)

下面以按键中断为例看看基于设备数的中断的用法&#xff1a; 设备树&#xff1a; tq2440_key {compatible "tq2440,key";interrupt-parent <&gpf>;interrupts <0 IRQ_TYPE_EDGE_FALLING>, <1 IRQ_TYPE_EDGE_FALLING>;key_3 <&gpf 2…

计算机里有个不能进入的磁盘分区,新电脑只有一个分区怎么办? 教你们如何不进pe给硬盘创建新分区!...

很多朋友新电脑刚买回来打开发现明明自己机械硬盘1T或者1T机械加128G固态&#xff0c;但是却只有一个或者两个分区&#xff0c;但是又不会分区现在教大家如何不用老毛桃大白菜之类的进pe系统里面就能直接创建新分区1 WinR输入diskmgmt.msc2进入磁盘管理可以查看本机的C盘与E盘的…

OSGi中的权限

在上一篇文章中 &#xff0c;我们介绍了为Java应用程序实现沙箱的方法&#xff0c;在其中我们可以安全地运行移动代码 。 这篇文章探讨了如何在OSGi环境中执行相同的操作。 OSGi OSGi规范 为Java定义了一个动态模块系统 。 因此&#xff0c;它是实施那种可以使您的应用程序动…

HTTP简单教程

目录 HTTP简介 HTTP工作原理 HTTP消息结构 客户端请求消息服务器响应消息实例 HTTP请求方法HTTP响应头信息HTTP状态码 HTTP状态码分类HTTP状态码列表 HTTP content-type对照表 HTTP简介 HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写&…

Reversed-Z详解

在3D渲染管线中&#xff0c;Z这个家伙几乎无处不在&#xff0c;如Z-Buffer&#xff0c;Early-Z&#xff0c;Z-Cull&#xff0c;Z-Test&#xff0c;Z-Write等等&#xff0c;稍有接触图形学的人都会对这些术语有所耳闻。 那么Z到底是什么呢&#xff1f;首先Z当然可以是任意坐标系…

pyqt开发的程序模板_小程序定制开发和模板开发要多少钱?有什么区别?

到现在&#xff0c;小程序开发已经有了1年多的历史&#xff0c;已经达到百万数量级。无论是小程序商城还是小程序游戏&#xff0c;其开发方式不外乎两种&#xff0c;一种是定制开发&#xff0c;另一种是模板开发。对于很多初次接触小程序的客户来说&#xff0c;还不知道小程序的…

html 三列布局(两列自适应,一列固定宽度)

不做过多解释&#xff1a;主要是记录一个完整的布局样式&#xff0c;实现页面大致三列其中左右两列是自适应宽度&#xff0c;中间固定宽度效果。 不多少代码奉上&#xff1a; CSS样式代码&#xff1a; /*********************公共标签样式********************//************…

单曲循环 翻译_歌单 | 单曲循环amp;热评

December2020/12/ 写在前面的话 /本来打算在跨年的时候才更文&#xff0c;但是吧又觉得空出这最后一个月有点苍白&#xff0c;然后最近一直夜半网抑云(敏感ing)就想到可以做一期分享歌单的推文&#xff0c;分享一些最近听得频繁的歌曲(还不是刷抖音刷出来的)。《暧昧》// 王菲徘…

休息使用Jersey –包含JAXB,异常处理和客户端程序的完整教程

最近&#xff0c;我开始使用Jersey API开发一个Restful Web服务项目。 在线提供了一些教程&#xff0c;但是我遇到了异常处理方面的一些问题&#xff0c;而且在使用JaxB和提供异常处理方法的完整项目中找不到任何地方。 因此&#xff0c;一旦我能够使用带有异常处理和客户端程序…

【转】Java方向如何准备BAT技术面试答案(汇总版)

原文地址&#xff1a;http://www.jianshu.com/p/1f1d3193d9e3 这个主题的内容之前分三个篇幅分享过&#xff0c;导致网络上传播的比较分散&#xff0c;所以本篇做了一个汇总&#xff0c;同时对部分内容及答案做了修改&#xff0c;欢迎朋友们吐槽、转发。因为篇幅长度和时间的原…

numpy维度交换_“lazy”的transpose()函数——从numpy 数组的内存布局讲起

1 数组的两种内存布局方式行优先与列优先首先我们回顾一下&#xff0c;矩阵数据在内存中的两种布局方式&#xff1a;行优先&#xff08;row-major&#xff09;&#xff1a;以行为优先单位&#xff0c;在内存中逐行存储/读取&#xff1b;对于多维&#xff0c;意味着当线性扫描内…

云耀服务器切换系统,【计算】云耀服务器-常见操作汇总指南

通过上期的介绍&#xff0c;相信大家对于云耀云服务器的基本知识有了一个了解。云耀云服务器是一个具备独立、完整的操作系统和网络功能&#xff0c;可快速搭建简单应用的新一代云服务器。接下来&#xff0c;本期为大家带来关于云耀云服务器使用中的一些简单方法和小技巧。1.云…

机器学习应该准备哪些数学预备知识?

转 https://www.zhihu.com/question/36324957 https://www.zhihu.com/question/36324957/answer/139408269 机器学习应该准备哪些数学预备知识&#xff1f; 数据分析师&#xff0c;工作中经常使用机器学习模型&#xff0c;但是以调库为主。 自己一直也在研究算法&#xff0c;也…

react usecontext_Vue3原理实战运用,我用40行代码把他装进了React做状态管理

前言vue-next是Vue3的源码仓库&#xff0c;Vue3采用lerna做package的划分&#xff0c;而响应式能力vue/reactivity被划分到了单独的一个package中。如果我们想把它集成到React中&#xff0c;可行吗&#xff1f;来试一试吧。使用示例话不多说&#xff0c;先看看怎么用的解解馋吧…

css的三个特性 背景透明设置

关于行内元素&#xff08;补充一点&#xff09; 行内元素只能容纳文本或其他行内元素。&#xff08;a特殊a里面可以放块级元素&#xff09; 例子&#xff1a; 关于行高tip: 选择器的嵌套层级不应大于3级&#xff0c;位置靠后的限定条件应尽可能的精确。 属性定义必须另起一行…

ccs安装多版本编译器离线_大数据分析:学习工具JDK,在线安装指南

hadoop是使用Java语言开发的并且Hadoop运行需要有Java环境的支持&#xff0c;因此在安装hadoop之前需要安装Java开发环境即JDK(Java Development Kit)。安装前首先向大家介绍以一下本文会用到的几个词&#xff1a;JAVA_HOME:一是为了方便引用&#xff0c;比如&#xff0c;JDK安…

asp.net尚未在web服务器上注册_最新版Web服务器项目详解 00 项目概述

点 击 关 注 上 方&#xff02;两猿社&#xff02;设 为&#xff02;置 顶 或 星 标&#xff02;&#xff0c;干 货 第 一 时 间 送 达。互 联 网 猿 | 两 猿 社TineyWebServerLinux下C轻量级Web服务器&#xff0c;助力初学者快速实践网络编程&#xff0c;搭建属于自己的服务器…

DBMS-基本概念

文件处理系统&#xff08;file-processing system&#xff09;的主要弊端&#xff1a; 数据冗余和不一致&#xff08;data redundancy and inconsistency&#xff09;、数据访问困难&#xff08;difficulty in accessing data&#xff09;、数据孤立&#xff08;data isolation…

python多大孩子可以学_孩子学编程最佳年龄是多大

儿童编程教育已经悄悄地掀起了编程低龄化的热浪。但是很多人会疑惑&#xff0c;到底孩子学编程最佳年龄是多少呢&#xff1f;下面小编就为大家解答一下。孩子学编程最佳年龄 首先&#xff0c;孩子的学习黄金时期是非常重要的。从6岁开始&#xff0c;大多数孩子都可以掌握对基本…

上传文件到华为云云服务器,上传文件到云服务器

上传文件到云服务器 内容精选换一换登录Windows操作系统的弹性云服务器时&#xff0c;需使用密码方式登录。因此&#xff0c;用户需先根据创建弹性云服务器时使用的密钥文件&#xff0c;获取该弹性云服务器初始安装时系统生成的管理员密码(Administrator帐户或Cloudbase-init设…