容器部署即使用 docker 化部署 golang 应用程序,这是在云服务时代最流行的部署方式,也是最推荐的部署方式.
跨平台交叉编译是 golang 的特点之一,可以非常方便地编译出我们需要的目标服务器平台的版本,而且是静态编译,非常容易地解决了运行依赖问题.
一个参考的 Dockerfile 文件如下:
随后使用 " docker build -t main . " 指令编译生成名为 main 的 docker 镜像.
需要注意的是,在某些项目的架构设计中, 静态文件 和 配置文件 可能不会随着镜像进行编译发布,而是分开进行管理和发布.
例如,使用 MVVM 模式的项目中(例如使用 vue 框架),往往是前后端非常独立的,所以呢在镜像中往往并不会包含 public 目录.而使用了 配置管理中心 (例如使用 consul / etcd / zookeeper )的项目中,也往往并不需要 config 目录.
所以呢对于以上示例的 Dockerfile 的使用,仅作参考,根据实际情况请进行必要的调整.
使用以下指令可直接运行刚才编译成的镜像:
容器的分发可以使用 docker 官方的平台: ,国内也可以考虑使用阿里云: .
在企业级生产环境中, docker 容器往往需要结合 kubernetes 或者 docker swarm 容器编排工具一起使用.
容器编排涉及到的内容比较多,感兴趣的同学可以参考以下资料:
①..Docker项目
网址为 .
介绍:Docker是一种操作系统层面的虚拟化技术,可以在操作系统和应用程序之间进行隔离,也可以称之为容器.Docker可以在一台物理服务器上快速运行一个或多个实例.例如,启动一个Cent OS操作系统,并在其内部命令行执行指令后结束,整个过程就像自己在操作系统一样高效.
介绍:Google公司开发的构建于Docker之上的容器调度服务,用户可以通过Kubernetes集群进行云端容器集群管理.
介绍:一款分布式、可靠的KV存储系统,可以快速进行云配置.
介绍:beego是一个类似Python的Tornado框架,采用了RESTFul的设计思路,使用Go语言编写的一个极轻量级、高可伸缩性和高性能的Web应用框架.
介绍:一款快速构建模块化的Web应用的Web框架.
网址为 Labs/codis.
介绍:国产的优秀分布式Redis解决方案.
Kubernetes基于Docker,其目的是让用户通过Kubernetes集群来进行云端容器集群的管理,而无需用户进行复杂的设置工作.系统会自动选取合适的工作节点来执行具体的容器集群调度处理工作.
etcd是由CoreOS开发并维护键值存储系统,它使用Go语言编写,并通过Raft一致性算法处理日志复制以保证强一致性.目前,Google的容器集群管理系统Kubernetes、开源PaaS平台Cloud Foundry和CoreOS的Fleet都广泛使用了etcd.
Deis是一个基于Docker和CoreOS的开源PaaS平台,旨在让部属和管理服务器上的应用变得轻松容易.它可以运行在AWS、GCE以及Openstack平台下.
Flynn是一个使用Go语言编写的开源PaaS平台,可自动构建部署任何应用到Docker容器集群上运行.Flynn项目受到Y Combinator的支持,目前仍在开发中,被称为是下一代的开源PaaS平台.
Docker 提供了一个与 Docker 守护进程交互的 API (称为Docker Engine API),我们可以使用官方提供的 Go 语言的 SDK 进行构建和扩展 Docker 应用程序和解决方案.
转自:
整理:地鼠文档
通过下面的命令就可以安装 SDK 了:
该部分会介绍如何使用 Golang ◆ Docker API 进行管理本地的 Docker.
第一个例子将展示如何运行容器,相当于 docker run docker.io/library/alpine echo "hello world" :
还可以在后台运行容器,相当于 docker run -d bfirsh/reticulate-splines :
列出正在运行的容器,就像使用 docker ps 一样:
如果是 docker ps -a ,我们可以通过修改 types.ContainerListOptions 中的 All 属性达到这个目的:
通过上面的例子,我们可以获取容器的列表,所以在这个案例中,我们可以去停止所有正在运行的容器.
通过指定容器的 ID,我们可以获取对应 ID 的容器的日志:
获取本地所有的镜像,相当于 docker image ls 或 docker images :
拉取指定镜像,相当于 docker pull alpine :
除了公开的镜像,我们平时还会用到一些私有镜像,可以是 DockerHub 上私有镜像,也可以是自托管的镜像仓库,比如 harbor .这个时候,我们需要提供对应的凭证才可以拉取镜像.
值得注意的是:在使用 Docker API 的 Go SDK 时,凭证是以明文的方式进行传输的,所以如果是自建的镜像仓库,请务必使用 HTTPS !
我们可以将一个已有的容器通过 commit 保存成一个镜像:
当然,除了可以管理本地的 Docker , 我们同样也可以通过使用 Golang ◆ Docker API 管理远程的 Docker .
默认 Docker 是通过非网络的 Unix 套接字运行的,只能够进行本地通信( /var/run/docker.sock ),是不能够直接远程连接 Docker 的.
创建 client 的时候需要指定远程 Docker 的地址,这样就可以像管理本地 Docker 一样管理远程的 Docker 了:
现在已经有很多可以管理 Docker 的产品,它们便是这样进行实现的,比如: portainer .
Docker是什么?
简单得来说,Docker是一个由GO语言写的程序运行的"容器"(Linux containers, LXCs); 目前云服务的基石是操作系统级别的隔离,在同一台物理服务器上虚拟出多个主机.Docker则实现了一种应用程序级别的隔离; 它改变我们基本的开发、操作单元,由直接操作虚拟主机(VM),转换到操作程序运行的"容器"上来.
Docker是为开发者和系统管理员设计的,用来发布和运行分布式应用程序的一个开放性平台.由两部分组成:
Docker Engine: 一个便携式、轻量级的运行环境和包管理器.(注* 单OS vs 单线程,是不是跟NodeJS特别像?)
Docker Hub: 为创建自动化工作流和分享应用创建的云服务组成.(注* 云端镜像/包管理 vs npm包管理,是不是跟npm特别像?)
其实Container技术并非Docker的创新,HeroKu, NodeJitsu 等云服务商都采用了类似这种轻量级的虚拟化技术,但Docker是第一个将这这种Container技术大规模开源并被社区广泛接受的.
好的部分
Docker相对于VM虚拟机的优势十分明显,那就是轻量和高性能和便捷性, 以下部分摘自:KVM and Docker LXC Benchmarking with OpenStack
快
管理操作(启动,停止,开始,重启等等) 都是以秒或毫秒为单位的.
敏捷
像虚拟机一样敏捷,而且会更便宜,在bare metal(裸机)上布署像点个按钮一样简单.
灵活
将应用和系统"容器化",不添加额外的操作系统,
轻量
你会拥有足够的"操作系统",仅需添加或减小镜像即可.在一台服务器上可以布署100~1000个Containers容器.
便宜
开源的,免费的,低成本的.由现代Linux内核支持并驱动.注* 轻量的Container必定可以在一个物理机上开启更多"容器",注定比VMs要便宜.
生态系统
正在越来越受欢迎,只需要看一看Google的趋势就知道了,docker or LXC.
还有不计其数的社区和第三方应用.
云支持
不计其数的云服务提供创建和管理Linux容器框架.