第一章 容器与开发语言
1.1 Docker
最近一段时间,云计算领域最火的莫过于“容器”一词。提到容器,就不得不提 Docker,可以说 Docker 己经成为了容器的代名词。那么,什么是 Docker ? Docker 又能做什么呢?本章
我们就来简单介绍一下 Docker。
1.1.1 简介
Docker 是一个开源工具,它可以将你的应用打包成一个标准格式的镜像,并且以容器的方式运行。Docker 容器将一系列软件包装在一个完整的文件系统中,这个文件系统包含应用程序运行所需要的一切:代码、运行时工具、系统工具、系统依赖,几乎有任何可以安装在服务器上的东西。这些策略保证了容器内应用程序运行环境的稳定性,不会被容器外的系统环境所影响 。
Docker 容器具有以下 3 个特点。
- 轻量级 :在同一台宿主机上的容器共享系统 Kernel,这使得它们可以迅速启动而且占用内存极少。镜像是以分层文件系统构造的,这可以让它们共享相同的文件,使得磁盘使用率和镜像下载速度得到提高。
- 开放:Docker 容器基于开放标准,这使得 Docker 容器可以运行在主流 Linux 发行版和 Windows 操作系统上。
- 安全:容器将各个应用程序隔离开来,这给所有的应用程序提供了 一层额外的安全防护。
1.1.2 容器和虚拟机比较
容器和虚拟机同样有着资源隔离和分配的优点,但是由于其架构的不同,容器比虚拟机更加便携和高效。虚拟机包含用户的程序,必要的函数库和整个客户操作系统,所有的这些差不多需要占用好几个 GB 的空间。
容器包含用户的程序和所有的依赖,但是容器之间是共享 Kernel 的。各个容器在宿主机上互相隔离,并且在用户态下运行。Docker 容器不和任何基础设施绑定,它可以运行在任何电脑、JDC 和云上。
1.1.3 容器加速开发效率
Docker 容器可以帮助开发者跳过设置冗杂的开发环境,专注于开发软件的新功能,具体有如下 3 项。
- 加速开发 :再也不用等待数小时设置开发环境,可以很方便地使生产环境的代码在本地跑起来。
- 赋能创造力 :Docker 容器的隔离特性可以让开发者摆脱限制。开发者可以为自己的应用选择最好的语言和工具,再也不用担心产生内部工具的冲突。
- 消除环境不一致:将应用程序的配置和所有依赖打包成一个镜像在容器中,可以保证应用在任何环境中都可以按照预期来运行, 再也不用担心不得不在不同环境中安装相同软件和配置的问题。
1.1.4 利用容器合作开发
Docker 镜像可以存储到 Docker Hub 中,团队成员可以通过Docker Store、 Docker Hub 管理分享镜像。所有的变化和历史都可以在整个组织间查看。
而且,你可以很简单地分享你的容器,不需要担心环境依赖产生的不一致问题,其他团队也可以很简单地引用你的容器,而不需要去关心它是如何工作的。
1.1.5 利用容器快速扩容
Docker允许动态地改变应用程序,可以通过扩容快速提高应用程序的能力并及时修复缺陷。Docker容器可以秒级启动和停止,因此,它可以在需要的时候快速扩容出大量的应用程序,扛住并发的压力。
1.1.6 安装使用 Docker
Docker 就是一个这样的工具 。它可以帮助开发者很方便地去构建、部署、运行自己的程序, 还可以让你非常迅速地测试你的项目并将其部署到生产环境中 。
首先,你需要在自己的机器上安装Docker,这里以在 Ubuntu系统上安装Docker为例 。
#1 更新安装 docker
wget -qO- https://get.docker.com/ | sh
#2 启动 docker
service docker start
运行以上命令,一段美妙的小脚本就这样被安装到了你的机器上,它完成了安装Docker需要的所有内容。
下面,就开始使用它吧。以安装一个WordPress为例,看看Docker是如何快速安装一个WordPress的。以前安装WordPress,可能需要去了解PHP、MySQL,还有服务器的系统,最后才去安装WordPress,非常麻烦。但是,如果换一种方式,使用Docker来安装呢?
docker run -d -p 80:80 --name wordpress wordpress
运行以上命令,Docker会自动从DockerHub中拉取WordPress镜像,这个镜像是已经被build好的,包含了PHP、MySQL和WordPress。你所做的工作就是等待Docker帮你把这个服务启动起来以后,在浏览器上访问你的服务器IP,就可以看到WordPress的安装页面,然后一步步点击页面按钮完成安装即可。对于MySQL密码,可以使用如下命令获取。
echo $(docker logs wordpress | grep password)
上面这条命令就可以获得MySQL密码,将其填写到网页中,就得到了一个可以运行的WordPress,然后开始愉快地使用它吧。
1.2 Go
Go语言的语法虽然接近C语言,但还是有一些不同,比如两者对于变量的声明是不同的,且Go语言中的for循环和if判断语句不需要用小括号括起来。Go语言的并行模型是以东尼·霍尔的通信顺序进程CCSP)为基础的,井采取了类似模型的其他语言(包括Occam和Limbo),但它也具有Pi运算的特征,比如通道传输。
与C++相比,Go语言并不包括如异常处理、继承、泛型、断言、虚函数等功能,但增加了slice型、井发、管道、垃圾回收、接口(Interface)等特性的语言级支持。当然,Google对于泛型的态度还是很开放的,但在该语言的常见问题列表中,对于断言的存在,则持负面态度,同时也在为自己不提供类型继承辩护。不同于Java,Go语言内嵌了关联数组(也称为哈希表(Hash)或字典(Dictionary)),就像字符串类型一样。
1.2.1 Go语言示例
可以在Go语言官网首页看到一个Go语言的HelloWorld示例,代码如下。
package main
import "fmt"
func main() {
fmt.Println("Hello World")
}
目前使用Go开发的项目非常多,其中就有国人开发的beego(用来开发Go应用程序的开源框架),另外一个就是大名鼎鼎的Docker。因此,本文会以Go语言代码为示例开发我们自己的Docker应用。
1.2.2 安装 Go
wget https://go.dev/dl/go1.21.5.linux-amd64.tar.gz
tar -vxf go1.21.5.linux-amd64.tar.gz
mv go /usr/local
vim .bashrc
export GOPATH=/root/go
export PATH=$PATH:/usr/local/go/bin
source .bashrc
1.2.3 配置GOPATH
GO PATH 是真正存放代码的路径,目录约定有如下3个子目录,没有可以自己mkdir建立。
- src 存放源代码。
- pkg 存放编译后生成的文件。
- bin 存放编译后的可执行文件。
执行,可以看到GOPATH位置
root@iZ2zed7lj4oetgoal2c8v7Z:~# go env | grep GOPATH
为了防止下载比较慢,可以修改Go的下载源。
go env -w GOPROXY='https://goproxy.cn,direct'
未完待续。。。
下一篇将会继续介绍Docker中NameSpace以及Cgroup的核心原理。
所有Docker合集:《Docker就应该这么学》
本文所有内容都是基于「动手写Docker」此书。关注微信公众号「云原生实战指南」,后台回复“动手写Docker”即可领取。