如何用docker编译代码并且启动sever以及避免坑(下)
上一篇文章中如何用docker编译代码并且启动sever以及避免坑(上),我们写了如何容docker编译代码,以及如何避免其中的坑,今天说一下将编译好的可执行程序作为server,使用docker启动。后续会有更多的模式和算法以及区块链相关的,如果你是想学习go语言或者是对设计模式或者算法感兴趣亦或是区块链开发工作者,都可以关注一下。(微信公众号:Go语言之美,csdn:Go语言之美。更多go语言知识信息等)。公众号会持续为大家分享更多干货。
我们有了这个可执行的文件,启动后就是一个sever,我们可以通过rpc或者方式访问这个server,我们可以创建一个容器,容器启动时,直接启动我们的sever。首先说一下大体思路:
- 将可执行文件挂载到docker容器中
- 可以将sever监听的端口在容器中映射到主机,或者直接访问docker的ip,建议映射出来
- 创建并启动容器,同时启动sever
- 容器启动后,监控sever是否成功启动
- sever关闭后自动删除容器
这是一个基本的思路,接下来是示例代码:
runParam.Cmd = []string{ "/main-sever", "start", "-p", port, // sever 监听的端口 } runParam.WorkDir = "/log" runParam.AutoRemove = true // sever停止后,容器自动删除。 runParam.Mounts = []dockerlib.Mounts{ { Source: "/bin/main-sever, Destination: "/main-sever", }, { Source: "/log", Destination: "/log", }, } hostPort := dockerlib.HostPort{port, "0.0.0.0"} runParam.PortMap = make(map[string]dockerlib.HostPort) runParam.PortMap[port+"/tcp"] = hostPort
这里面我们需要自己创建一个结构体runParam,在dockerlib中再解析参数,然后调用docker的api。WorkDir就是sever启动之后的工作目录,我们将本地日志目录挂载到docker中,再将sever文件挂载到容器中。port是端口号,我们可以随便找一个未占用的端口即可,然后就是将容器中的端口映射到主机上,映射出来之后,我们可以直接访问主机端口即访问sever,在这里解释一下为什么要映射出来,本人测试,在Linux中,我们可以直接访问容器中sever,不需要映射,但是在mac中我们不能访问,windows本人没有测试,但是建议都映射出来,也方便我们管理。
这样启动容器后,server也会起来,但是server启动还需要时间,当我们拿到启动容器的结果时,我们不能保证sever已经成功启动。所以我们需要保证sever已经成功启动了。我们可以用一个for循环,一直访问这个sever,直到sever成功连接并返回正确信息,我们可以每隔几百毫秒访问一次,基本上在一秒钟左右sever就可以成功启动。
到此为止sever可以成功启动了,但是我们还需要维护这个容器,因为如果容器出现故障,或者sever停止了,我们都需要知道,并且维护。
另外还有一个问题,就是这样是不支持并发启动docker的,假如有多个请求同时需要启动这个sever,我们只需要启动一个容器,所以就存在并发问题。接下来,这些问题我会慢慢写出来,感兴趣的可以持续关注。
如果对你有帮助帮忙点个赞。公众号持续更新更多干货。