GTLC全球技术领导力峰会·上海站,首批讲师正式上线! 了解详情
写点什么

手把手教你安装第一个 LAIN 应用(下)

2020 年 2 月 10 日

手把手教你安装第一个LAIN应用(下)

## 接上文


三、第一个 LAIN 应用

本节会演示如何基于 LAIN 集群创建一个 LAIN 应用,它提供 HTTP 服务,当用户访问 / 时,返回 Hello, LAIN.


1、前置条件

  • 首先需要一个 LAIN 集群,建议由 2 个节点组成

  • 其次需要本地的开发环境。具体步骤见安装 LAIN 客户端。


LAIN 是基于 docker 的 PaaS 系统,建议先了解下 docker 的基本概念: - Docker 官方文档https://docs.docker.com/ - Docker 从入门到实践https://yeasy.gitbooks.io/docker_practice/content/


2、业务代码


package main
import ( "net/http")
func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello, LAIN.")) })
http.ListenAndServe(":8080", nil)}
复制代码


代码的逻辑为:


  • 监听 0.0.0.0:8080 端口

  • 收到 /的 HTTP 请求时,返回 Hello, LAIN.


3、lain.yaml

lain.yaml 是 LAIN 应用的配置文件,如下例所示:



appname: hello-world # 应用名,在集群内唯一,由小写字母、数字和 `-` 组成,且开头不能为数字,不能有连续的 `-`
build: # 描述如何构建 hello-world:build-${git-committer-date}-${git-commit-hash} 镜像 base: golang:1.8 # 基础镜像,类似于 Dockerfile 里的 FROM script: - go build -o hello-world # 编译指令,类似于 Dockerfile 里的 RUN,WORKDIR 为 /lain/app
proc.web: # 定义一个 proc,名字为 web type: web # proc 类型为 web(LAIN 会为 web 类型的 proc 配置 ${appname}.${LAIN-domain} 的域名,对外提供 HTTP 服务) cmd: /lain/app/hello-world # 因为 WORKDIR 为 /lain/app,所以编译好的程序在 /lain/app 目录下 port: 8080 # hello-world 监听的端口
复制代码


因为我们需要提供 HTTP 服务,所以定义一个 web 类型的 proc,LAIN 集群会为 web 类型的 proc 自动分配 {LAIN-domain} 的域名。


proc.type 为 web 时,其名字也必须为 web,即一个 app 只能有一个 web 类型的 proc,且其名字为 web。


laincloud/hello-world@basic 的完整代码在这里:https://github.com/laincloud/hello-world/tree/basic


4、本地运行


[vagrant@lain ~]$ cd ${hello-world-project} # 进入工程目录
[vagrant@lain hello-world]$ lain build # 构建 hello-world:build-${git-committer-date}-${git-commit-hash} 镜像,生成编译结果>>> Building meta and release images ...>>> found shared prepare image at remote and local, sync ...>>> generating dockerfile to /Users/bibaijin/Projects/go/src/github.com/laincloud/hello-world/Dockerfile>>> building image hello-world:build-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005 ...Sending build context to Docker daemon 6.656 kBStep 1/4 : FROM registry.lain.local/hello-world:prepare-0-1494908044 ---> 7406706a7f21Step 2/4 : COPY . /lain/app/ ---> 45f6215362adRemoving intermediate container 41e822d3b086Step 3/4 : WORKDIR /lain/app/ ---> 75c0f3094b6eRemoving intermediate container 24065cf1d7deStep 4/4 : RUN ( go build -o hello-world ) ---> Running in 43cefd489608 ---> 644f596f83c8Removing intermediate container 43cefd489608Successfully built 644f596f83c8>>> build succeeded: hello-world:build-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005>>> tag hello-world:build-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005 as hello-world:release-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005>>> generating dockerfile to /Users/bibaijin/Projects/go/src/github.com/laincloud/hello-world/Dockerfile>>> building image hello-world:meta-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005 ...Sending build context to Docker daemon 6.656 kBStep 1/2 : FROM scratch --->Step 2/2 : COPY lain.yaml /lain.yaml ---> cfdb9c518f0dRemoving intermediate container ab94a3603b8aSuccessfully built cfdb9c518f0d>>> build succeeded: hello-world:meta-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005>>> Done lain build.
[vagrant@lain hello-world]$ lain run web # 在本地运行>>> run proc hello-world.web.web with image hello-world:release-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d075800559f7fe4b1a7c6214361ecd5e06b19023ab7e02058888aa625749028af7b92954>>> container name: hello-world.web.web>>> port mapping:>>> 8080/tcp -> 0.0.0.0:32769
复制代码


  • lain-cli 的所有命令均需要在包含 lain.yaml 文件的目录下运行。

  • lain-cli 依赖于 git 管理版本,所以要先安装 git,而且在 lain build之前进行 git commit


docker ps 时,可以看到:



CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES59f7fe4b1a7c hello-world:release-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005 "/lain/app/hello-w..." 27 seconds ago Up 31 seconds 0.0.0.0:32769->8080/tcp hello-world.web.web
复制代码


上面的输出表示 lain 通过 docker 把 hello-world.web.web 容器里的 8080 端口映射到了主机的 32769,所以,可以在主机上访问:



[vagrant@lain hello-world]$ curl http://localhost:32769Hello, LAIN.
复制代码


得到了预期的结果。


5、部署到 LAIN 集群

从上一小节可以看到,本地运行没有问题,现在可以部署到 LAIN 集群了:



[vagrant@lain ~]$ cd ${hello-world-project} # 进入工程目录
[vagrant@lain hello-world]$ lain build # 构建 hello-world:build-${git-committer-date}-${git-commit-hash} 镜像,生成编译结果
[vagrant@lain hello-world]$ lain tag local # 类似于 docker tag,为 hello-world:(meta/release)-${git-committer-date}-${git-commit-hash} 镜像添加仓库前缀>>> Taging meta and relese image ...>>> tag hello-world:meta-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005 as registry.lain.local/hello-world:meta-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005>>> tag hello-world:release-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005 as registry.lain.local/hello-world:release-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005>>> Done lain tag.
[vagrant@lain hello-world]$ lain push local # 类似于 docker push,将镜像推送到 LAIN 集群>>> Pushing meta and release images ...>>> pushing image registry.lain.local/hello-world:meta-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005 ...The push refers to a repository [registry.lain.local/hello-world]1a4886bd9611: Layer already existsmeta-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005: digest: sha256:daed70190af5fa980d6963fd3a6350591708c1568e180fe85e7eb6cfdd12d998 size: 524>>> pushing image registry.lain.local/hello-world:release-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005 ...The push refers to a repository [registry.lain.local/hello-world]1a2245680fe1: Layer already existsdfe083dd50ba: Layer already existsedac683c8e67: Layer already exists0372f18510d4: Layer already existsc0b53d6ac422: Layer already existsbcf20a0a17f3: Layer already exists9d039e60afe3: Layer already existsa172d29265f3: Layer already existse6562eb04a92: Layer already exists596280599f68: Layer already exists5d6cbe0dbcf9: Layer already existsrelease-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005: digest: sha256:1cea69b6ed882fcc16f1f5661b3830a8b3f20263264c51d0610b8ec09e72a439 size: 2626>>> Done lain push.
[vagrant@lain hello-world]$ lain deploy local # 将应用部署到 LAIN 集群>>> Begin deploy app hello-world to local ...upgrading... Done.>>> app hello-world deploy operation:>>> last version: 1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005>>> this version: 1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005>>> if shit happened, rollback your app by:>>> lain deploy -v 1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005
复制代码


  • local 为 LAIN 集群的名字,请参考安装 LAIN 客户端中的设置

  • lain tag 为镜像添加仓库前缀,之后才能进行 lain push

  • release 镜像包含了编译成果,将来会以这个镜像为基础运行容器

  • meta 镜像包含 lain.yaml 文件,用于 LAIN 集群解析,用户不需要关心

  • 部署的过程是一个异步的过程,在 lain deploy local 之后可以使用 lain ps local 查询部署结果。


此时,可以通过以下命令访问 hello-world



[vagrant@lain hello-world]$ curl -H "Host: hello-world.lain.local" http://192.168.77.201Hello, LAIN.
复制代码


或者可以先更改 /etc/hosts 文件,然后直接使用域名访问:



[vagrant@lain hello-world]$ echo "192.168.77.201 hello-world.lain.local" >> /etc/hosts[vagrant@lain hello-world]$ curl http://hello-world.lain.localHello, LAIN.
复制代码


上面的 192.168.77.201 是本地 LAIN 集群的虚拟 IP,没有以 vip方式启动,请使用 192.168.77.21


得到了 Hello, LAIN. 的响应,符合我们的预期。


GitHub地址https://github.com/laincloud


白皮书https://laincloud.gitbooks.io/white-paper/content/


相关链接:https://www.infoq.cn/article/7a36HSuKwVFfFWGLBeev


本文转载自宜信技术学院网站。


原文链接:http://college.creditease.cn/detail/254


2020 年 2 月 10 日 21:03174

评论

发布
暂无评论
发现更多内容

绝对坦诚:打造团队自我进化能力的最佳姿势

伴鱼技术团队

团队管理 企业文化 团队协作 技术管理 文化

cpu分析利器 — async-profiler

小楼

Java cpu profiler

ChaosBlade:从零开始的混沌工程(一)

郭旭东

云原生 混沌工程

9种 分布式ID生成方案,我替你整理好了

程序员内点事

Java MySQL 分布式

《龙教授私享会职场沟通心法》最佳学习路线(2020最新版)

ATGU:阿宝哥

《Oracle Java SE编程自学与面试指南》最佳学习路线图(2020最新版)

ATGU:阿宝哥

Elasticsearch-Base

lee

elasticsearch search 搜索

原创 | TDD工具集:JUnit、AssertJ和Mockito (十八)编写测试-测试执行顺序\嵌套的测试

编程道与术

Java 编程 TDD 单元测试 JUnit

为什么你在群里的提的技术问题没人回答?

古时的风筝

程序员 提问的艺术

架构师训练营 - Lesson Week 1

brave heart

极客大学架构师训练营

Java技术奇迹

ATGU:阿宝哥

C#和TS的范型实例化

猫定谔的靴

C# typescript 泛型

前端开发必备工具箱

LeanCloud

CSS 性能优化 前端 vscode 工具

从技术思维角度聊一聊『程序员』摆地摊的正确姿势

牧码哥

随笔杂谈 技术人生 经验分享

ARTS打卡-02

Geek_yansheng25

2020年5月北京BGP机房网络质量评测报告

博睿数据

网络 服务器 存储 机房 主机

PlantUML 的介绍和使用

Puran

UML PlantUML

从SDL到DevSecOps:始终贯穿开发生命周期的安全

Fooying

DevOps SDL DevSecOps 安全开发 软件开发生命周期

分布式系统技术:存储之数据库

奈学教育

分布式

存储让“想象”势不可挡

焱融科技

ARTS-Week 01

chasel

面试官为什么喜欢拿 Kafka 考验求职者

奈学教育

kafka

程序员未来会成为非常内卷的职业?

非著名程序员

程序员 程序人生 职业 职业规划

createRef、useRef、useMemo对比分析和应用场景

费马

React Hooks useRef useMemo createRef

Dubbo Cluster集群那点你不知道的事。

why技术

源码 面试 dubbo 集群容错

实时更新:计算机编程语言排行榜—TIOBE世界编程语言排行榜(2020年6月份最新版)

ATGU:阿宝哥

27岁了,程序员写给自己的一封信

学习Java的小姐姐

程序员 生活 总结 程序媛 职场回顾

读《平凡的世界》

YoungZY

读书

关于Synchronized锁升级,你该了解这些

学习Java的小姐姐

并发编程 synchronized 轻量级锁 偏向锁 重量级锁

持续集成实践系列 」Jenkins 构建 CI 自动化流水线常见技巧 (二)

狂师

持续集成 jenkins jenkins-plugin CI/CD

厉害了,SpaceX-API 开源了

非著名程序员

GitHub 程序员 开源项目

DNSPod与开源应用专场

DNSPod与开源应用专场

手把手教你安装第一个LAIN应用(下)-InfoQ