在编译docker代码之前肯定需要研究一下docker的代码结构以及官方推荐的方式,因为docker是开源的,所以很多第三方开发者参与。那么官方肯定会给出开发环境搭建的文档,所以拿到代码肯定先研究官方的编译方法。通过文档和代码了解到docker官方推荐的是在docker本身的容器里面搭建环境和编译,官方给出的是一个基于ubuntu的dockerfile。不过正是这个dockerfile可以清楚的知道需要为了编译准备哪些依赖环境,为我们后面自己编译提供了环境搭建的基础。然后就尝试了官方的编译方案,结果各种网络问题导致编译通不过,当然网上也有相应的解决方案,基本上就是替换一些依赖源(国外的被墙了)。但是就算编译通过了也只是一个基于ubuntu的二进制文件,只能在ubuntu的相应的系统上运行。我们需要的是一个可以在centos7上运行的二进制文件,关键要搭建一个可以持续开发和编译测试的环境。当然也可以制作一个centos7的dockerfile文件,对照着官方的ubuntu的dockerfile也很简单。但是这些都是还需要有一个前提,就是需要先安装一个以前版本的docker来启动这个环境涩,好处也是杠杠的,可以在任何一台能够运行docker的系统上进行开发和测试,而且可以进行持续集成。不过对于我们来说能够编译出一个稳定运行在centos7上的二进制文件即可,所以就尝试直接在本地进行编译,而不是通过docker的容器进行。
创新互联是一家业务范围包括IDC托管业务,雅安服务器托管、主机租用、主机托管,四川、重庆、广东电信服务器租用,四川主机托管,成都网通服务器托管,成都服务器租用,业务范围遍及中国大陆、港澳台以及欧美等多个国家及地区的互联网数据服务公司。
经过研究docker的官方编译脚步,发现本地编译也很简单,只需要在docker源码的目录下执行如下命令即可:
./hack/make.sh binary
上面这条命令就只会生成docker的二进制文件,不过肯定不会这么顺利的,执行这个命令你就会发现错误。如果第一次执行报的错误应该是找不到相应的go依赖包。那么现在就开始解决第一个问题,go依赖包。
解决go依赖包最直接的方法就一个一个去github或者其他地方去下载到本地,但是这样做很麻烦,docker依赖的go语言包很多,然后依赖包可能又依赖其他包。这里有一个简单实用的办法,也是go语言管理项目的方便之处。通过go get命令来自动下载,例如发现报错的是docker某一个目录下的依赖包,那么可以如下执行:
go get -v ./src/github.com/docker/docker/...
这条命令执行以后整个docker目录下源文件依赖的包都会被自动下载。如果发现其他目录下源文件也报同样的错误,可以按照次方法解决。不过这里需要强调一点,这些下载都是会下载最新的包,如果编译老的docker肯定会出问题,如果编译最新的docker代码肯定不会有问题,因为官方的编译是这种方式。
上面执行的命令都是建立在go语言环境建立成功的基础上,我安装的go遇到是1.3.3版本的,采用源码方式安装。安装在/export/servers/go下面,然后所有的go语言工程源码目录放在/export/servers/gopath。然后配置环境变量在用户的根目录下的.bashrc文件里面如下:
export GOPATH=/export/servers/gopath
export GOROOT=/export/servers/go
export GOARCH=amd64
export GOOS=linux
然后docker的代码目录如下:/export/servers/gopath/src/github.com/docker/docker。这样才能在gopath下面进行依赖包的下载。通过上面的方法把所有依赖包下载完以后就可以进行编译了。
在继续编译的过程中还会遇到缺少c语言依赖包缺少的问题,主要有三个,(1)sqlite3;(2)device-mapper;(3)btrfs.
第一个sqlite3可以使用如下命令安装依赖:yum install sqlite-devel.x86_64
第二个在官方的dockerfile文件里面有解决方案,执行如下命令:
git clone --no-checkout /usr/local/lvm2 cd /usr/local/lvm2 git checkout -q v2_02_103
cd /usr/local/lvm2 ./configure --enable-static_link make device-mapper make install_device-mapper
第三个btrfs使用如下安装依赖: yum install btrfs-progs。
这些依赖都解决了就继续编译,这个时候可能会出现ld连接错误,提示找不到库。因为docker编译的方式完全是static,所以所有依赖的库必须还要有相应的静态库(.a),而不是动态库(.so)。刚才通过yum install sqlite-devel.x86_64安装了sqlite3的依赖,但是最后发现里面没有静态库,所以编译ld的时候出错了。我的解决办法就是重新到sqlite3的官方网站下载了源码包,然后编译安装即可。
编译完成以后,就会在docker源码目录下的bundles/1.3.1/binary/目录有如下文件:
docker docker-1.3.1 docker-1.3.1.md5 docker-1.3.1.sha256
docker-1.3.1这个文件就是我们需要的二进制文件了,docker是一个软连接到docker-1.3.1的文件。
到此就成功完成编译了,以后修改了代码重新支持编译脚步即可:
./hack/make.sh binary
1.1 Go 安装
Go的三种安装方式
Go有多种安装方式,你可以选择自己喜欢的。这里我们介绍三种最常见的安装方式:
Go源码安装:这是一种标准的软件安装方式。对于经常使用Unix类系统的用户,尤其对于开发者来说,从源码安装可以自己定制。
Go标准包安装:Go提供了方便的安装包,支持Windows、Linux、Mac等系统。这种方式适合快速安装,可根据自己的系统位数下载好相应的安装包,一路next就可以轻松安装了。**推荐这种方式**
第三方工具安装:目前有很多方便的第三方软件包工具,例如Ubuntu的apt-get、Mac的homebrew等。这种安装方式适合那些熟悉相应系统的用户。
最后,如果你想在同一个系统中安装多个版本的Go,你可以参考第三方工具GVM,这是目前在这方面做得最好的工具,除非你知道怎么处理。
Go源码安装
在Go的源代码中,有些部分是用Plan 9 C和ATT汇编写的,因此假如你要想从源码安装,就必须安装C的编译工具。
在Mac系统中,只要你安装了Xcode,就已经包含了相应的编译工具。
在类Unix系统中,需要安装gcc等工具。例如Ubuntu系统可通过在终端中执行sudo apt-get install gcc
libc6-dev来安装编译工具。
在Windows系统中,你需要安装MinGW,然后通过MinGW安装gcc,并设置相应的环境变量。
你可以直接去官网下载源码,找相应的goVERSION.src.tar.gz的文件下载,下载之后解压缩到$HOME目录,执行如下代码:
cd go/src
./all.bash
运行all.bash后出现"ALL TESTS PASSED"字样时才算安装成功。
上面是Unix风格的命令,Windows下的安装方式类似,只不过是运行all.bat,调用的编译器是MinGW的gcc。
如果是Mac或者Unix用户需要设置几个环境变量,如果想重启之后也能生效的话把下面的命令写到.bashrc或者.zshrc里面,
export GOPATH=$HOME/gopath
export PATH=$PATH:$HOME/go/bin:$GOPATH/bin
如果你是写入文件的,记得执行bash .bashrc或者bash
.zshrc使得设置立马生效。
如果是window系统,就需要设置环境变量,在path里面增加相应的go所在的目录,设置gopath变量。
当你设置完毕之后在命令行里面输入go,看到如下图片即说明你已经安装成功
图1.1 源码安装之后执行Go命令的图
如果出现Go的Usage信息,那么说明Go已经安装成功了;如果出现该命令不存在,那么可以检查一下自己的PATH环境变中是否包含了Go的安装目录。
关于上面的GOPATH将在下面小节详细讲解
Go标准包安装
Go提供了每个平台打好包的一键安装,这些包默认会安装到如下目录:/usr/local/go
(Windows系统:c:\Go),当然你可以改变他们的安装位置,但是改变之后你必须在你的环境变量中设置如下信息:
export GOROOT=$HOME/go
export GOPATH=$HOME/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
上面这些命令对于Mac和Unix用户来说最好是写入.bashrc或者.zshrc文件,对于windows用户来说当然是写入环境变量。
CentOS 7服务器的默认语言为英文,如果我们英文不好看着就不舒服,有时候操作并不方便,那么想要换成默认为中文的怎么弄呢?
1.首先通过你的远程工具链接到你的CentOS 7系统中。
2.修改语言文件
输入命令【vi /etc/locale.conf】然后回车
3.然后按下字母【i】进入插入模式
4.移动光标将
将默认的【LANG=en_US.UTF-8】
修改为【LANG=zh_CN.UTF-8】
5.保存更改并退出:
按【Esc】键,直接输入【:wq】然后回车
6.然后关闭连接,再次打开。看已经变成了中文了