素材巴巴 > 程序开发 >

Shipyard的源码编译与部署

程序开发 2023-09-14 11:38:23

一、shipyard基本介绍
  shipyard是在Docker Swarm上实现对容器、镜像、docker集群、仓库、节点进行管理的web系统,整个项目通过go语言实现核心逻辑部分。采用golang调用Docker Remote API和使用 angular.js+semantic 实现UI部分,这两部分合起来构成了shipyard的web管理系统。
二、shipyard的生态
  shipyard是由shipyard控制器以及周围生态系统构成。以下按照官网提供的【手动部署方式】的启动顺序进行介绍。
(1)Datastore:shipyard采用rethinkdb作为数据库来保存用户等信息;
(2)Discovery:为了使用Swarm,我们需要一个外部的密钥值存储群容器,shipyard默认采用etcd;
(3)Proxy:默认情况下,Docker Engine只监听socket,我们可以重新配置引擎使用TLS或者使用一个代理容器,从TCP转发请求到Docker监听的UNIX Socket;
(4)Swarm Agent:Swarm管理器;
(5)Controller:shipyard控制器,Remote API和web的实现。  
三、shipyard的部署方式
方式1:官网提供了在线脚本安装方法,这里不再赘述。
https://shipyard-project.com/automated-deployment/
方式2:将源码下载到本地重新编译安装。
基于上面的介绍进行分析,整个项目的编译部署流程安排如下:
1)编译核心代码,即编译controller目录;
2)编译UI部分,即编译controller/static目录;
3)通过controller目录下的Dockerfile文件构建本地shipyard 镜像;
4)按照上面介绍的手动部署方式依次下载相应镜像并启动容器;
5)完成部署。
备注:1)和2)两步可以互换,无先后顺序。

四、实操

我准备先在windows平台调试好shipyard的源码之后,再拷贝到ubuntu上进行编译和部署。
1、在windows平台上对shipyard核心代码调试编译

1)下载源码:github源码地址。
代码目录结构如下:
在这里插入图片描述
2)调试源码:通过LiteIDE或者其它工具打开源码,进入到controller目录进行调试。
  <1>LiteIDE的安装和配置:参考文章;(注:eclipse安装goclipse插件也可以调试go语言源码,但是goclipse插件安装需要翻墙,且配置复杂,初学者不建议使用。)
  <2>源码调试:
  首先,加载项目,如下图所示。
在这里插入图片描述
  由于shipyard是github上的开源项目,所以我们下载到本地的源码在编译时,会提示找不到类似 github.com/Sirupsen/logrus 这样的包,如下图所示。我们要做的就是通过编译调试把所有找不到的包都下载到本地,并按照一定的命名规则存放,同时修改对应的源码。
在这里插入图片描述
  例如:所有go文件中引用了github.com上包的地方,全部替换成packages(也可命名为github.com保持不变,但是为了之后在ubuntu中编译时,与go文件中的github.com进行区分),即,github.com/codegangsta/cli 更改为 packages/codegangsta/cli。然后把下载下来的包放到packages文件夹即可。
在这里插入图片描述
  这里从github上面下载需要的依赖包有点困难,有些包已经404了。其实这些包可以在源码 shipyardGodeps_workspacesrc目录下找到。直接将其拷贝到 GOPATH/src 目录下即可。
  调试完成后,go环境的 GOPATH/src 目录下应该有四个文件夹:shipyard packages golang.org gopkg.in

在这里插入图片描述
  当controller目录下出现 controller.exe 且编译输出信息如下图所示时,说明 controller 目录的文件已经编译成功。以后对于这个项目的二次开发基本都可以在这个文件夹中做修改。
在这里插入图片描述
2、在linux平台上对shipyard进行编译和部署
1)环境配置(具体操作可自行查阅资料实现,相对简单)
  由 shipyard源码的readme.md 可知,linux所需环境如下(我的操作系统是 Ubuntu16.04.1内核 的银河麒麟):
  <1> go语言环境; <2> godep工具;
  <3> nvm;    <4> node.js;    <5> bower;
其中:
  nvm:node.js version management,node.js的版本管理工具;
  node.js:是JavaScript的一种运行环境,是一个让JavaScript运行在服务端的开发平台。node.js中含有npm,npm是node.js的包管理器(package manager)和分发工具;
  bower:前端包管理工具,能够管理Web站点上的各种框架、类库等;
2)编译
  <1> 通过共享文件夹将上面调试好的 GOPATH/src 目录下的四个文件全部拷贝到 linux go环境的 GOPATH/src 目录下,如下图所示。

## 操作指令
 cp -r /mnt/hgfs/myShare/ /home/program_develop/go/src/
 

在这里插入图片描述
  <2> 直接在 controller 目录下执行 go build 对整个目录编译,出现可执行文件 controller,执行该文件可以看到输出结果与windows平台编译输出结果一致,则核心代码编译成功。

/home/program_develop/go/src/shipyard/controller$ go build
 

在这里插入图片描述
在这里插入图片描述
  <3>UI部分编译:进入到 controller/static 目录下,输入如下命令。

/home/program_develop/go/src/shipyard/controller/static$ bower -s install --allow-root -p | xargs echo > /dev/null
 

编译完成后,会在 static 目录下生成一个 bower_components 目录,如下图所示。
在这里插入图片描述
3)生成镜像
  利用 controller 目录下的 Dockerfile 直接构建镜像,命令如下。

## -t 镜像名字及tag
 ## 后面有一个 “.” 表示使用当前目录的 Dockerfile 创建镜像
 docker build -t shipclub/shipyard .
 

结果如下图所示,说明镜像打包成功。
在这里插入图片描述
在这里插入图片描述
4)运行准备
  依照【官网提供的手动安装方法】依次下载相应镜像,并启动对应容器。
  注:指令中的 (IP-OF-HOST)指的是你自己宿主机的IP地址。
在这里插入图片描述
  总结:目前实现上述操作之后仍旧无法通过访问 http://[ip-of-host]:8080 来登录 shipyard 的 Web 端。
可能的原因:
1.少启动了一些容器;
2.因为防火墙原因,一些用到的端口没有开启。

2020.06.02 更新
继续研究之前无法登陆的问题:
  参考1
  参考2
1、查看容器状态,shipyard-controller一直在不停的重启,查看8080端口,发现被没有开启和占用?不知道是什么原因,应该如何解决?
在这里插入图片描述
在这里插入图片描述
2、通过参考1,重新用全新的指令启动所有容器并关联,失败!
3、通过参考2,修改Dockerfile的基础镜像alpine为centos,重新启动,失败!
4、联合参考1和参考2,同时修改并重启,失败!


标签:

素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。