Docker的是基于Linux自带的(Linux Containers,LXC)技术,在LXC上Docker进行了近一步封装.正因为如此,Docker只能在Linux环境下运行,当然前段时间docker终于支持OSX和Windows了,虽然还是体验尝鲜版,但更加方便开发者去开发了.
♥ 文章声明 ♥
该系列文章部分文字描述,整理于以下文献,化繁为简.
《鸟哥的Linux私房菜 (基础学习篇 第三版)》 - 作者:鸟哥
《Linux就该这么学》 - 作者:刘遄
《linux运维之道》- 作者:丁明一
《docker技术入门与实战》
Docker的原理
其实前面讲了这么多,Docker的原理已经不言而喻,这里用IBM的解释就是:
容器有效的将单个操作系统管理的资源划分到孤立的组中,以便更好的在孤立的组之间平衡有冲突的资源使用需求.与虚拟化相比,这样既不需要指令级模拟,也不需要即时编译.容器可以在核心CPU本地运行指令,而不需要任何专门的解释机制.此外,也避免了准虚拟化(paravirtualization)和系统调用替换中的复杂性.
简而言之就是,Docker是一个盒子,一个盒子装一个玩具,无论你丢在哪里,你给他通电(glibc)他就能运行.你的玩具大就用大盒子,小玩具就用小盒子.
两个应用之间的环境是环境是完全隔离的,建立通信机制来互相调用.容器的创建和停止都十分快速(秒级),容器自身对资源的需求十分有限,远比虚拟机本身占用的资源少.
Docker容器Yum安装
1.配置YUM源,此处我们使用阿里源,并安装EPEL源,和Docker相应的依赖.
[root@localhost ~]# rm -fr /etc/yum.repos.d/*
[root@localhost ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@localhost ~]# yum makecache
[root@localhost ~]# yum -y install epel-release
[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
2.下载Docker源,并开始配置一些安装属性列表.
[root@localhost ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@localhost ~]# yum-config-manager --enable docker-ce-edge
[root@localhost ~]# yum-config-manager --enable docker-ce-test
[root@localhost ~]# yum-config-manager --disable docker-ce-edge
3.开始安装Docker,并设置开机自启动.
[root@localhost ~]# yum install -y docker-ce
[root@localhost ~]# yum list docker-ce --showduplicates | sort -r
[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl enable docker
[root@localhost ~]# docker run hello-world
4.接着配置好阿里云Docker加速器地址.
[root@localhost ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://h8o9al0n.mirror.aliyuncs.com"]
}
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
[root@localhost ~]# docker version
Docker容器编译安装
1.通过Yum仓库安装Docker,因为docker的源码需要在容器中运行,因此必须要有docker存在.
[root@localhost ~]# rm -fr /etc/yum.repos.d/*
[root@localhost ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@localhost ~]# yum makecache
[root@localhost ~]# yum -y install epel-release
[root@localhost ~]# yum install -y git docker docker-client docker-common
Package 2:docker-1.13.1-88.git07f3374.el7.centos.x86_64 already installed and latest version
Package 2:docker-client-1.13.1-88.git07f3374.el7.centos.x86_64 already installed and latest version
Package 2:docker-common-1.13.1-88.git07f3374.el7.centos.x86_64 already installed and latest version
Nothing to do
2.使用Git工具下载最新版的Docker源代码,并在源码的根目录执行make build,这一步会调用Makefile中的build分支代码:
[root@localhost ~]# git clone https://github.com/docker/docker.git
[root@localhost ~]# make build
build: bundles init-go-pkg-cache docker build ${BUILD_APT_MIRROR} ${DOCKER_BUILD_ARGS} -t "$(DOCKER_IMAGE)" -f "$(DOCKERFILE)"
这一步会使用docker创建一个临时的容器,并在容器中基于DOCKERFILE创建image
3.执行make binary,这会调用Makefile中的binary分支代码:
[root@localhost ~]# make binary
binary: build ## build the linux binaries $(DOCKER_RUN_DOCKER) hack/make.sh binary
#这一步是在上一步创建的image中创建容器并在容器中运行hack/make.sh
在hack/make.sh 中会调用/hack/make/binary,
#在hack/make/binary中会调用/hack/make/binary-client 和binary-daemon,这两个脚本会分别调用同目录下的.binary文件,在.binary文件中会执行go build 语句实现源码的最终的编译:
go build / -o "$DEST/$BINARY_FULLNAME" / "${BUILDFLAGS[@]}" / -ldflags " $LDFLAGS $LDFLAGS_STATIC_DOCKER " / $GO_PACKAGE
#我们可以追踪GO_PACKAGE,发现它就是/docker/cmd/docker/docker.go和/docker/cmd/dockerd/docker.go两个文件,也就是docker源码的两个入口文件。
版权声明:本博客文章与代码均为学习时整理的笔记,文章 [均为原创] 作品,转载请 [添加出处] ,您添加出处是我创作的动力!