Docker 容器简介与部署
Docker容器简介
Docker的构想是要实现 "Build,Ship and Run Any App,Anywhere" ,即通过对应用的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)生命周期进行管理,达到应用组件 "一次封装,到处运行" 的目的.这里的应用组件,既可以是一个Web应用、一个编译环境,也可以是一套数据库平台服务,甚至是一个操作系统或集群.基于Linux平台上的多项开源技术,Docker提供了高效、敏捷和轻量级的容器方案,并支持部署到本地环境和多种主流云平台.可以说,Docker首次为应用的开发、运行和部署提供了"一站式"的实用解决方案,而且Docker的源代码是开源的,并已加入了Linux基金会,遵循Apache2.0协议,全部开源代码均在https://github.com/docker/上进行维护.
跟大部分新兴技术的诞生一样,Docker也并非"从石头缝里蹦出来的",而是站在前人的肩膀上,其中最重要的就是Linux容器(LinuxContainers LXC)技术,LXC可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性.相当于C++中的NameSpace.容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求,LXC在资源管理方面依赖于Linux内核的cgroups子系统,cgroups子系统是Linux内核提供的一个基于进程组的资源管理的框架,可以为特定的进程组限定可以使用的资源.LXC在隔离控制方面依赖于Linux内核的namespace特性,具体而言就是在clone时加入相应的flag.
Docker与Linux系统
在LXC的基础上,Docker进一步优化了容器的使用体验,首先Docker提供了各种容器管理工具(如分发、版本、移植等)让用户无需关注底层的操作,可以更简单明了地管理和使用容器.其次Docker通过引入分层文件系统构建和高效的镜像机制,降低了迁移难度,极大地提升了用户体验.用户操作Docker容器就像操作应用自身一样简单,早期的Docker代码实现是直接基于LXC的,自0.9版本开始Docker开发了libcontainer项目,作为更广泛的容器驱动实现,从而替换掉了LXC的实现.目前Docker还积极推动成立了runC标准项目,试图让容器支持不再局限于Linux操作系统,而是更安全、更具扩展性.
简单来说,其实我们可以把Docker容器理解为一种轻量级的沙盒(sandbox),每个容器内运行着一个应用,不同的容器相互隔离,容器之间也可以通过网络互相通信.容器的创建和停止都十分快速,几乎跟创建和终止原生应用一致.另外,容器自身对系统资源的额外需求也十分有限,远远低于传统虚拟机.很多时候,甚至直接把容器当作应用本身也没有任何问
题.
Docker虚拟化的好处
Docker项目的发起人和Docker公司CTO Solomon Hykes曾认为,Docker在正确的地点、正确的时间顺应了正确的趋势——如何正确地构建应用.在云时代,开发者创建的应用必须要能很方便地在网络上传播,也就是说应用必须脱离底层物理硬件的限制.同时必须是"任何时间、任何地点"可获取的,因此,开发者需要一种新型的创建分布式应用程序的方式,快速分发和部署,这正是Docker所能够提供的最大优势,
Docker还可以快速迁移数据,通过容器来打包应用,解耦应用和运行平台.意味着迁移的时候,只需要在新的服务器上启动需要的容器就可以了,无论新旧服务器是否是同一类型的平台.这无疑将节约大量的宝贵时间,并降低部署过程出现问题的风险.
Go语言与Docker
相比Go语言与其它语言的对比,国内外很多技术媒体都有列举,在Docker领域Go语言相比其它语言的优势在于.
● 相对于C/C++开发难度低,支持向前兼容,运维维护成本小.
● 相对于python生成的是静态文件,有效的避免的低级错误,并且性能高一个等级.
● 并发性好,内存占用低,属于编译型.
● 部署简单,毕竟生成的静态文件,有glibc的地方就能运行.
一门语言当然也有自己的缺点,比如内存回收延迟久,图片处理库有bug,对包版本要求严格等一些问题,但是瑕不掩瑜,一个开发成本极其简单,性能优良,部署简单的语言与Docker简直就是天作之合.
Docker的引擎简介
Docker的是基于Linux自带的(Linux Containers,LXC)技术,在LXC上Docker进行了近一步封装.正因为如此,Docker只能在Linux环境下运行,当然前段时间docker终于支持OSX和Windows了,虽然还是体验尝鲜版,但更加方便开发者去开发了.
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源码的两个入口文件。
参考文献:《Docker技术入门与实战》《Docker基础与实战》
Docker 容器简介与部署的更多相关文章
- Docker容器使用jenkins部署web项目--总结(二)
(1)需要安装Docker容器,在Docker容器内安装jenkins,gogs,tomcat. 新建maven项目,添加findbugs plugin. 使用docker启动jenkins,go ...
- HyperLedger/Fabric SDK使用Docker容器镜像快速部署上线
HyperLedger/Fabric SDK Docker Image 该项目在github上的地址是:https://github.com/aberic/fabric-sdk-container ( ...
- Docker容器技术-自动化部署
一.用Chef自动化部署Docker 1.为什么需要自动化部署? Docker引擎需要配置很多参数(cgroups.内存.CPU.文件系统等) 识别Docker容器运行在哪个宿主机上 耗时且容易出错, ...
- .NET 微服务 1. Docker 容器简介和选择
容器特点 1. 容器可以将应用程序的依赖性和配置(抽象为 Mainfest 文件并部署)打包成一个容器镜像,可以让多次部署操作中的环境保持一致 2. 可以让IT人员很少或者不做修改就可以跨环境部署软件 ...
- Flask 教程 第十九章:Docker容器上的部署
本文翻译自The Flask Mega-Tutorial Part XIX: Deployment on Docker Containers 这是Flask Mega-Tutorial系列的第十九部分 ...
- docker 容器模式下部署mysql 主从复制
1.计划用两台host来部署,分别部署一台 mysql,一主一从,2.配置好主从mysql配置文件,更改文件名即可[client]port = 3306socket = /var/run/mysqld ...
- SpringCloudAlibaba微服务docker容器打包和部署示例实战
概述 我们使用前面<SpringCloudAlibaba注册中心与配置中心之利器Nacos实战与源码分析(中)>的两个微服务示例,分别是库存微服务和订单微服务,基于Nacos注册中心和配置 ...
- Linux环境基于CentOS7 搭建部署Docker容器
1.Docker容器概述 区分Docker容器技术和VM虚拟机技术: evernotecid://394EFE90-9CE0-4D65-A8CD-DFEC0DC8061E/appyinxiangcom ...
- 【docker部署】基于linux的centos操作系统部署安装docker容器
一.docker介绍 容器是轻量级的,包含应用运行所需所有东西(代码.库.运行时环境.系统设置,以及依赖关系)的独立的包.每个容器都部署于它自己的 CPU.内存.块 I/O,以及网络资源上,所有这些都 ...
随机推荐
- [题解] [CF451E] Devu and Flowers
题面 题解 就是一个求\(\sum_{i= 1}^{n}x _ i = m\)的不重复多重集的个数, 我们可以由容斥原理得到: \[ ans = C_{n + m - 1}^{n - 1} - \su ...
- Inter IPP 绘图 ippi/ipps
IPP的资料网上比较少,主要还是参考Inter官网和文档 官方文档ipps.pdf主要是对数据做处理,包括加减乘除.FFT.DFT等 文档ippi.pdf只要是对图像做处理,包括通道转换.图片处理等 ...
- 线程系列5--java中的ThreadLocal类实现线程范围内的数据共享(二)
ThreadLocal类可以理解成一个类似与map集合使用,以当前线程当做key 来使用,将线程氛围内需要共享的数据当做value,形成键值对的形式使用.ThreadLocal和线程同步机制都是为了解 ...
- DB 分库分表(3):关于使用框架还是自主开发以及 sharding 实现层面的考量
当团队对系统业务和数据库进行了细致的梳理,确定了切分方案后,接下来的问题就是如何去实现切分方案了,目前在sharding方面有不少的开源框架和产品可供参考,同时很多团队也会选择自主开发实现,而不管是选 ...
- SRS之RTMP handshake
1. SrsRtmpServer::handshake 位于 srs_rtmp_stack.cpp. int SrsRtmpServer::handshake() { int ret = ERROR_ ...
- vsftpd 配置上传失败553
1查看ftp服务 ftp://ftpuser:123456@10.11.102.58:8023 2 getsebool -a | grep ftp 临时关闭 [root@xuegod63~]# get ...
- [Java]算术表达式组建二叉树,再由二叉树得到算式的后序和中序表达式
Entry类: package com.hy; import java.io.BufferedReader; import java.io.IOException; import java.io.In ...
- OpenCV学习笔记(15)——更多的轮廓函数
凸缺陷,以及如何找到凸缺陷 找某一点到一个多边形的最短距离 不同形状的匹配 1.凸缺陷 前面已经设计了轮廓的凸包和凸性缺陷的概念.OpenCV中有一个函数cv2.convexityDefect()可以 ...
- jQuery获取元素值以及设置元素值总结
html(): 1:用户获取元素内的HTML内容,如果元素包含子标签,会以整体的形式返回 2:只获取第一个元素的内容 3:只获取普通元素的内容,表单元素内容无法获取 html(val): 1:用来设置 ...
- backspace 产生乱码的问题
1.要使用回删键(backspace)时,同时按住ctrl键(一般情况下会有用,如果没用使用下面的方法) 2.设定环境变量 在bash下:$ stty erase ^? 或者把 stty er ...