在谈及Docker时,不得不牵扯到一个现在很重要的一个领域:云计算。云计算是一种资源的服务模式,该模式可以按需的从可配置计算资源共享池中获取所需的资源,并且资源能快速供应和释放,利于资源管理和资源的充分利用,说白了就是充分利用硬件资源并节省成本。 云计算分为IaaS、PaaS和SaaS三层服务
劣势:IaaS的发展主要是以KVM、Xen、Vmware等重量级虚拟机为最小力度的资源调度单位,一般比较笨重。因为虚拟机本身运行需要占用大量宿主机的系统资源并且启动一个虚拟机相对缓慢,调度分发缓慢等一系列问题。PaaS在IaaS发展而来,PaaS在应用架构选择、支持的软件环境服务等方面有很大的限制,这样就造成了应用于平台无法解耦、应用运行时环境局限性强、运维人员控制力下降等各种问题。如何把虚拟机轻量级化?OpenVZ、VServer、LXC为代表的容器类虚拟机是一种内核虚拟化技术,与宿主机运行在相同的linux内核,不需要指令集模拟,性能消耗费朝向,是非常轻量级的虚拟化技术。Docker就是采用LXC的,Docker是以Docker容器为资源分割和调度的基本单位,封装整个软件运行时环境,为开发者和系统管理员设计的,用于构建、发布和运行分布式应用的平台。他是一个跨平台、可移植且简单易用的容器解决方案。
Docker是一个C/S的架构“软件”,以Docker Daemon作为Server端(在宿主机以守护进程形式运行)。Docker Client既可以采用以指令方式也可以采用RESTful API方式和Server通信。 Docker最主要的两个核心概念是镜像和容器,它的工作流程如下图所示:
用户只关心的是自己的应用在docker上能直接运行,至于怎么安装软件、运行在何种操作系统和版本等问题,都不应该是用户关心的。所以docker就把软件和它依赖的环境(包括操作系统、共享库、配置文件等)都打包成一个,以虚拟机的形式存放到仓库里,就好像GitHub里的代码一样。当大家想使用和部署软件时,只需要从仓库里面取出来即可。但是这种部署有一些问题?
1.如果每一个软件都要依赖操作系统,操作系统文件很大,运行事小下载和管理维护很费事?Docker采用了分层概念,把一个app分为多层。比如:操作系统是第一层也是最底层,依赖的库和第三方软件是第二层,应用的软件包和配置文件是第三层,如果两个应用操作系统相同即可共享底层。比如:app1和app2的操作系统版本一致,当安装运行app1时需要下载操作系统层,安装app2时则不需要下载操作系 统,只需下载它所依赖包和自身的软件包。 2.共享层存在冲突问题如何解决?针对同一个os的app1和app2,大多数是采用不同的操作系统配置。如何解决共享层的冲突问题?Docker对分层进行了高度抽离和扩展+写时拷贝来解决策略来解决该问题。对加入的分层采用了优先级的概念,计算机知识都是相同的,和进程的调度、作业的调度都是类似的。只不过docker的优先级是作用在它自己抽象实体层里,而进程和作业的优先级需要os设置。Docker规定:层次是有优先级的,上层和下层的文件和配置相同时,上层覆盖下层,以上层为准。Docker为每个app预留一个优先级最高的空白层,如果想修改文件只需要把文件拷贝到优先级最高的空白层,这样既能保证底层资源的稳定和共享,又能对每个app都可以进行高效的扩展。Docker采用分层和写时拷贝策略,相对于重量级的虚拟机(KVM、xen等)性能消耗非常小,基本上和一个普通的进程差不多。如下图所示:
在Docker本地仓库或官方仓库里,只要app有完整的文件系统和程序包,没有动态生成文件的需求。当从仓库下载到宿主机上运行对外提供的服务时,有可能修改文件,那么需要在优先级高的空白层用于写时拷贝。那么如何区分这两种不同的状态呢?Docker采用了镜像和容器来做了不同的区分。
如下图所示:
#安装
yum install docker-io
#启动
service docker start
#检查docker进程是否启动
ps aux | grep docker
service docker stop
mkdir /data/dockerData
mv /var/lib/docker /data/dockerData
ln -s /data/dockerData/docker /var/lib/docker
service start docker
service stop docker
wget https://....../docker.....
tar xf docker.tgz
cp docker/docker /usr/bin/docker
chmod +x /usr/bin/docker
service docker start
#配置文件位于**/etc/sysconfig/docker**
emacs /etc/sysconfig/docker
#找到**--insecure-registry**,它指定了内部Docker仓库的IP和端口,**-dns**指定内部DNS服务器的地址。
--insecure-registry 10.11.10.11:123 -dns 10.11.11.11
#修改sysctl.conf
emacs /etc/sysctl.conf
#增加如下内容
net.ipv4.ip_forward=1
#配置生效
sysctl -p
Docker默认采用的网络配置是NAT模式,如果要是用网桥配置,要如下配置:
#宿主机配置网桥
#备份网络配置
cp /etc/sysconfig/network-scripts/ifcfg-eth1 /opt
emacs /etc/sysconfig/network-scripts/ifcfg-eth1
#修改如下内容
DEVICE='eth1' # 你的网卡设备名称
HWADDR=00:00S..... #网卡MAC地址
ONBOOT=yes #启动时配置生效
BRIDGE=br100 #网桥名称
#修改网桥配置
emacs /etc/sysconfig/network-scrpts/ifcfg-br100
DEVICE='br100'
TYPE=Bridge
BOOTPROTO=static
ONBOOT=yes
IPADDR='ip address' # 宿主机的IP
NETMASK='XX'#宿主机的子网掩码
GATEWAY='XX'#宿主机的网关
#重启生效
/etc/init.d/network restart
# 安装pipework脚本,用于给container指定IP。
wget -O /usr/bin/pipework https://xxxxx
chmod +x /usr/bin/pipework
# 更新iproute
yum install iproute
service start docker
最近在学习Docker,深深感受到Docker的强大和优势。不仅是解决问题还是设计思路都值得学习。不知道Docker在安全性方面如何做的?由于是采用Linux操作系统的内核的一部分组件来实现的,那么一些交互和传输就得依靠Linux 内核组件,随之带来的安全性如何确保非常安全个人觉得有待思考。