tabalt

tabalt 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织 tabalt.net 编辑
编辑

服务端码农(LNMP、Golang)

====================================

技术博客:http://tabalt.net
微信公众号:laotanxiantan

个人动态

tabalt 收藏了文章 · 2月29日

那些干区块链行业的人都在干些什么?

原文链接:https://mp.weixin.qq.com/s/Ku...

近年来区块链相关的概念火得发紫,吸引了不少人入行,那这些真正投身区块链行业的人都在干些什么呢?

通常我们说的“区块链行业”是一个泛称,包含了相互关联又独立成型的三大支柱产业:币圈、矿圈、链圈。 就目前阶段来说,“钱”景最好的是币圈,其次是矿圈,最后是链圈。

币 圈

币圈主要是围绕着数字货币(也称为虚拟货币、加密货币)的发行、支付、证券等方面做工作。

最早同时也最成功的数字货币是比特币(BTC),至今匿名的大佬中本聪(Satoshi Nakamoto)在2008年~2009年发布的比特币白皮书和软件标志着比特币的诞生,在这之后的数字货币发行主要有三种方式:分叉、自研、通证(Token):

1、常见币种中BCH、LTC、DCR、DASH、ZEC等均是通过分叉BTC而来,主要是在性能、隐私性、加密算法等方面有一些不一样的主张。

2、ETH、EOS等则是比较成功的自研项目,他们往往不是满足于发行一个新币,而是尝试做一套支持开发智能合约、去中心化应用的公共平台。

3、通证(Token)发行则主要是借助前述公共平台的能力,以非常快速、简便的方式发行新的币种,这些新币种通常是在业务层面有些创新或融合;通证(Token)打开了数字货币发行的新世界大门,项目众筹(I-C-O)、稳定币(USDT等)、平台币、I-E-O等轮番上演,可谓是百花齐放、鱼龙混杂。

支付是货币的基本功能,为了让数字货币更快更方便的用于交易和流通,诞生了很多优秀的产品,如支持很多币种的在线或离线钱包、支持点对点或担保交易的结算系统、支持数字货币和法定货币互相兑换的平台等。

交易所的出现,让数字货币拥有了很强的证券属性,常见的交易所通常都支持 OTC(C2C)交易、币币交易、合约交易等功能,为投资者提供7x24小时实时在线的数字货币交易服务。参与交易的投资者多了,也衍生出来诸如 量化、基金、借贷等的投资服务。伴随着几轮大牛市,数字货币被越来越多的人认识、接受并参与投资,证券功能相比支付功能发展得要强大的多。

矿 圈

随着技术的发展和竞争的加剧,矿机、矿场、矿池及整合前三者的云算力服务成为矿圈的主要业务模式。

从通俗意义上理解,挖矿是通过计算机产生新的数字货币的过程。早期的数字货币特别是市值最大的比特币通常采用工作量证明(POW)机制来确保去中心化网络的正常运行,并给予参与者数字货币奖励。随着数字货币的价值提升,挖矿的竞争不断加剧,产生新币需要的计算能力也在不断且大幅地增加:最早期的比特币通过个人电脑的CPU即可挖矿,之后运算能力更强的GPU取代了CPU,再往后专用的矿机特别是ASIC(专用集成电路)矿机成为主角。研发ASIC矿机最重要的是专用的高性能芯片的研发,代表着最前沿的技术能力;其次是矿机的稳定性及能效比。矿机的生产通常是通过代工厂,但强大的供应链、物流管理、营销推广、售后服务等能力也是必不可少。

矿场是集中部署矿机的地方,最理想的矿场是按照数据中心的标准来建设,但因成本考虑几乎无法达到。最基本的矿场建设 需要廉价稳定的电力供应、安全宽敞的场地、专业的运维团队等条件,同时需要配备 机架机柜、温度调节、噪音隔离等设施。而廉价稳定的电力做为最重要的资源通常是少数人(公司)拥有的,他们通常会倒卖资源或建设矿场自营挖矿和提供矿机托管服务。

矿池的出现同样也是因为挖矿难度的不断增长,即时你有一台最先进的ASIC矿机,直接挖到币的概率也很低了。矿池能将很多矿机联合起来,形成一个庞大的算力池子,增加获取挖矿奖励的概率。 主要原理是将同一个挖矿任务拆分下发给连接到矿池的矿机,并接收验证矿机提交的计算结果,符合挖矿要求则提交到链上获取奖励,同时也会统计不同矿机的算力,根据算力大小分配获得的奖励。

因为矿机、矿池、矿池的专业性和入门门槛较高,参与挖矿的往往只能是规模较大、资金雄厚的团队和机构,而云算力通过整合矿机、矿场、矿池等方面的优质资源,可以直接交付指定大小的算力,打包成简单易用的挖矿服务直接供普通用户购买,大大降低普通用户参与挖矿的资金、时间、资源、精力成本。

链 圈

区块链脱胎于比特币的底层实现,从狭义上来讲,区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构, 是一种以密码学方式保证不可篡改和不可伪造的去中心化账本的技术。

区块链是数字货币的载体技术,同时经过十几年的发展,人们也逐渐认识到区块链技术的优点和特性可以应用到更为广阔的领域,于是就有那么一些人投身于区块链技术的研究、开发和推广,主要有三部分:造链、DAPP开发、区块链+。

区块链技术的火热,导致研发出来的区块链非常多,像BTC、BCH、ETH、EOS等数字货币的载体链,通常是发布到公网上,由开源社区维护,任何人都可以使用的区块链,可以称为公链。而由FaceBook、百度、腾讯等商业公司主导开发,内网部署,面向应用的链通常称为私链。

DAPP是指在区块链上通过智能合约等技术开发出来的去中心化应用,以公链上面向普通用户的应用居多,如电子宠物、博彩游戏、去中心化交易所、轻度游戏等。区块链+ 则更多是商业公司基于私链结合某个业务领域开发的商业应用,如积分系统、版权证明、去中心化存储、银行证券等。

随着区块链技术的发展,相信会有越来越多的链和基于链的优秀应用诞生。

风险提示:本文提到的所有数字货币均不做为投资建议。

原文链接:https://mp.weixin.qq.com/s/Ku...

查看原文

tabalt 收藏了文章 · 2月29日

联盟链与Hyperledger Fabric介绍

原文链接:http://tabalt.net/blog/consor...

联盟链与Hyperledger Fabric介绍

tabalt
2019.11

联盟链与Hyperledger Fabric介绍

联盟链

联盟链

什么是联盟链?

根据去中心化程度的不同,分化出3种不同应用场景下的区块链:

  • 公有链:全网公开,广大用户可参与
  • 联盟链:用于多个机构之间,允许授权的节点加入网络,可根据权限查询或修改信息
  • 私有链:所有网络中的节点都掌握在一家机构手中

什么是联盟链?

联盟链的优缺点

  • 相比于公有链,联盟链在效率和灵活性上更有优势

    • 交易成本更低,交易只需被几个受信的高算力节点验证就可以,无需全网确认。
    • 节点规模小,可以很好地连接,故障可以迅速通过人工干预来修复。
    • 可以使用确定型的共识算法并缩短区块生成时间,从而更快完成交易。
    • 读写权限可以控制,从而提供更好的隐私保护。
    • 联盟链的参与者可以更容易地达成一致来更新区块链的规则、还原交易、修改余额等。
  • 相比于公有链,联盟链去中心化程度不够

联盟链的优缺点

联盟链的发展前景

  • 联盟链受政策支持

    • 不依赖发币来激励用户参与,无监管问题
    • 不需要耗费大量电力资源挖矿
  • 联盟链是“区块链+”的技术载体

    • 支持已有业务系统中部分数据的上链需求
    • 因联盟而产生的信任创造新的业务方向

联盟链的发展前景

联盟链的发展现状

  • 缺少杀手级应用

    • 落地的很多,叫好的很少
  • 联盟建立困难

    • 将原本不相干甚至互相竞争的机构联合起来需要足够大的影响力
  • 前期投入大而盈利能力弱

    • 不发币,资金来源于传统融资渠道
    • 业务形成规模之前较难盈利
  • 技术瓶颈有待突破

    • 节点数量增长使得网络结构逐渐复杂,性能和稳定性降低
    • 区块链的特性导致难以支持大容量和大规模数据存储

联盟链的发展现状

联盟链的应用探索

联盟链的应用探索

联盟链技术平台

联盟链技术平台

Hyperledger Fabric

Hyperledger Fabric

Hyperledger Fabric 简介

  • Hyperledger是Linux基金会发起旨在推动区块链跨行业应用的开源项目,Fabric是其中最成功的子项目。
  • 具有高度模块化和可配置的体系结构,可支持银行、金融、保险、医疗等广泛的行业用例。
  • 支持以通用编程语言(如Go/Java/Node.js)而非受约束的领域特定语言(DSL)编写智能合约 。
  • 支持可插拔的共识协议以适应特定的信任模型,节点的授权加入方便网络治理,且无需发行加密货币来激励记账。
  • Fabric是一个开源的企业级许可型分布式账本技术平台,他的差异化设计可以提供给企业直接可用的安全性、可伸缩性、机密性和高性能。

Hyperledger Fabric 简介

身份与成员资格 Identity and Membership

  • Fabric使用X.509格式的证书作为身份,来标识区块链网络中的所有参与者,并提供用于确定许可权的一些属性,证书通过证书颁发机构(CA)来颁发。
  • Fabric还提供了一个成员资格服务提供商 (MSP),用于确定哪些CA是受信任的、列出组织成员身份、识别参与者在组织内扮演的特定角色、定义网络和通道访问权限等。

身份与成员资格 Identity and Membership

账本 Ledger

  • Fabric的账本由两个不同但相关的部分组成:世界状态和区块链。 
  • 世界状态(Word-Stat) 保存了账本数据的当前值,可以频繁更改,便于应用程序直接访问,本质是一个KV数据库,当前支持LevelDB和CouchDB。
  • 区块链(Blockchain) 记录了导致当前世界状态的所有更改日志,写入后无法修改,便于历史追踪。

账本 Ledger

智能合约与链码 Smart Contracts and Chaincode

  • 智能合约定义了特定业务流程的交易逻辑,主要在世界状态下放置、获取、删除状态,或查询区块链交易记录,是应用程序开发的重点。
  • 链码是一组用于安装和实例化智能合约的技术容器,一个链码可以包含多个智能合约。

智能合约与链码 Smart Contracts and Chaincode

对等节点 Peer Node

  • 对等节点(简称Peer)组件是Fabric区块链网络的基本元素,它托管着账本和智能合约,且可以同时托管多个账本和多个智能合约。
  • 区块链网络拥有多个组织下的多个对等节点,对等方节点具有通过特定CA颁发的数字证书分配的身份。

对等节点 Peer Node

通道 Channel

  • 通道允许一组特定的对等节点和应用程序在区块链网络内相互通信,通道并不实际存在,而是由物理对等节点集合形成的逻辑结构。
  • 每个通道都有一个完全独立的账本,这意味着完全独立的区块链,以及完全独立的世界状态。
  • 一个组织可以加入多个通道,从而参与多个独立的区块链网络。

通道 Channel

排序服务 Ordering Service

  • Fabric 采用称为排序服务的特殊节点来执行交易的排序并生成区块,形成一种确定性的共识机制,由排序服务生成的任何块都可以保证是最终且正确的,不会产生分叉。
  • 排序服务还维护着允许创建通道(Channel)的组织的列表,还对通道实施基本的访问控制,从而限制了谁可以对其进行数据读写和配置。
  • 排序服务有三种实现,使得排序节点之间对严格的交易顺序达成共识:

    • Solo: 只有一个排序节点,无法容错,但可以用于开发测试环境
    • Kafka:崩溃容错(CFT)机制,选举领导者节点,跟随者复制其决策
    • Raft: 也是崩溃容错(CFT)机制,比Kafka易于配置和管理

排序服务 Ordering Service

区块链网络的构建过程

  • 组织R4 创建网络配置NC4,相关身份证书颁发自证书颁发机构CA4
  • 启动排序服务O4,此时即形成了网络

组织R4启动排序服务O4

  • 组织R4 更新网络配置NC4,允许R1也成为管理员, R1和R4在网络配置上享有同等的权利
  • 网络管理员定义了一个联盟X1,该联盟包含两个成员,组织R1和R2
  • R1和R2的相关身份证书分别有CA1何CA2颁发

组织R1成为管理员,R1和R2形成联盟

  • 使用联盟定义X1为R1和R2创建了通道C1,排序服务O4和通道C1建立连接
  • 通道由完全独立于网络配置的通道配置CC1控制,CC1由对C1拥有同等权利的R1和R2管理

创建通道C1

  • 对等节点P1加入通道C1,P1托管着账本L1、安装了智能合约S5, P1和O4可通过C1互相通信
  • 应用程序A1也加入通道C1, A1通过C1同时连接到P1和O4,A1可通过P1节点上的S5访问L1
  • P1、A1均属于组织R1,相关身份证书由CA1颁发

组织R1的节点P1和应用程序A1加入通道C1

  • 组织R2的对等节点P2和应用程序A2加入通道C1,相关身份证书由CA2颁发
  • 节点P2 也托管了账本L1的副本、安装了智能合约S5
  • 组织R1和R2可以在通过通道C1在一个区块链网络上进行交易

组织R2的节点P2和应用程序A2加入通道C1

  • 定义了一个新联盟X2,包含组织R3和R2,R3相关身份证书由CA3颁发
  • 创建了由R2和R3管理的通道配置CC2,启动了通道C2,形成了一个独立的区块链网络
  • 组织R3的P3和A3加入了C2,组织R2的P2和A2也加入了C2
  • 对等节点P2同时托管了账本L2,安装了智能合约S6,应用程序A2可同时访问两个区块链网络

组织R3的节点P3和应用程序A3加入通道C2

交易的完整流程(形成共识)

阶段1:交易建议(Proposal

  • 应用程序A1生成一个交易建议,发送给每个必须的对等节点以进行签名( endorse )
  • 每个签名节点都使用交易建议独立执行智能合约以生成并返回建议响应,此时不会更新账本
  • 应用程序A1收到足够数量的已签名建议响应,即完成阶段1

阶段1:交易建议(Proposal)

阶段2:排序和打包

  • A1将包含签名的交易建议响应提交到排序服务节点O1
  • O1同时接收批量提交的交易,安排到定义明确序列中,并打包成块
  • O1不判断交易内容而只是机械打包,同时到达的交易顺序和块中的顺序可能也不一致

阶段2:排序和打

阶段3:验证和提交

  • O1将打包好的块分发给对等节点,不在线的节点可后续通过gossip协议从其他节点同步
  • 每个对等节点将独立地但以确定性的方式验证块(签名匹配、未被其他交易造成无效)
  • 无效的交易仍保留在不可变块中,但对等节点会将其标记无效且不更新世界状态
  • 账本更新后,对等节点可以通知连接的应用程序已经处理了交易

阶段3:验证和提交

更多资料

更多资料

原文链接:http://tabalt.net/blog/consor...

查看原文

tabalt 收藏了文章 · 2月29日

CentOS 7 Minimal 虚拟机环境 Kubernetes(k8s)测试集群安装

原文链接:http://tabalt.net/blog/instal...

一、安装CentOS 7 Minimal 64位版 基础虚拟机

1、新建虚拟机,挂载ISO文件,启动后安装,设置root密码
2、登录虚拟机,设置网络

cat /proc/net/dev | grep -v lo  #查看网络设备,如ens33
vim /etc/sysconfig/network-scripts/ifcfg-ens33  #ONBOOT=no修改为ONBOOT=yes
service network restart
ip address  #查看IP地址

3、测试上述IP地址是否能通过SecureCRT/XShell等工具登录
4、安装常用工具

yum install -y net-tools wget vim tree git curl jq ntpdate ntp

5、调整时间

vim /etc/ntp.conf
# 注释以下内容:
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
# 添加以下内容:
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server ntp3.aliyun.com iburst
server ntp4.aliyun.com iburst
server ntp5.aliyun.com iburst
server ntp6.aliyun.com iburst
server ntp7.aliyun.com iburst

systemctl start ntpd.service
systemctl enable ntpd.service

# 设置时区
timedatectl set-timezone Asia/Shanghai
# 将时间写入硬件时钟
timedatectl set-local-rtc 0
# 重启依赖系统时间的服务
systemctl restart rsyslog
systemctl restart crond

二、安装K8s基础环境

1、从上述基础虚拟机 创建完整克隆,命名为 k8s-base-env,启动并登录
2、调整系统设置

# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 关闭邮件服务
systemctl stop postfix
systemctl disable postfix

# 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config 
setenforce 0

# 关闭swap
swapoff -a  #临时
sed -ri 's/.*swap.*/#&/' /etc/fstab  #永久

# 将桥接的IPv4流量传递到iptables
cat > /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
sysctl --system

# 升级内核到4.4
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install -y kernel-lt
grub2-set-default "CentOS Linux (4.4.214-1.el7.elrepo.x86_64) 7 (Core)" #根据具体版本设置
reboot
uname -r
yum update

3、安装基础软件

# 添加阿里云YUM源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# 安装kubeadm、kubelet和kubectl
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet

# 安装Docker
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce-18.06.1.ce-3.el7
systemctl enable docker && systemctl start docker
docker --version

# 安装iptables并清空规则
yum install -y iptables iptables-services
systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save

# 安装ipvs
yum install -y conntrack ipvsadm ipset sysstat libseccomp
modprobe br_netfilter
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules
lsmod | grep -e ip_vs -e nf_conntrack_ipv4

三、安装K8s 集群

0、建议 电脑内存16G以上,并关闭一些耗资源较大的程序
1、从上述 K8s基础环境虚拟机 创建3个带链接的克隆,分别命名为 k8s-master01、k8s-node01、k8s-node02
2、将 k8s-master01的配置调整为2核2G,k8s-node01、k8s-node02的配置调整为2核4G
3、启动以上3个虚拟机并登录,分别设置主机名和hosts

# 根据实际情况配置主机名
hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02 

# 根据实际情况添加hosts配置
vim /etc/hosts
192.168.145.144 k8s-master01
192.168.145.145 k8s-node01
192.168.145.146 k8s-node02

4、分别设置静态IP地址并记录

cat /proc/net/dev | grep -v lo  #查看网络设备,如ens33
vim /etc/sysconfig/network-scripts/ifcfg-ens33  #修改或新增以下下配置项
BOOTPROTO="static" # 默认为dhcp
ONBOOT="yes" #开机启用配置
IPADDR="192.168.145.144" #静态IP地址,根据实际情况分别设置
GATEWAY="192.168.145.2" #默认网关  
DNS1="192.168.145.2" #DNS

service network restart
ip address  #查看IP地址是否生效

5、部署Master节点

# 在k8s-master01上执行
# 生成配置文件
kubeadm init \
  --apiserver-advertise-address=192.168.145.144 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.17.0 \
  --service-cidr=10.1.0.0/16 \
  --pod-network-cidr=10.244.0.0/16

# 查看生成的配置文件  
tree /etc/kubernetes/

# 使用kubectl工具
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes

# 安装Pod网络插件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 
kubectl apply -f kube-flannel.yml

# 上述命令需确保能够访问到quay.io仓库,如长时间未成功拉取镜像可尝试手动拉取
docker pull quay.io/coreos/flannel:v0.11.0-amd64
# 也通过镜像加速拉取后添加tag
docker pull quay.mirrors.ustc.edu.cn/coreos/flannel:v0.11.0-amd64
docker tag quay.mirrors.ustc.edu.cn/coreos/flannel:v0.11.0-amd64 quay.io/coreos/flannel:v0.11.0-amd64

# kube-proxy开启 ipvs
kubectl edit cm kube-proxy -n kube-system #修改:mode: "ipvs"
# 批量删除并自动重建kube-proxy
kubectl get pod -n kube-system | grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
ipvsadm -Ln #查看生成的ipvs规则

6 、部署 Node节点

# 在k8s-node01、k8s-node02上执行
# 前面 kubeadm init输出的日志中找到类似如下的命令,注意IP和token必须是日志中输出的
kubeadm join 192.168.145.144:6443 --token 42w1zg.6ffi04kj88c1kesn \
    --discovery-token-ca-cert-hash sha256:69453c78d7e1c8d1f576e4b08bff84be29fb91b5e0584c67bdf226b85ceb548d
kubectl get nodes

7、测试集群

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get svc | grep nginx #获取IP、对外暴露的端口
nginx        NodePort    10.1.185.226   <none>        80:31721/TCP   2d18h
curl "http://10.1.185.226" #虚拟机内可通过SVC的IP访问
curl "http://192.168.145.144:31721" #虚拟机外可通过节点IP加暴露的NodePort端口访问

# 如镜像拉取失败可通过镜像加速拉取后添加tag
docker pull dockerhub.azk8s.cn/library/nginx
docker tag dockerhub.azk8s.cn/library/nginx library/nginx

8、部署 Dashboard

wget https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended.yaml -O ./kubernetes-dashboard.yaml
vim ./kubernetes-dashboard.yaml # 修改kubernetes-dashboard Service部分
----------
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  type: NodePort #修改Service为NodePort类型
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001 #指定NodePort端口
  selector:
    k8s-app: kubernetes-dashboard
----------

kubectl apply -f ./kubernetes-dashboard.yaml
kubectl get pods,svc -n kubernetes-dashboard

# 如镜像拉取失败可通过镜像加速拉取后添加tag
docker pull dockerhub.azk8s.cn/kubernetesui/metrics-scraper:v1.0.3
docker pull dockerhub.azk8s.cn/kubernetesui/dashboard:v2.0.0-rc5
docker tag dockerhub.azk8s.cn/kubernetesui/metrics-scraper:v1.0.3 kubernetesui/metrics-scraper:v1.0.3
docker tag dockerhub.azk8s.cn/kubernetesui/dashboard:v2.0.0-rc5 kubernetesui/dashboard:v2.0.0-rc5

# 创建service account并绑定默认cluster-admin管理员集群角色
kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
kubectl describe secrets -n kubernetes-dashboard $(kubectl -n kubernetes-dashboard get secret | awk '/dashboard-admin/{print $1}')

# 保存token,在虚拟机外使用火狐浏览器访问如下地址,忽略证书报错
https://192.168.145.144:30001/

原文链接:http://tabalt.net/blog/instal...

查看原文

tabalt 收藏了文章 · 2月29日

CentOS 7 Minimal 虚拟机环境 Kubernetes(k8s)测试集群安装

原文链接:http://tabalt.net/blog/instal...

一、安装CentOS 7 Minimal 64位版 基础虚拟机

1、新建虚拟机,挂载ISO文件,启动后安装,设置root密码
2、登录虚拟机,设置网络

cat /proc/net/dev | grep -v lo  #查看网络设备,如ens33
vim /etc/sysconfig/network-scripts/ifcfg-ens33  #ONBOOT=no修改为ONBOOT=yes
service network restart
ip address  #查看IP地址

3、测试上述IP地址是否能通过SecureCRT/XShell等工具登录
4、安装常用工具

yum install -y net-tools wget vim tree git curl jq ntpdate ntp

5、调整时间

vim /etc/ntp.conf
# 注释以下内容:
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
# 添加以下内容:
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server ntp3.aliyun.com iburst
server ntp4.aliyun.com iburst
server ntp5.aliyun.com iburst
server ntp6.aliyun.com iburst
server ntp7.aliyun.com iburst

systemctl start ntpd.service
systemctl enable ntpd.service

# 设置时区
timedatectl set-timezone Asia/Shanghai
# 将时间写入硬件时钟
timedatectl set-local-rtc 0
# 重启依赖系统时间的服务
systemctl restart rsyslog
systemctl restart crond

二、安装K8s基础环境

1、从上述基础虚拟机 创建完整克隆,命名为 k8s-base-env,启动并登录
2、调整系统设置

# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 关闭邮件服务
systemctl stop postfix
systemctl disable postfix

# 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config 
setenforce 0

# 关闭swap
swapoff -a  #临时
sed -ri 's/.*swap.*/#&/' /etc/fstab  #永久

# 将桥接的IPv4流量传递到iptables
cat > /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
sysctl --system

# 升级内核到4.4
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install -y kernel-lt
grub2-set-default "CentOS Linux (4.4.214-1.el7.elrepo.x86_64) 7 (Core)" #根据具体版本设置
reboot
uname -r
yum update

3、安装基础软件

# 添加阿里云YUM源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# 安装kubeadm、kubelet和kubectl
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet

# 安装Docker
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce-18.06.1.ce-3.el7
systemctl enable docker && systemctl start docker
docker --version

# 安装iptables并清空规则
yum install -y iptables iptables-services
systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save

# 安装ipvs
yum install -y conntrack ipvsadm ipset sysstat libseccomp
modprobe br_netfilter
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules
lsmod | grep -e ip_vs -e nf_conntrack_ipv4

三、安装K8s 集群

0、建议 电脑内存16G以上,并关闭一些耗资源较大的程序
1、从上述 K8s基础环境虚拟机 创建3个带链接的克隆,分别命名为 k8s-master01、k8s-node01、k8s-node02
2、将 k8s-master01的配置调整为2核2G,k8s-node01、k8s-node02的配置调整为2核4G
3、启动以上3个虚拟机并登录,分别设置主机名和hosts

# 根据实际情况配置主机名
hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02 

# 根据实际情况添加hosts配置
vim /etc/hosts
192.168.145.144 k8s-master01
192.168.145.145 k8s-node01
192.168.145.146 k8s-node02

4、分别设置静态IP地址并记录

cat /proc/net/dev | grep -v lo  #查看网络设备,如ens33
vim /etc/sysconfig/network-scripts/ifcfg-ens33  #修改或新增以下下配置项
BOOTPROTO="static" # 默认为dhcp
ONBOOT="yes" #开机启用配置
IPADDR="192.168.145.144" #静态IP地址,根据实际情况分别设置
GATEWAY="192.168.145.2" #默认网关  
DNS1="192.168.145.2" #DNS

service network restart
ip address  #查看IP地址是否生效

5、部署Master节点

# 在k8s-master01上执行
# 生成配置文件
kubeadm init \
  --apiserver-advertise-address=192.168.145.144 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.17.0 \
  --service-cidr=10.1.0.0/16 \
  --pod-network-cidr=10.244.0.0/16

# 查看生成的配置文件  
tree /etc/kubernetes/

# 使用kubectl工具
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes

# 安装Pod网络插件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 
kubectl apply -f kube-flannel.yml

# 上述命令需确保能够访问到quay.io仓库,如长时间未成功拉取镜像可尝试手动拉取
docker pull quay.io/coreos/flannel:v0.11.0-amd64
# 也通过镜像加速拉取后添加tag
docker pull quay.mirrors.ustc.edu.cn/coreos/flannel:v0.11.0-amd64
docker tag quay.mirrors.ustc.edu.cn/coreos/flannel:v0.11.0-amd64 quay.io/coreos/flannel:v0.11.0-amd64

# kube-proxy开启 ipvs
kubectl edit cm kube-proxy -n kube-system #修改:mode: "ipvs"
# 批量删除并自动重建kube-proxy
kubectl get pod -n kube-system | grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
ipvsadm -Ln #查看生成的ipvs规则

6 、部署 Node节点

# 在k8s-node01、k8s-node02上执行
# 前面 kubeadm init输出的日志中找到类似如下的命令,注意IP和token必须是日志中输出的
kubeadm join 192.168.145.144:6443 --token 42w1zg.6ffi04kj88c1kesn \
    --discovery-token-ca-cert-hash sha256:69453c78d7e1c8d1f576e4b08bff84be29fb91b5e0584c67bdf226b85ceb548d
kubectl get nodes

7、测试集群

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get svc | grep nginx #获取IP、对外暴露的端口
nginx        NodePort    10.1.185.226   <none>        80:31721/TCP   2d18h
curl "http://10.1.185.226" #虚拟机内可通过SVC的IP访问
curl "http://192.168.145.144:31721" #虚拟机外可通过节点IP加暴露的NodePort端口访问

# 如镜像拉取失败可通过镜像加速拉取后添加tag
docker pull dockerhub.azk8s.cn/library/nginx
docker tag dockerhub.azk8s.cn/library/nginx library/nginx

8、部署 Dashboard

wget https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended.yaml -O ./kubernetes-dashboard.yaml
vim ./kubernetes-dashboard.yaml # 修改kubernetes-dashboard Service部分
----------
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  type: NodePort #修改Service为NodePort类型
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001 #指定NodePort端口
  selector:
    k8s-app: kubernetes-dashboard
----------

kubectl apply -f ./kubernetes-dashboard.yaml
kubectl get pods,svc -n kubernetes-dashboard

# 如镜像拉取失败可通过镜像加速拉取后添加tag
docker pull dockerhub.azk8s.cn/kubernetesui/metrics-scraper:v1.0.3
docker pull dockerhub.azk8s.cn/kubernetesui/dashboard:v2.0.0-rc5
docker tag dockerhub.azk8s.cn/kubernetesui/metrics-scraper:v1.0.3 kubernetesui/metrics-scraper:v1.0.3
docker tag dockerhub.azk8s.cn/kubernetesui/dashboard:v2.0.0-rc5 kubernetesui/dashboard:v2.0.0-rc5

# 创建service account并绑定默认cluster-admin管理员集群角色
kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
kubectl describe secrets -n kubernetes-dashboard $(kubectl -n kubernetes-dashboard get secret | awk '/dashboard-admin/{print $1}')

# 保存token,在虚拟机外使用火狐浏览器访问如下地址,忽略证书报错
https://192.168.145.144:30001/

原文链接:http://tabalt.net/blog/instal...

查看原文

tabalt 发布了文章 · 2月29日

那些干区块链行业的人都在干些什么?

原文链接:https://mp.weixin.qq.com/s/Ku...

近年来区块链相关的概念火得发紫,吸引了不少人入行,那这些真正投身区块链行业的人都在干些什么呢?

通常我们说的“区块链行业”是一个泛称,包含了相互关联又独立成型的三大支柱产业:币圈、矿圈、链圈。 就目前阶段来说,“钱”景最好的是币圈,其次是矿圈,最后是链圈。

币 圈

币圈主要是围绕着数字货币(也称为虚拟货币、加密货币)的发行、支付、证券等方面做工作。

最早同时也最成功的数字货币是比特币(BTC),至今匿名的大佬中本聪(Satoshi Nakamoto)在2008年~2009年发布的比特币白皮书和软件标志着比特币的诞生,在这之后的数字货币发行主要有三种方式:分叉、自研、通证(Token):

1、常见币种中BCH、LTC、DCR、DASH、ZEC等均是通过分叉BTC而来,主要是在性能、隐私性、加密算法等方面有一些不一样的主张。

2、ETH、EOS等则是比较成功的自研项目,他们往往不是满足于发行一个新币,而是尝试做一套支持开发智能合约、去中心化应用的公共平台。

3、通证(Token)发行则主要是借助前述公共平台的能力,以非常快速、简便的方式发行新的币种,这些新币种通常是在业务层面有些创新或融合;通证(Token)打开了数字货币发行的新世界大门,项目众筹(I-C-O)、稳定币(USDT等)、平台币、I-E-O等轮番上演,可谓是百花齐放、鱼龙混杂。

支付是货币的基本功能,为了让数字货币更快更方便的用于交易和流通,诞生了很多优秀的产品,如支持很多币种的在线或离线钱包、支持点对点或担保交易的结算系统、支持数字货币和法定货币互相兑换的平台等。

交易所的出现,让数字货币拥有了很强的证券属性,常见的交易所通常都支持 OTC(C2C)交易、币币交易、合约交易等功能,为投资者提供7x24小时实时在线的数字货币交易服务。参与交易的投资者多了,也衍生出来诸如 量化、基金、借贷等的投资服务。伴随着几轮大牛市,数字货币被越来越多的人认识、接受并参与投资,证券功能相比支付功能发展得要强大的多。

矿 圈

随着技术的发展和竞争的加剧,矿机、矿场、矿池及整合前三者的云算力服务成为矿圈的主要业务模式。

从通俗意义上理解,挖矿是通过计算机产生新的数字货币的过程。早期的数字货币特别是市值最大的比特币通常采用工作量证明(POW)机制来确保去中心化网络的正常运行,并给予参与者数字货币奖励。随着数字货币的价值提升,挖矿的竞争不断加剧,产生新币需要的计算能力也在不断且大幅地增加:最早期的比特币通过个人电脑的CPU即可挖矿,之后运算能力更强的GPU取代了CPU,再往后专用的矿机特别是ASIC(专用集成电路)矿机成为主角。研发ASIC矿机最重要的是专用的高性能芯片的研发,代表着最前沿的技术能力;其次是矿机的稳定性及能效比。矿机的生产通常是通过代工厂,但强大的供应链、物流管理、营销推广、售后服务等能力也是必不可少。

矿场是集中部署矿机的地方,最理想的矿场是按照数据中心的标准来建设,但因成本考虑几乎无法达到。最基本的矿场建设 需要廉价稳定的电力供应、安全宽敞的场地、专业的运维团队等条件,同时需要配备 机架机柜、温度调节、噪音隔离等设施。而廉价稳定的电力做为最重要的资源通常是少数人(公司)拥有的,他们通常会倒卖资源或建设矿场自营挖矿和提供矿机托管服务。

矿池的出现同样也是因为挖矿难度的不断增长,即时你有一台最先进的ASIC矿机,直接挖到币的概率也很低了。矿池能将很多矿机联合起来,形成一个庞大的算力池子,增加获取挖矿奖励的概率。 主要原理是将同一个挖矿任务拆分下发给连接到矿池的矿机,并接收验证矿机提交的计算结果,符合挖矿要求则提交到链上获取奖励,同时也会统计不同矿机的算力,根据算力大小分配获得的奖励。

因为矿机、矿池、矿池的专业性和入门门槛较高,参与挖矿的往往只能是规模较大、资金雄厚的团队和机构,而云算力通过整合矿机、矿场、矿池等方面的优质资源,可以直接交付指定大小的算力,打包成简单易用的挖矿服务直接供普通用户购买,大大降低普通用户参与挖矿的资金、时间、资源、精力成本。

链 圈

区块链脱胎于比特币的底层实现,从狭义上来讲,区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构, 是一种以密码学方式保证不可篡改和不可伪造的去中心化账本的技术。

区块链是数字货币的载体技术,同时经过十几年的发展,人们也逐渐认识到区块链技术的优点和特性可以应用到更为广阔的领域,于是就有那么一些人投身于区块链技术的研究、开发和推广,主要有三部分:造链、DAPP开发、区块链+。

区块链技术的火热,导致研发出来的区块链非常多,像BTC、BCH、ETH、EOS等数字货币的载体链,通常是发布到公网上,由开源社区维护,任何人都可以使用的区块链,可以称为公链。而由FaceBook、百度、腾讯等商业公司主导开发,内网部署,面向应用的链通常称为私链。

DAPP是指在区块链上通过智能合约等技术开发出来的去中心化应用,以公链上面向普通用户的应用居多,如电子宠物、博彩游戏、去中心化交易所、轻度游戏等。区块链+ 则更多是商业公司基于私链结合某个业务领域开发的商业应用,如积分系统、版权证明、去中心化存储、银行证券等。

随着区块链技术的发展,相信会有越来越多的链和基于链的优秀应用诞生。

风险提示:本文提到的所有数字货币均不做为投资建议。

原文链接:https://mp.weixin.qq.com/s/Ku...

查看原文

赞 2 收藏 2 评论 0

tabalt 发布了文章 · 2月29日

联盟链与Hyperledger Fabric介绍

原文链接:http://tabalt.net/blog/consor...

联盟链与Hyperledger Fabric介绍

tabalt
2019.11

联盟链与Hyperledger Fabric介绍

联盟链

联盟链

什么是联盟链?

根据去中心化程度的不同,分化出3种不同应用场景下的区块链:

  • 公有链:全网公开,广大用户可参与
  • 联盟链:用于多个机构之间,允许授权的节点加入网络,可根据权限查询或修改信息
  • 私有链:所有网络中的节点都掌握在一家机构手中

什么是联盟链?

联盟链的优缺点

  • 相比于公有链,联盟链在效率和灵活性上更有优势

    • 交易成本更低,交易只需被几个受信的高算力节点验证就可以,无需全网确认。
    • 节点规模小,可以很好地连接,故障可以迅速通过人工干预来修复。
    • 可以使用确定型的共识算法并缩短区块生成时间,从而更快完成交易。
    • 读写权限可以控制,从而提供更好的隐私保护。
    • 联盟链的参与者可以更容易地达成一致来更新区块链的规则、还原交易、修改余额等。
  • 相比于公有链,联盟链去中心化程度不够

联盟链的优缺点

联盟链的发展前景

  • 联盟链受政策支持

    • 不依赖发币来激励用户参与,无监管问题
    • 不需要耗费大量电力资源挖矿
  • 联盟链是“区块链+”的技术载体

    • 支持已有业务系统中部分数据的上链需求
    • 因联盟而产生的信任创造新的业务方向

联盟链的发展前景

联盟链的发展现状

  • 缺少杀手级应用

    • 落地的很多,叫好的很少
  • 联盟建立困难

    • 将原本不相干甚至互相竞争的机构联合起来需要足够大的影响力
  • 前期投入大而盈利能力弱

    • 不发币,资金来源于传统融资渠道
    • 业务形成规模之前较难盈利
  • 技术瓶颈有待突破

    • 节点数量增长使得网络结构逐渐复杂,性能和稳定性降低
    • 区块链的特性导致难以支持大容量和大规模数据存储

联盟链的发展现状

联盟链的应用探索

联盟链的应用探索

联盟链技术平台

联盟链技术平台

Hyperledger Fabric

Hyperledger Fabric

Hyperledger Fabric 简介

  • Hyperledger是Linux基金会发起旨在推动区块链跨行业应用的开源项目,Fabric是其中最成功的子项目。
  • 具有高度模块化和可配置的体系结构,可支持银行、金融、保险、医疗等广泛的行业用例。
  • 支持以通用编程语言(如Go/Java/Node.js)而非受约束的领域特定语言(DSL)编写智能合约 。
  • 支持可插拔的共识协议以适应特定的信任模型,节点的授权加入方便网络治理,且无需发行加密货币来激励记账。
  • Fabric是一个开源的企业级许可型分布式账本技术平台,他的差异化设计可以提供给企业直接可用的安全性、可伸缩性、机密性和高性能。

Hyperledger Fabric 简介

身份与成员资格 Identity and Membership

  • Fabric使用X.509格式的证书作为身份,来标识区块链网络中的所有参与者,并提供用于确定许可权的一些属性,证书通过证书颁发机构(CA)来颁发。
  • Fabric还提供了一个成员资格服务提供商 (MSP),用于确定哪些CA是受信任的、列出组织成员身份、识别参与者在组织内扮演的特定角色、定义网络和通道访问权限等。

身份与成员资格 Identity and Membership

账本 Ledger

  • Fabric的账本由两个不同但相关的部分组成:世界状态和区块链。 
  • 世界状态(Word-Stat) 保存了账本数据的当前值,可以频繁更改,便于应用程序直接访问,本质是一个KV数据库,当前支持LevelDB和CouchDB。
  • 区块链(Blockchain) 记录了导致当前世界状态的所有更改日志,写入后无法修改,便于历史追踪。

账本 Ledger

智能合约与链码 Smart Contracts and Chaincode

  • 智能合约定义了特定业务流程的交易逻辑,主要在世界状态下放置、获取、删除状态,或查询区块链交易记录,是应用程序开发的重点。
  • 链码是一组用于安装和实例化智能合约的技术容器,一个链码可以包含多个智能合约。

智能合约与链码 Smart Contracts and Chaincode

对等节点 Peer Node

  • 对等节点(简称Peer)组件是Fabric区块链网络的基本元素,它托管着账本和智能合约,且可以同时托管多个账本和多个智能合约。
  • 区块链网络拥有多个组织下的多个对等节点,对等方节点具有通过特定CA颁发的数字证书分配的身份。

对等节点 Peer Node

通道 Channel

  • 通道允许一组特定的对等节点和应用程序在区块链网络内相互通信,通道并不实际存在,而是由物理对等节点集合形成的逻辑结构。
  • 每个通道都有一个完全独立的账本,这意味着完全独立的区块链,以及完全独立的世界状态。
  • 一个组织可以加入多个通道,从而参与多个独立的区块链网络。

通道 Channel

排序服务 Ordering Service

  • Fabric 采用称为排序服务的特殊节点来执行交易的排序并生成区块,形成一种确定性的共识机制,由排序服务生成的任何块都可以保证是最终且正确的,不会产生分叉。
  • 排序服务还维护着允许创建通道(Channel)的组织的列表,还对通道实施基本的访问控制,从而限制了谁可以对其进行数据读写和配置。
  • 排序服务有三种实现,使得排序节点之间对严格的交易顺序达成共识:

    • Solo: 只有一个排序节点,无法容错,但可以用于开发测试环境
    • Kafka:崩溃容错(CFT)机制,选举领导者节点,跟随者复制其决策
    • Raft: 也是崩溃容错(CFT)机制,比Kafka易于配置和管理

排序服务 Ordering Service

区块链网络的构建过程

  • 组织R4 创建网络配置NC4,相关身份证书颁发自证书颁发机构CA4
  • 启动排序服务O4,此时即形成了网络

组织R4启动排序服务O4

  • 组织R4 更新网络配置NC4,允许R1也成为管理员, R1和R4在网络配置上享有同等的权利
  • 网络管理员定义了一个联盟X1,该联盟包含两个成员,组织R1和R2
  • R1和R2的相关身份证书分别有CA1何CA2颁发

组织R1成为管理员,R1和R2形成联盟

  • 使用联盟定义X1为R1和R2创建了通道C1,排序服务O4和通道C1建立连接
  • 通道由完全独立于网络配置的通道配置CC1控制,CC1由对C1拥有同等权利的R1和R2管理

创建通道C1

  • 对等节点P1加入通道C1,P1托管着账本L1、安装了智能合约S5, P1和O4可通过C1互相通信
  • 应用程序A1也加入通道C1, A1通过C1同时连接到P1和O4,A1可通过P1节点上的S5访问L1
  • P1、A1均属于组织R1,相关身份证书由CA1颁发

组织R1的节点P1和应用程序A1加入通道C1

  • 组织R2的对等节点P2和应用程序A2加入通道C1,相关身份证书由CA2颁发
  • 节点P2 也托管了账本L1的副本、安装了智能合约S5
  • 组织R1和R2可以在通过通道C1在一个区块链网络上进行交易

组织R2的节点P2和应用程序A2加入通道C1

  • 定义了一个新联盟X2,包含组织R3和R2,R3相关身份证书由CA3颁发
  • 创建了由R2和R3管理的通道配置CC2,启动了通道C2,形成了一个独立的区块链网络
  • 组织R3的P3和A3加入了C2,组织R2的P2和A2也加入了C2
  • 对等节点P2同时托管了账本L2,安装了智能合约S6,应用程序A2可同时访问两个区块链网络

组织R3的节点P3和应用程序A3加入通道C2

交易的完整流程(形成共识)

阶段1:交易建议(Proposal

  • 应用程序A1生成一个交易建议,发送给每个必须的对等节点以进行签名( endorse )
  • 每个签名节点都使用交易建议独立执行智能合约以生成并返回建议响应,此时不会更新账本
  • 应用程序A1收到足够数量的已签名建议响应,即完成阶段1

阶段1:交易建议(Proposal)

阶段2:排序和打包

  • A1将包含签名的交易建议响应提交到排序服务节点O1
  • O1同时接收批量提交的交易,安排到定义明确序列中,并打包成块
  • O1不判断交易内容而只是机械打包,同时到达的交易顺序和块中的顺序可能也不一致

阶段2:排序和打

阶段3:验证和提交

  • O1将打包好的块分发给对等节点,不在线的节点可后续通过gossip协议从其他节点同步
  • 每个对等节点将独立地但以确定性的方式验证块(签名匹配、未被其他交易造成无效)
  • 无效的交易仍保留在不可变块中,但对等节点会将其标记无效且不更新世界状态
  • 账本更新后,对等节点可以通知连接的应用程序已经处理了交易

阶段3:验证和提交

更多资料

更多资料

原文链接:http://tabalt.net/blog/consor...

查看原文

赞 1 收藏 1 评论 0

tabalt 发布了文章 · 2月29日

CentOS 7 Minimal 虚拟机环境 Kubernetes(k8s)测试集群安装

原文链接:http://tabalt.net/blog/instal...

一、安装CentOS 7 Minimal 64位版 基础虚拟机

1、新建虚拟机,挂载ISO文件,启动后安装,设置root密码
2、登录虚拟机,设置网络

cat /proc/net/dev | grep -v lo  #查看网络设备,如ens33
vim /etc/sysconfig/network-scripts/ifcfg-ens33  #ONBOOT=no修改为ONBOOT=yes
service network restart
ip address  #查看IP地址

3、测试上述IP地址是否能通过SecureCRT/XShell等工具登录
4、安装常用工具

yum install -y net-tools wget vim tree git curl jq ntpdate ntp

5、调整时间

vim /etc/ntp.conf
# 注释以下内容:
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
# 添加以下内容:
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server ntp3.aliyun.com iburst
server ntp4.aliyun.com iburst
server ntp5.aliyun.com iburst
server ntp6.aliyun.com iburst
server ntp7.aliyun.com iburst

systemctl start ntpd.service
systemctl enable ntpd.service

# 设置时区
timedatectl set-timezone Asia/Shanghai
# 将时间写入硬件时钟
timedatectl set-local-rtc 0
# 重启依赖系统时间的服务
systemctl restart rsyslog
systemctl restart crond

二、安装K8s基础环境

1、从上述基础虚拟机 创建完整克隆,命名为 k8s-base-env,启动并登录
2、调整系统设置

# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 关闭邮件服务
systemctl stop postfix
systemctl disable postfix

# 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config 
setenforce 0

# 关闭swap
swapoff -a  #临时
sed -ri 's/.*swap.*/#&/' /etc/fstab  #永久

# 将桥接的IPv4流量传递到iptables
cat > /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
sysctl --system

# 升级内核到4.4
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install -y kernel-lt
grub2-set-default "CentOS Linux (4.4.214-1.el7.elrepo.x86_64) 7 (Core)" #根据具体版本设置
reboot
uname -r
yum update

3、安装基础软件

# 添加阿里云YUM源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# 安装kubeadm、kubelet和kubectl
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet

# 安装Docker
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce-18.06.1.ce-3.el7
systemctl enable docker && systemctl start docker
docker --version

# 安装iptables并清空规则
yum install -y iptables iptables-services
systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save

# 安装ipvs
yum install -y conntrack ipvsadm ipset sysstat libseccomp
modprobe br_netfilter
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules
lsmod | grep -e ip_vs -e nf_conntrack_ipv4

三、安装K8s 集群

0、建议 电脑内存16G以上,并关闭一些耗资源较大的程序
1、从上述 K8s基础环境虚拟机 创建3个带链接的克隆,分别命名为 k8s-master01、k8s-node01、k8s-node02
2、将 k8s-master01的配置调整为2核2G,k8s-node01、k8s-node02的配置调整为2核4G
3、启动以上3个虚拟机并登录,分别设置主机名和hosts

# 根据实际情况配置主机名
hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02 

# 根据实际情况添加hosts配置
vim /etc/hosts
192.168.145.144 k8s-master01
192.168.145.145 k8s-node01
192.168.145.146 k8s-node02

4、分别设置静态IP地址并记录

cat /proc/net/dev | grep -v lo  #查看网络设备,如ens33
vim /etc/sysconfig/network-scripts/ifcfg-ens33  #修改或新增以下下配置项
BOOTPROTO="static" # 默认为dhcp
ONBOOT="yes" #开机启用配置
IPADDR="192.168.145.144" #静态IP地址,根据实际情况分别设置
GATEWAY="192.168.145.2" #默认网关  
DNS1="192.168.145.2" #DNS

service network restart
ip address  #查看IP地址是否生效

5、部署Master节点

# 在k8s-master01上执行
# 生成配置文件
kubeadm init \
  --apiserver-advertise-address=192.168.145.144 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.17.0 \
  --service-cidr=10.1.0.0/16 \
  --pod-network-cidr=10.244.0.0/16

# 查看生成的配置文件  
tree /etc/kubernetes/

# 使用kubectl工具
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes

# 安装Pod网络插件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 
kubectl apply -f kube-flannel.yml

# 上述命令需确保能够访问到quay.io仓库,如长时间未成功拉取镜像可尝试手动拉取
docker pull quay.io/coreos/flannel:v0.11.0-amd64
# 也通过镜像加速拉取后添加tag
docker pull quay.mirrors.ustc.edu.cn/coreos/flannel:v0.11.0-amd64
docker tag quay.mirrors.ustc.edu.cn/coreos/flannel:v0.11.0-amd64 quay.io/coreos/flannel:v0.11.0-amd64

# kube-proxy开启 ipvs
kubectl edit cm kube-proxy -n kube-system #修改:mode: "ipvs"
# 批量删除并自动重建kube-proxy
kubectl get pod -n kube-system | grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
ipvsadm -Ln #查看生成的ipvs规则

6 、部署 Node节点

# 在k8s-node01、k8s-node02上执行
# 前面 kubeadm init输出的日志中找到类似如下的命令,注意IP和token必须是日志中输出的
kubeadm join 192.168.145.144:6443 --token 42w1zg.6ffi04kj88c1kesn \
    --discovery-token-ca-cert-hash sha256:69453c78d7e1c8d1f576e4b08bff84be29fb91b5e0584c67bdf226b85ceb548d
kubectl get nodes

7、测试集群

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get svc | grep nginx #获取IP、对外暴露的端口
nginx        NodePort    10.1.185.226   <none>        80:31721/TCP   2d18h
curl "http://10.1.185.226" #虚拟机内可通过SVC的IP访问
curl "http://192.168.145.144:31721" #虚拟机外可通过节点IP加暴露的NodePort端口访问

# 如镜像拉取失败可通过镜像加速拉取后添加tag
docker pull dockerhub.azk8s.cn/library/nginx
docker tag dockerhub.azk8s.cn/library/nginx library/nginx

8、部署 Dashboard

wget https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended.yaml -O ./kubernetes-dashboard.yaml
vim ./kubernetes-dashboard.yaml # 修改kubernetes-dashboard Service部分
----------
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  type: NodePort #修改Service为NodePort类型
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001 #指定NodePort端口
  selector:
    k8s-app: kubernetes-dashboard
----------

kubectl apply -f ./kubernetes-dashboard.yaml
kubectl get pods,svc -n kubernetes-dashboard

# 如镜像拉取失败可通过镜像加速拉取后添加tag
docker pull dockerhub.azk8s.cn/kubernetesui/metrics-scraper:v1.0.3
docker pull dockerhub.azk8s.cn/kubernetesui/dashboard:v2.0.0-rc5
docker tag dockerhub.azk8s.cn/kubernetesui/metrics-scraper:v1.0.3 kubernetesui/metrics-scraper:v1.0.3
docker tag dockerhub.azk8s.cn/kubernetesui/dashboard:v2.0.0-rc5 kubernetesui/dashboard:v2.0.0-rc5

# 创建service account并绑定默认cluster-admin管理员集群角色
kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
kubectl describe secrets -n kubernetes-dashboard $(kubectl -n kubernetes-dashboard get secret | awk '/dashboard-admin/{print $1}')

# 保存token,在虚拟机外使用火狐浏览器访问如下地址,忽略证书报错
https://192.168.145.144:30001/

原文链接:http://tabalt.net/blog/instal...

查看原文

赞 2 收藏 2 评论 0

tabalt 发布了文章 · 2019-01-04

而立程序员的2018年杂记

原文链接:https://mp.weixin.qq.com/s/hq...

每当停下脚步回看过往的时候,心里总是会五味杂陈,悲欢离合、功过得失,往往都似粉丝汤里下面条--纠缠不清,并不是那么容易辩证和咂摸,混杂上步入而立之年后的焦虑困惑,再辅以人人自危的经济环境,简直就是一锅料味十足的胡辣汤。

铺张的生活

用铺张二字来形容这一年的生活真不为过,简直是吃喝玩乐样样俱全,废了不少时间,花了不少金钱。比较大的行程有:
1、正月 南岳爬山,感受了 佛教圣地的云雾烟灰
2、清明 京津冀自驾,跑遍了 通州副中心、北三县、天津、雄安新区
3、五一 日本自由行,逛吃了 京都、大阪、奈良
4、端午 草原自驾,到达了 内蒙乌兰布统和张家口草原天路
5、国庆 山东自驾,打卡了 东营、潍坊、蓬莱、青岛、济南
6、十一月 广东闲逛,游荡了 广州、深圳、珠海、惠州、东莞

马虎的工作

工作上只做到了马马虎虎,今年开始真正承担服务端团队的建设与管理工作,因为历史包袱很重,给自己定的首要目标就是减负,因此推动重构清理了不利维护的大批项目,主持迁移了老旧机房部署的大量服务,核心重点服务的保障培养起互备力量。此外陆续面试了近30个人,保证了团队新鲜血液的补充,同时也努力给每个小伙伴创造合适的发挥空间, 尝试给大家支撑和赋能,不敢说做的多么好,总算是没有让这4年半的心血毁在自己面前。

十月底的时候决定放弃现在熟悉稳定的环境,去一个未知的地方,一切从零开始,做一些不一样事情。有纠结、不舍和担忧,但想着如果现在不走出去看看,以后会更难。趁着棱角犹在、激情尚存,给了自己一个折腾的机会,带着梦想再次出发。

荒废的学习

18年在技术上没有什么新的建树,买了很多书和在线课程,但都没好好学习。上半年参加了评级答辩,PPT删改了N遍,算是对这些年做数亿日PV Web服务 架构、研发、运维、保障的经验和积累做了一个总结与回顾;下半年比较匆忙的换了工作,过程中比较深刻的认识到自己在数据结构与算法、操作系统与网络编程、常用开源组件的原理与源码等方面还有很多尚还欠缺和有待加强之处。

此外,平常恶补了一些区块链的知识,看了2本相关的书,算是区块链的各种繁杂概念有了比较清晰的认识,并且因此选择了入坑。基于对前端技术的怀念,写过一个莱茨狗抢购Chrome插件和识车标的小程序,蹭了一些流量,对产品设计与运营有了一些粗浅认识。

尴尬的投资

18年拿了一点钱来开始学习股票,摸索着买卖了几只A股,赶上大熊市,又没有花足够的时间钻研,整体上是盈亏相抵不赚不亏,不过也了解了一些股票与投资相关的知识。数字货币继续在玩,经历了超级过山车行情,还好投入不多损失不大,倒也锻炼了临危不惧、宠辱不惊的心态。

年中的时候把户口迁到了天津,并且在天津武清高村买了一套小三居,打算做为北漂的大本营。等以后交通更便利、配套更完善了,可以开启双城生活,老人孩子在天津,我们则工作日来北京节假日回天津。不过年前的经济环境突然恶化,短期内房价估计还是不太能稳得住,只有希望长期向好了。

觉醒的意识

年初的时候经历了一段至暗时刻,疑云满天,行监坐守,风声鹤唳,以至于一度对任何事情都失去兴趣和信心,好在及时调整心态,泰然处之。经历了就是成长,见识了就是收获。

年中的时候尝试了一下在朋友圈卖法国进口的红酒,初心是做一件跟写代码完全不一样的事,丰富人生体验。然而主要是亲朋好友的支持,没有打开大的局面,需要好好反省复盘一下。通过这件事倒是让自己对微商的认识有了一些变化,朋友中有卖水果、特产等用得上的东西,我都会积极的去购买一些,而出于是体验、支持抑或单纯是消费等的心态已经无所谓了。

下半年听了一堂保险的分享,同事朋友们也越来越多的谈论保险,加上自己有意识去了解的一些知识,逐渐认识并认可保险对个人和家庭的重要性,特别是我们这种背负高杠杆房贷车贷和沉重家庭责任的人,保险可以给我们辛苦打拼积攒下的那点财富打上抵抗意外风险的预防针。因此,做了很长时间的学习调研,结合实际情况,制定了分期实施的保险购买计划。

去广东时见的一些老伙计,还有同在北漂的一些朋友,闲聊之时普遍都透露出迷茫和焦虑,年纪越来越大,责任越来越重,成家立业的压力越来越明显,而拼尽全力攒得的资源和收入却远远没有跟得上。生日那天脑海里突然就冒出个疑问,再过10年当我40岁的时候能成为什么样子?要想得到答案,唯有周全思考、详细规划,拆分1年、3年、5年 等小阶段的目标,稳打稳扎,强力执行,静待花开。

小结

年纪越大越认识到自己的眼界不够高、见识不够广,思考问题、处理事情受了诸多限制,因此这一年来有意识的多去尝试新物、扩展思路、探索边界,做了很多雷厉风行、激进躁动的决定,对错尚无法做出评判,或许亦不再重要,只需立足当下、展望未来、砥砺前行。

已经到来的2019年,还没来得及做详细规划,总的来说生活、工作、学习、投资、意识 五部曲依然都要抓紧,但要做到收敛舍弃,每一项只挑选1~2件最紧急最重要的事情精进突破,稳中求进,奋发有为。

原文链接:https://mp.weixin.qq.com/s/hq...

查看原文

赞 1 收藏 1 评论 0

tabalt 发布了文章 · 2018-09-07

Docker 快速上手学习入门教程

原文链接:http://tabalt.net/blog/docker...

Docker是一个使用Golang开发的开源应用容器引擎,让开发者可以打包应用和依赖到一个轻量级、可移植的镜像中,然后分发到任何流行的Linux机器上,并在这些机器上启动容器,容器之间隔离独立,资源消耗低。

Docker的常见概念

  • 镜像 Image

    镜像是一个分层的文件系统,集成了容器运行时所需的操作系统、应用程序、运行时环境等;镜像是只读的,构建之后内容不会被改变,可被复制和分发。

  • 容器 Container

    容器是由镜像启动的运行时实例,可被启动、停止、删除,容器之间相互隔离,容器对资源的使用可以做限制。容器从镜像启动时,Docker会在镜像的上层创建一个可写层。

  • 镜像仓库 Image Repository

    镜像仓库类似于代码仓库,用来集中存放镜像文件。镜像编译好后推送(push)到仓库中,在运行容器的机器上拉取(pull)下来即完成了镜像的复制和分发。

  • Dockerfile

    Dockerfile是由一系列命令和参数构成的脚本,这些命令基于基础镜像,将业务需要的应用程序和依赖环境打包起来,并最终创建一个新的镜像。

  • 客户端Client和守护进程Daemon

    Docker是C/S(客户端Client-服务器Server)架构模式,客户端是名为docker的命令行工具,服务器是名为dockerd的守护进程,用户通过客户端向服务器提供的接口发送请求和指令,守护进程执行一系列操作后返回给客户端结果。

Docker各组件结构

architecture.jpg

下载&安装&启动 Docker

Docker的官方文档(https://docs.docker.com/install/ )上提供了非常详细的安装流程,简单摘录在CentOS 7.x 上下载Docker社区版并安装的操作命令:

mkdir ~/soft && cd ~/soft
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-18.06.1.ce-3.el7.x86_64.rpm

sudo yum install docker-ce-18.06.1.ce-3.el7.x86_64.rpm
sudo systemctl start docker
sudo docker run hello-world

当控制台输出Hello from Docker!加一大段介绍文字时,安装就大功告成了。

运行Docker的Hello World容器的一些细节

刚刚我们成功运行了Docker提供的Hello World版容器,大致的执行过程如下:

  • 命令行执行的Docker客户端程序,解析出命令run和参数hello-world,并请求Docker Daemon守护进程提供的相关接口
  • Docker Daemon得到要将名为hello-world的镜像启动为容器的请求后,尝试在本地查找名为hello-world的镜像
  • 因为我们是刚安装的Docker,本地并没有这个镜像,Docker Daemon会尝试从官方镜像仓库拉取名为hello-world的镜像
  • 名为hello-world的镜像拉取到本地后,Docker Daemon再真正执行启动容器的操作
  • 容器启动起来后,执行构建镜像时指定的/hello程序,输出Hello from Docker!等介绍文字
  • 介绍文字输出完毕后,/hello程序就退出了,Docker容器也跟着退出

上述流程中,我们的Docker Daemon程序自动拉取了hello-world镜像,也可以通过命令先行拉取下来:

sudo docker pull hello-world

通过下面的命令可以查看本地的镜像列表:

[tabalt@dev ~]$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              2cb0d9787c4d        6 weeks ago         1.85kB

容器运行完退出后,其实还有残留,可通过如下命令看到:

[tanyanping@p10992v ~]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                         PORTS               NAMES
bb61ae864566        hello-world         "/hello"            About an hour ago   Exited (0) About an hour ago                       modest_cray

Dockerfile 指令介绍

Dockerfile由一行行的命令语句组成,支持以 # 开头的注释,主要有四个部分:基础镜像信息、维护者信息、镜像操作指令、容器启动指令。 主要指令列举如下(加*表示常用):

指令作用格式说明
FROM*指定基础镜像FROM <image>
FROM <image>:<tag>
首条指令必须为FROM
可使用多个FROM 创建多个镜像
MAINTAINER指定维护者MAINTAINER <name>
ENV*指定环境变量ENV <key> <value>后续RUN指令和容器中可用
USER指定运行容器的用户USER daemon用户名或UID,对后续的RUN指令生效
WORKDIR指定工作目录WORKDIR /path/to/workdir对后续RUN、CMD、ENTRYPOINT指令生效
VOLUME创建挂载点VOLUME ["/data"]
ONBUILD作为基础镜像时的指令ONBUILD [INSTRUCTION]
RUN*执行命令RUN <command>
RUN ["executable", "param1", "param2"]
前者为/bin/sh -c执行
后者使用 exec 执行
命令较长时可用\换行
ADD*复制文件到容器ADD <src> <dest>路径或URL,tar文件自动解压
COPY*复制文件到容器COPY <src> <dest>源目录为本地目录时,推荐使用
ENTRYPOINT*容器启动后执行的命令ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
不可被docker run的参数覆盖
多条命令只有最后一条生效
CMD*容器启动执行的命令CMD ["executable","param1","param2"]
CMD command param1 param2
CMD ["param1","param2"]
第一种使用exec执行,推荐使用
第二种在/bin/sh中执行,支持交互
第三种是ENTRYPOINT的默认参数
多条CMD命令只有最后一条生效
EXPOSE*指定暴露的端口号EXPOSE <port> [<port>...]

可以通过几个知名项目中的Dockerfile文件来学习一下各个指令的应用:

Dockerfile编译成镜像并运行

编写一个能编译运行并输出Hello Docker!的Dockerfile:

[tabalt@dev ~]$ cd ~/docker/hello-docker/
[tabalt@dev ~/docker/hello-docker]$ cat Dockerfile
FROM alpine:latest

CMD echo "Hello World!"

将Dockerfile编译成名为hello-docker的镜像:

[tabalt@dev ~/docker/hello-docker]$ sudo docker build -t hello-docker:latest ./
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM alpine:latest
latest: Pulling from library/alpine
8e3ba11ec2a2: Already exists 
Digest: sha256:7043076348bf5040220df6ad703798fd8593a0918d06d3ce30c6c93be117e430
Status: Downloaded newer image for alpine:latest
 ---> 11cd0b38bc3c
Step 2/2 : CMD echo "Hello World!"
 ---> Running in 28dc89adf3d5
Removing intermediate container 28dc89adf3d5
 ---> 5614b1e6b7eb
Successfully built 5614b1e6b7eb
Successfully tagged hello-docker:latest

[tabalt@dev ~/docker/hello-docker]$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-docker        latest              5614b1e6b7eb        22 seconds ago      4.41MB
alpine              latest              11cd0b38bc3c        7 weeks ago         4.41MB

运行名为hello-docker的镜像:

[tabalt@dev ~/docker/hello-docker]$ sudo docker run -i -t --rm --net=host hello-docker:latest
Hello World!

Docker客户端常用命令

前面已经见识过Docker的一些客户端命令及用法,接下来再看看一些常用命令的详细介绍:

  • docker version

    客户端和服务端 版本信息

  • docker info

    镜像数、容器数、配置等系统信息

  • docker search

    从Docker Hub中搜索符合条件的镜像

    docker search [OPTIONS] TERM
    
    Options:
        -f, --filter filter   根据提供的条件过滤输出
        --format string   用Go模板语法格式化打印的搜索结果
        --limit int       搜索结果最大条数(默认 25)
        --no-trunc        显示完整输出
    
  • docker pull

    从Docker Hub中拉取或者更新指定镜像

    docker pull [OPTIONS] NAME[:TAG|@DIGEST]
    
    Options:
    -a, --all-tags                下载仓库中所有打TAG的镜像
      --disable-content-trust   跳过镜像验证(默认开启)
      --platform string         如服务器具有多平台功能,可设置平台
    
  • docker login

    登录Docker Hub,需要输入用户名、密码、邮箱

  • docker logout

    退出登录

  • docker images

    列出镜像

    docker images [OPTIONS] [REPOSITORY[:TAG]]
    
    Options:
        -a, --all             显示所有镜像(默认隐藏中间镜像)
            --digests         显示摘要
        -f, --filter filter   根据提供的条件过滤输出
            --format string   用Go模板语法格式化打印的搜索结果
            --no-trunc        显示完整输出
        -q, --quiet           只显示数字ID
    
  • docker ps

    列出容器

    docker ps [OPTIONS]
    
    Options:
        -a, --all             显示所有容器(默认只显示运行中的)
        -f, --filter filter   根据提供的条件过滤输出
            --format string   用Go模板语法格式化打印的搜索结果
        -n, --last int        显示最新创建的n个容器(包含所有状态)(默认为-1)
        -l, --latest          显示最新创建的容器(包含所有状态)
            --no-trunc        显示完整输出
        -q, --quiet           只显示数字ID
        -s, --size            显示文件总大小
    
  • docker rmi

    删除镜像

    docker rmi [OPTIONS] IMAGE [IMAGE...]
    
    Options:
        -f, --force      强制删除镜像
        --no-prune   不要删除未打Tag的父镜像
    
  • docker rm

    删除容器

    docker rm [OPTIONS] CONTAINER [CONTAINER...]
    
    Options:
        -f, --force     强制删除运行中的容器(使用SIGKILL)
        -l, --link      删除指定的链接
        -v, --volumes   删除与容器关联的卷
    
  • docker history

    查看镜像创建历史

    docker history [OPTIONS] IMAGE
    
    Options:
            --format string   用Go模板语法格式化打印的搜索结果
        -H, --human           以人类可读格式打印尺寸和日期(默认为true)
            --no-trunc        显示完整输出
        -q, --quiet           只显示数字ID
    
  • docker start|stop|restart

    启动、停止和重启一个或多个指定容器

  • docker kill

    杀死一个或多个指定容器

  • docker events

    从服务器拉取动态

  • docker save

    将指定镜像保存成 tar 归档文件

  • docker load

    从 tar 镜像归档中载入镜像

  • docker export

    将指定的容器保存成 tar 归档文件

  • docker import

    从归档文件(支持远程文件)创建一个镜像

  • docker top

    查看一个正在运行容器的进程,支持 ps 命令参数。

  • docker inspect

    检查镜像或者容器的参数,默认返回 JSON 格式。

  • docker pause

    暂停某一容器的所有进程。

  • docker unpause

    恢复某一容器的所有进程。

  • docker tag

    标记本地镜像,将其归入某一仓库

    docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
  • docker push

    将镜像推送至远程仓库,默认为 Docker Hub

  • docker logs

    获取容器运行时的输出日志

  • docker run

    启动一个容器,在其中运行指定命令。

    docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    
    Options:
    -a      stdin 指定标准输入输出内容类型,可选 STDIN、STDOUT、STDERR 三项
    -d      后台运行容器,并返回容器ID;
    -i      以交互模式运行容器,通常与 -t 同时使用;
    -t      为容器重新分配一个伪输入终端,通常与 -i 同时使用;
    --name="nginx-lb"           为容器指定一个名称;
    --dns 8.8.8.8               指定容器使用的DNS服务器,默认和宿主一致;
    --dns-search example.com    指定容器DNS搜索域名,默认和宿主一致;
    -h "mars"                   指定容器的hostname;
    -e username="ritchie"       设置环境变量;
    --env-file=[]               从指定文件读入环境变量;
    --net="bridge"              指定容器的网络连接类型,支持 bridge、host、none
    
    # 更多参数请查看 docker help run
    

更多资料

原文链接:http://tabalt.net/blog/docker...

查看原文

赞 6 收藏 5 评论 0

tabalt 评论了文章 · 2018-09-03

基于Docker部署生产环境Ethereum私链集群

项目地址:https://github.com/tabalt/doc...,欢迎Star和参与完善。

本项目旨在建立基于Docker部署的生产环境使用的Ethereum私链集群,在尽可能简化使用的前提下保留足够的灵活性,方便业务快速组建区块链私有网络集群,并基于此开发私有区块链平台应用。

因用到了“多阶段镜像构建”的特性,需要Docker 17.05 以上的版本 编译镜像。

支持的环境变量

我们的Docker镜像做到了开箱即用,但为了能让业务使用特有的配置,我们提供了一些环境变量,可在启动容器时指定并修改默认值。支持的环境变量如下表所列:

变量名默认值说明
HOSTNAMElocalhost容器的主机名
ETHEREUM_HOME/usr/local/ethereum集群根目录
ETHEREUM_DATADIR${ETHEREUM_HOME}/data集群数据目录
ETHEREUM_GENESIS_JSON${ETHEREUM_DATADIR}/genesis.json初始化文件路径
ETHEREUM_BOOTNODE_KEY${ETHEREUM_DATADIR}/bootnode.key启动节点的key文件路径
ETHEREUM_NODE_DATADIR${ETHEREUM_DATADIR}/nodes/${HOSTNAME}节点数据目录
ETHEREUM_NODE_INITFLAG${ETHEREUM_NODE_DATADIR}/init.SUCCESS节点初始化标志文件
ETHEREUM_NODE_ROLEmine节点角色

节点角色

  • 启动节点 bootnode

    启动节点是用来帮助网络中其他节点发现彼此进而连接彼此的引导节点,容器中启动的是专用的bootnode程序,通过 ETHEREUM_BOOTNODE_KEY 环境变量指定启动时所需的key文件。

    因bootnode是高性能轻量级的程序,一般启动一个bootnode角色的容器即可。

  • 挖矿节点 mine

    顾名思义,挖矿节点是用来实际挖矿产生区块并记录数据到区块链上的节点,容器中启动的是geth程序,通常需要跨多个机房部署4个以上挖矿节点组成集群。

    启动时须指定 --networkid 、--etherbase、--bootnodes 等命令参数。

  • 接口节点 rpc

    接口节点是用来处理业务方接口请求的节点,接口节点和挖矿节点互相链接,容器中启动的是geth程序,通常需要在与调用业务方相同的机房部署多个挖矿节点组成集群。接口节点和挖矿节点拆分开是为了提高接口吞吐量和避免和挖矿节点互相干扰。

    启动时须指定和挖矿节点相同的 --networkid 、--bootnodes 等命令参数。

集群架构示例

clusters.png

自定义配置

项目代码中data目录有仅供测试的配置文件,如 bootnode.key 和 genesis.json,可自行修改后再做编译,
也可挂载有自定义配置的共享存储到容器内的/usr/local/ethereum/data目录 覆盖配置文件

项目地址:https://github.com/tabalt/doc...,欢迎Star和参与完善。

查看原文

认证与成就

  • 获得 105 次点赞
  • 获得 2 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 2 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

注册于 2014-10-04
个人主页被 877 人浏览