Docker 学习系列一之原理


Docker 认识

在谈及Docker时,不得不牵扯到一个现在很重要的一个领域:云计算。云计算是一种资源的服务模式,该模式可以按需的从可配置计算资源共享池中获取所需的资源,并且资源能快速供应和释放,利于资源管理和资源的充分利用,说白了就是充分利用硬件资源并节省成本。 云计算分为IaaS、PaaS和SaaS三层服务

  • Iaas 基础设施即服务,为基础设施运维人员服务提供计算、存储和网络等资源。
  • PaaS 平台即服务,为应用开发人员提供支撑应用运行所需的软件运行时环境、相关工具与服务(数据库、监控、日志等)。
  • SaaS 软件即服务,为一般用户提供一整套软件系统,用户只需通过浏览器和应用客户端就能访问部署在云上的应用服务。

劣势:IaaS的发展主要是以KVM、Xen、Vmware等重量级虚拟机为最小力度的资源调度单位,一般比较笨重。因为虚拟机本身运行需要占用大量宿主机的系统资源并且启动一个虚拟机相对缓慢,调度分发缓慢等一系列问题。PaaS在IaaS发展而来,PaaS在应用架构选择、支持的软件环境服务等方面有很大的限制,这样就造成了应用于平台无法解耦、应用运行时环境局限性强、运维人员控制力下降等各种问题。如何把虚拟机轻量级化?OpenVZ、VServer、LXC为代表的容器类虚拟机是一种内核虚拟化技术,与宿主机运行在相同的linux内核,不需要指令集模拟,性能消耗费朝向,是非常轻量级的虚拟化技术。Docker就是采用LXC的,Docker是以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 镜像和容器

在Docker本地仓库或官方仓库里,只要app有完整的文件系统和程序包,没有动态生成文件的需求。当从仓库下载到宿主机上运行对外提供的服务时,有可能修改文件,那么需要在优先级高的空白层用于写时拷贝。那么如何区分这两种不同的状态呢?Docker采用了镜像和容器来做了不同的区分。

  • 镜像:在本地仓库和官方Hub都是以镜像的形式存储的,镜像是一份曾、可以被LXC/libcontainer理解的存储格式。所以docker的应用都要以镜像的形式存储到仓库中,供大家使用。
  • 容器:把应用从仓库中下载到本地,以镜像为模板,在一个虚拟机中启动应用。这个虚拟机就是容器。

如下图所示:

Docker 安装

安装Docker并启动

#安装
yum install docker-io
#启动
service docker start
#检查docker进程是否启动
ps aux | grep docker

Docker数据目录转移到大的磁盘分区

service docker stop
mkdir /data/dockerData
mv /var/lib/docker /data/dockerData
ln -s /data/dockerData/docker /var/lib/docker
service start docker

升级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

修改Docker监听内网的配置文件

#配置文件位于**/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 内核组件,随之带来的安全性如何确保非常安全个人觉得有待思考。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏宝哥的专栏

Docker系列学习文章 - 镜像仓库的介绍(七)

| 导语 前面我们讲了镜像的制作,知道了镜像是怎么生成的。但是镜像制作好了后,要怎么管理?他们存在哪里。通过本篇文章的讲解,大家就清楚了。

2.2K16

将基于MicroProfile的应用程序部署到IBM Cloud Private上

Eclipse MicroProfile是一个用于优化微型服务体系结构的企业级Java的开源项目。基于MicroProfile的应用程序可以部署到Kuberne...

2689
来自专栏魏艾斯博客www.vpsss.net

如何下载安装使用 SSH 软件

2195
来自专栏CodeSheep的技术分享

利用K8S技术栈打造个人私有云(连载之:基础镜像制作与实验)

任何一家云主机厂商提供给用户的主机功能其实讲白了就是一个操作系统基础镜像的运行实例。因此本篇博文将讲解如何在本地构建一个带ssh组件的centos底包镜像并上传...

4656
来自专栏信达雅

OpenShift 的容器镜像(第 3 部分):使您的镜像易用

这是我在欧洲,中东和非洲(EMEA)红帽技术交流 2017 会议上的一个会议记录,与会者包括 EMEA 所有红帽解决方案架构师和顾问。会议的主要内容包括了在创建...

2306
来自专栏SDNLAB

用防火墙来保障容器安全(Docker/Kubernetes)

在部署任何基于容器的应用程序之前,首先通过确保Docker、Kubernetes或其他容器防火墙来保护容器的安全至关重要。有两种方式来实现容器防火墙:手动或通过...

4716
来自专栏云计算D1net

容器管理必备:掌握工具和技能

当制订容器管理策略时,选择正确的工具只是万里长征迈出了第一步。 那些在云应用开发和应序迁移过程中应用容器技术(例如Docker)的用户很快就会认识到使用容器管理...

35812
来自专栏生信技能树

跟着jimmy学docker系列之第4讲:docker容器资源调度问题(MAC版本)

前面我们复习了docker的用法,而且我还带领大家亲自构建了一个自己的docker容器,也成功的在测试数据集里面运行了,但是前面我说的,我这次搞docker是因...

1662
来自专栏北京马哥教育

haproxy思维导图

今天给大家带来的思维导图之haproxy。 小伙伴们一起来学习吧! ? HAProxy是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)...

3105
来自专栏从零学习云计算

kubernetes学习记录(1)——kubernetes初理解

入门时,学习阅读的为《你闺女也能看懂的插画版Kubernetes指南》。由Deis的平台架构师Matt Butcher向他女儿介绍什么是Kubernetes,内...

5260

扫码关注云+社区

领取腾讯云代金券