小笙's Blog

go docker与kubernetes实践2018.06.03 16:58

Go

Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。Go的语法接近C语言 + Python。

安装

下载Go 1.10.2 版本,可执行文件,解压安装,并配置bin环境变量

1
2
tar-C /usr/local-xzf go1.10.2.linux-amd64.tar.gz
exportPATH=$PATH:/usr/local/go/bin

创建go代码工作路径

1
2
3
4
5
mkdir/home/git/dh/go
mkdir/home/git/dh/go/src
mkdir/home/git/dh/go/pkg
mkdir/home/git/dh/go/bin
exportGOPATH=/home/git/dh/go

其中子目录的用途分别为:

src | 引用的外部库,源代码路径

pkg | 编译时生成的对象文件

bin | 编译后的程序

第一个GO程序

在src目录下编写我们的第一个Go程序,实现快速排序

1
2
mkdirsrc/mysort
visrc/mysort/qsort.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 当前程序的包名
package mysort
//函数名首字母大写,表示函数public属性
func Qsort(data []int) {
   if len(data) <= 1 {
       return
   }
   mid := data[0]
   head, tail := 0, len(data)-1
   for i := 1; i <= tail; {
       if data[i] > mid {
           data[i], data[tail] = data[tail], data[i]
           tail--  
       } else {
           data[i], data[head] = data[head], data[i]
           head++  
           i++    
       }      
   }
   data[head] = mid
   Qsort(data[:head])
   Qsort(data[head+1:])
}

接下来,编写main包,来调用上边编写的快速排序

1
2
mkdirsrc/main
visrc/main/test.go
1
2
3
4
5
6
7
8
9
10
11
12
//只有 package 名称为 main 的包可以包含 main 函数,一个可执行程序有且仅有一个 main 包
package main
import (
   "fmt"  
   "mysort"
)
func main() {
   //初始化数组
   var data = []int{8, 2, 4, 6, 10}
   mysort.Qsort(data)
   fmt.Println(data)
}

编译我们的mian函数,并执行在当前目录生成的可执行文件

1
2
3
$ go build test.go
$ ./test
[2 4 6 8 10]

Docker

基本概念

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。

传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟,因此容器要比传统虚拟机更为轻便。

Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。

总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

Image

Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

Docker Registry

镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。

一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。

通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

安装Docker

这里以centos7 yum为例,安装docker依赖,由于国外docker镜像下载较慢,需要配置国内镜像(aliyun 163等)

1
2
3
4
sudoyum install-y yum-utils device-mapper-persistent-data lvm2
sudoyum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudoyum makecache fast
sudoyum -y installdocker-ce

启动并测试docker

1
2
3
4
$ service docker start
$ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.

配置docker镜像仓库为国内源

1
2
3
4
5
6
vi/etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
$ sudosystemctl daemon-reload
$ sudosystemctl restart docker

Dockerfile

Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

接下来,我们编写Dockerfile将前边生成的go test可执行文件添加至镜像/home/git/go目录

1
2
3
4
$ cd/home/git/dh/go/bin/
$ catDockerfile
FROM scratch
ADD ./test/home/git/go/test

生成镜像并执行

1
2
3
4
5
6
$ docker build -t test:v1 .
$ docker image list
testv1                  bd374321a3f4        4 minutes ago       2.01MB
hello-world         latest              e38bc07ac18e        6 weeks ago         1.85kB
$ docker run test:v1 /home/git/go/test
[2 4 6 8 10]

kubernetes

kubernetes(k8s) 是 Google 团队发起并维护的基于 Docker 的开源容器集群管理系统,它不仅支持常见的云平台,而且支持内部数据中心。

建于 Docker 之上的 Kubernetes 可以构建一个容器的调度服务,其目的是让用户透过 Kubernetes 集群来进行云端容器集群的管理,而无需用户进行复杂的设置工作。系统会自动选取合适的工作节点来执行具体的容器集群调度处理工作。

k8s 依赖 Etcd 服务来维护所有主节点的状态。

关于k8s的配置及使用,后续会通过一个专门的章节说明,敬请期待~


  • 正在加载用户留言,请稍后~
点击这里取消回复

  • 请选择邮箱类型
  • @qq.com
  • @163.com
  • @sina.com
  • @126.com
  • @vip.qq.com
  • @sina.com.cn

:love: :kiss: :twist: :top: :shake: :bye: :han: :sleep: :lula: :rou: :happy: