学习Docker,免不了的就是搭建环境了。搭建环境是一个复杂的工程,而且还是相当费时间的,不过话又说回来了,磨刀不误砍柴工嘛,光有理论是不够的,还需要自己动手实践才行。
在学习Docker之前,最好能熟练掌握一门编程语言,如果想深究Docker的深层次原理,这里建议最好学习下Go语言,毕竟Docker就是用Go语言编写的嘛,后续的Kubernetes也是用Go语言编写的。就我个人来说,Go语言还是要比C/C++容易上手的,如果你还是在校的学生,恰巧又看到了这本书的话,那说明你对容器技术还是有一定好奇心的,这是好事,接下来你就可以选择Go语言作为你深耕的编程语言啦。虽然说现在python语言比较火,这得益于近年来机器学习,人工智能的兴起。不过也不要难过,Go版本的tensorflow也已经在路上了,相信不久的将来,Go也可以在深度学习领域发出自己的光和热。
目前docker在windows系统支持的并不好,但是我们大多数的主机都装的是windows系统,这样我们可以通过虚拟机软件VMware安装我们需要的Linux环境。VMware公司是全球云基础架构和移动商务解决方案厂商,更多关于此公司的详细信息留给读者自行谷歌和百度。
在安装软件之前那就是下载软件,可以登录官网下载(下载链接:https://my.vmware.com/cn/web/vmware/info/slug/desktop_end_user_computing/vmware_workstation_pro/14_0
),编写本书时,下载的版本为 VMware-workstation-full-14.1.3-9474260.exe,需要注意的是,在安装比较高版本的Linux镜像的时候,需要VMware的版本比较高,否则会产生兼容问题,因此建议大家下载最新版本用于后续的学习使用。VMware安装,网上的教程比较多,基本来说,按照默认的配置基本就能安装成功。
在虚拟机安装完成之后,就可以安装我们的Linux镜像软件了,目前的Linux版本比较多,像Ubuntu、Centos、Redhat、EulerOS等等,支持Docker的镜像是有要求的,Docker依赖Linux的Namespcae和Cgroup两个特性,因此需要内核的版本最少在3.10以上,本书选择对Docker支持比较好的Ubuntu-18.04用于学习和研究,其内核版本为4.15.0-29-generic。
Ubuntu-18.04的ISO镜像文件可以从Ubuntu的官网进行下载(下载链接:http://cdimage.ubuntu.com/releases/18.04/release/),在下载镜像的时候,推荐下载离线版的镜像,在线版的镜像需要连接网络才能完成安装,而我们大多的时候安装镜像时网络还没有打通,会导致安装失败,在线版的镜像文件名中带有live字样(ubuntu-18.04.1-live-server-amd64.iso),为了便于安装,下载的是离线版本的镜像(ubuntu-18.04.1-server-amd64.iso)。这里还需要再啰嗦一下,个人认为安装server版本已经足以满足我们的需求了,并且全程操作也无需用到桌面,因此建议不安装desktop版本,毕竟我们的镜像是运行在虚拟机中,启动桌面系统本身就比较耗费性能,会对我们的宿主机提出更高的要求。
镜像下载完成后,就可以用VMware安装我们下载好的镜像文件了,这种教程网上也比较多,在设置虚拟机的规格时,最好根据宿主机的规格进行选择,一般设置2C4G60G的规格就足够用了的。虚拟机上有三种网络模式可以选择,分别是桥接模式,NAT模式和仅主机模式,在网络设置时。将网络连接选择NAT的方式连接(虚拟机--》设置--》网络适配器),这样如果主机能够正常上网,那么虚拟机也能够直接上网,如果主机能上网,虚拟机不能上网,请关闭主机的防火墙。
安装完成后的界面如图1-2-1所示:
此安装的镜像是一个比较干净的系统,由于很多软件都需要后期进行安装,大部分是在root用户下进行安装,但是Ubuntu系统默认是没有设置root用户密码,因此需要root用户设置密码,方便登陆。
设置Ubuntu系统的root密码:(安装时创建的用户名为: librant)
librant@ubuntu:~$ sudo passwd
输入想设置的密码即可。密码设置完成后,切换到root用户下。
librant@ubuntu:~$ su -
通过启动界面可以看到,进入到ubuntu系统中,系统的默认的终端字体比较小,我们可以通过如下命令进行设置:
root@ubuntu:~# dpkg-reconfigure console-setup
弹出如图1-2-2的界面:
可以根据自己的喜好设置终端的字体大小,推荐选择UTF-8 --> Latin1 and Latin5 --> Let the system select a suitable font --> 12X24。
当我们想停止或者启动console-setup服务的时候,可以通过以下命令:
root@ubuntu:~# /etc/init.d/console-setup {start|reload|restart|force-reload|stop}
配置共享目录可以在主机和虚拟机之间共享目录,使用NFS文件系统。虚拟机设置界面如图1-3-1所示:
首先在windows主机中新建一个准备共享的文件夹(E:\shared_lsf),然后在 虚拟机 --> 设置 --> 选项 --> 共享文件夹 进行设置Ubuntu系统中文件夹设置(shared_lsf),设置成功后,可以在 /mnt/hgfs/ 目录下看到之前设置的共享目录。
考虑到离线软件安装比较繁琐,建议在联网的情况下安装软件。首先使用ping命令测试下网络的连通性(ping www.baidu.com),如果不能ping通,需要检查下网络的相关配置。网络配置成功后,当我们准备使用ifconfig查看当前的IP地址时,很遗憾系统中还没有安装,根据终端的出错提示,可以用如下命令进行安装:
root@ubuntu:/# apt-get install net-tools
如果读者和我是一样的环境配置,会报Media change: please insert the disc labeled的错误,主要是因为系统中的没有挂载CDROM,解决方案可以将 /etc/apt/sources.list 中cdrom源注释掉,建议增加新的源地址(https://launchpad.net/ubuntu/+archivemirrors),文件修改如图1-3-2所示:
修改完成后并保存,然后执行:apt-get update更新源,然后就可以愉快的进行软件的安装啦。
配置SSH服务后,就可以远程连接服务器。首先查看当前环境下的SSH服务的状态:
root@ubuntu:/# service sshd status
如果出现 Loaded: error (Reason: No such file or directory) 提示的话,说明没有安装ssh服务,如果出现 Active: inactive (dead) 提示信息,则说明已经安装了SSH服务,只是没有开启而已。
1)安装SSH服务
root@ubuntu:~# apt-get install openssh-server
2)配置Open SSH:
root@ubuntu:~# vi /etc/ssh/sshd_config
配置如图1-3-3所示:
3)开启SSH服务
root@ubuntu:~# service sshd start
4)卸载SSH服务
root@ubuntu:~# apt-get –purge remove sshd
5)使用SSH服务
在网络连通的终端中使用:ssh username@IP
输入密码就可以登录成功。
XShell是一款强大的安全终端模拟软件,模拟了远程主机的操作,其实质就是通过访问和连接到远程主机,在本地实现对远程主机的操作。成功配置SSH后,就可以使用XShell软件连接虚拟机中的Ubuntu系统,比虚拟机中自带的方便很多。
XShell软件可以去官网下载(下载链接:https://xshell.en.softonic.com/download),本次下载的版本是:Xshell-6.0.0107p.exe,安装过程比较简单,使用也比较简单,这里就不再啰嗦了。在连接之前,可以设置下终端中的显示字体和大小(文件 --> 属性 --> 外观 --> 字体)。
在使用XShell登陆之前,首先需要将虚拟机中的Ubuntu系统运行起来,然后就可以通过SSH登陆,登陆成功后的界面如图1-4-1所示:
Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。作为版本控制的优秀软件代表,个人认为确实比SVN好用,在我司大部分的部门已经都在使用Git,不过还有很多部门在使用SVN。当版本越来越多的时候,需要将发现的一个问题合入到之前的版本,SVN需要将所有需要修改的分支都下载到本地,然后一个分支一个分支的修改,相当的麻烦。Git的使用还是比较简单的,这里推荐《廖雪峰的官方网站》中的Git教程。学习Docker,Git是必不可少的工具,也是拉取github上代码的利器。
Git软件可以从官网下载(下载链接:https://mirrors.edge.kernel.org/pub/software/scm/git/),安装有两种方式,在线安装和源码安装。在线安装需要联网,如果不能联网,就只能将源码下载下来安装了。强烈建议在联网环境下安装相关软件,方便快捷,还不容易出错。
在线安装可以使用以下命令:
root@ubuntu:~# apt-get install git
安装完成后,查看当前的Git版本号:
root@ubuntu:~# git --version
git version 2.17.1
如果觉得Git的命令行模式比较麻烦,也可使用可视化的lazygit工具,具有添加文件轻松,merge冲突处理,分支切换方便,快速commit/pull/push的特点,安装方法在安装完Go编译器后进行介绍。启动界面如图1-5-1所示:
lazygit工具使用也是非常的简单,常用的命令也不是很多,比命令行的方式简单,需要在git仓库中才能使用,否则会报错。lazygit的操作如图1-5-2所示:(选中对应的方框,然后按 x 键弹出菜单面板)
Go语言是谷歌公司2009发布的第二款开源编程语言。前面已经提过,Docker就是用Go语言编写的,如果想探究Docker的深层次原理,Go编译器是必要的,并且Go编译器也已经完全由Go语言编写了。由于伟大的强的存在,我们不能访问到Go的官方网站,也就不能像Git那样用一条命令搞定,只能选择二进制方式安装,这种方式是使用已经编译好的二进制命令,直接拷贝到环境变量对应的目录中即可使用。
Go编译器官方下载地址(https://golang.org/dl/),一般是访问不了,可以直接去Golang中国的网站下载(下载链接:https://golang.google.cn/dl/),目前已经更新到1.11.2版本,选择Linux环境版本的下载(go1.11.2.linux-amd64.tar.gz),然后就可以进行安装啦。
Go软件安装过程如下:
1)解压软件包
root@ubuntu:/mnt/hgfs/shared_lsf/tools# tar -zxf go1.11.2.linux-amd64.tar.gz
解压完成后会在当前目录下生成 go 目录。
2)拷贝目录
root@ubuntu:/mnt/hgfs/shared_lsf/tools# cp -r go /usr/local/
3)配置环境变量PATH
root@ubuntu:/mnt/hgfs/shared_lsf/tools# vim /etc/profile
在文件的末尾增加:
GO_HOME=/usr/local/go
export GOROOT=/usr/local/go
export PATH=${PATH}:${GO_HOME}/bin
使用source命令重新生效环境变量:
root@ubuntu:/mnt/hgfs/shared_lsf/tools# source /etc/profile
4)配置GOPATH变量
GOPATH变量最好是根据当前用户设置,意思是说,每个用户应该都会有自己的GOPATH变量,配置到用户自己目录下的 .profile 文件中。
切换到 librant 用户,打开 .profile 文件:
librant@ubuntu:~$ vim .profile
在文件的末尾增加:
export GOPATH=${HOME}/gowork
export PATH=$PATH:$GOPATH/bin
export GOBIN=$GOPATH/bin
重新使用source命令生效变量:
librant@ubuntu:~$ source .profile
5)创建Go工作目录树
GOPATH为Go工程的工作目录,创建gowork目录:
librant@ubuntu:~$ mkdir gowork
gowork目录名称可以随意,只需要在 .profile 中设置成对应的GOPATH即可。
然后在GOPATH的对应目录下分别创建 pkg bin src目录:
librant@ubuntu:~/gowork$ mkdir pkg bin src
一般一个Go项目在GOPATH目录下会存在上述三个目录,pkg目录用于存放编译后的包文件,bin目录用于存放编译后的可执行文件,src目录用于存放项目的源码文件。在使用 go install命令安装的包文件会在pkg目录下,以 .a 结尾,是经过编译的,直接将Go的包拷贝到pkg目录下是不行的。如果是生成可执行文件,会存放在bin目录下。
6)检查Go编译是否安装成功
librant@ubuntu:~/gowork$ go version
go version go1.11.2 linux/amd64
7)检查Go安装环境信息
librant@ubuntu:~/gowork$ go env
go env命令主要用于检查我们设置的变量是否正确,主要关注 GOBIN GOPATH GOROOT 几个变量。GOBIN设置可执行文件目录,GOPATH设置Go工作目录,GOROOT设置Go的安装目录。
作为一名程序员,相信对 github.com 表示无比亲切,gitHub是一个面向开源及私有软件项目的托管平台,因为只支持 git 作为唯一的版本库格式进行托管,故名gitHub。gitHub可以采用两种认证方式:SSH和https。两种的区别是SSH需要进行SSH key配置,但是每次Pull的时候是不需要输入用户名密码的,而https每次都要输入用户名密码的。
1)创建本地的SSH key
librant@ubuntu:~$ ssh-keygen -t rsa -C "lishangfeng1990@163.com"
然后按三次回车键,会在 ~/.ssh 目录下生成id_rsa(私钥)和id_rsa.pub(公钥)文件。
2)将 id_rsa.pub 文件中的信息上传至github网站
如果没有gitHub账号,先注册一个(https://github.com/),这里就不介绍如何注册了。登陆成功后,点击右上角的图标,然后进入 Settings --> SSH and GPG keys --> New SSH key,Title框可以填写用于标识的字符串,key框中将id_rsa.pub文件中的信息一个字符不落的进行复制。然后点击Add SSH key即可保存成功。
3)测试秘钥是否配置成功
lazygit工具就是保存在gitHub上的开源工具,我们可以在gitHub上搜索 lazygit,找到lazygit的代码仓jesseduffield/lazygit,点击 clone or download 按钮,复制其中的URL地址。
下载的工程最好和代码仓上的路径保持一致,这样就可以省去设置GOPATH的烦恼。创建 GOPATH/src目录下没有github.com目录,如果存在就不用再创建了。为了保持目录结构的一致性,需要在github.com目录下创建jesseduffield目录,并进入到目录,然后执行:
librant@ubuntu:~/gowork/src/github.com/jesseduffield$ git clone https://github.com/jesseduffield/lazygit.git
如果配置成功,就会在当前目录下生成 lazygit 目录,然后进入到 lazygit 目录中,安装 lazygit 工具:
librant@ubuntu:~/gowork/src/github.com/jesseduffield/lazygit$ go install
瞧,Go语言编写的软件安装就是这么简单,不像C/C++软件安装那么麻烦。安装成功会在GOPATH/bin目录下生成lazygit 可执行文件。
gitHub是一个很好的代码托管的仓库,可以用来存放我们自己的代码。只需要本地修改文件,然后通过git就可以提交到自己的代码仓库中,很是方便。
首先是在gitHub网站上创建自己的代码仓库,在登陆自己的gitHub账号之后,在主页很显眼的位置,有个 New repository 的按钮,然后填写自己的代码仓库的名称,这样就建好了自己的代码仓库啦。
gitHub代码仓:https://github.com/librant/CLOUND_NATIVE.git
仓库建好之后,在本地的$GOPATH/src目录下创建 librant 目录,在librant目录下 clone 自己的项目。
librant@ubuntu:~/gowork/src/librant$ git clone https://github.com/librant/CLOUND_NATIVE.git
会在当前目录下生成 CLOUND_NATIVE 目录,这个目录就是我们远程的代码仓。
代码克隆完成之后,开始我们的第一次提交测试。修改 CLOUND_NATIVE 目录中的 README.md 文件,然后查看文件状态:
librant@ubuntu:~/gowork/src/librant/CLOUND_NATIVE$ git status
modified: README.md
然后添加到暂存区:
librant@ubuntu:~/gowork/src/librant/CLOUND_NATIVE$ git add README.md
提交我们的修改:
librant@ubuntu:~/gowork/src/librant/CLOUND_NATIVE$ git commit -m "First commit --by librant"
一般这行这步会报错,需要根据提示设置:
librant@ubuntu:~/gowork/src/librant/CLOUND_NATIVE$ git config --global user.name "librant"
librant@ubuntu:~/gowork/src/librant/CLOUND_NATIVE$ git config --global librant "lishangfeng1990@163.com"
如果在设置的时候出现 “error: key does not contain a section: librant” 报错,需要检查命令行中是否存在多余的空格,或者重现拷贝命令再进行执行。
配置完成后,就可以进行提交我们的修改。
当我们commit完成后,就可以推到远端 gitHub上:
librant@ubuntu:~/gowork/src/librant/CLOUND_NATIVE$ git push
成功之后,就可以登录到我们之前创建的代码仓中查看本次的修改记录。
(更多git命令的操作教程,请参考廖雪峰的git教程:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000)
为了方便以后编译软件,建议还是把gcc和cmake编译器也都安装上。
root@ubuntu:/# apt-get install gcc
查看gcc是否安装成功:
root@ubuntu:/# gcc -v
gcc version 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04)
如果可以看到输出的gcc版本号,则表示安装成功。
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake,同样使用apt-get进行安装。
root@ubuntu:/# apt-get install cmake
查看cmake是否安装成功:
root@ubuntu:/# cmake --version
cmake version 3.10.2
如果能输出版本号就表示安装成功。
到目前为止,还没有见到Docker的影子,亲爱的读者先别着急,俗话说,兵马未动,粮草先行嘛,这些软件工具都是帮助我们提高效率的,在第二章中我们将会进行Docker的安装。在以后的学习过程中,我也将不断推荐比较好的开源软件,学习别人如何写出优秀的代码。