Docker介绍及安装

Docker 是一个开源的应用容器引擎,Go语言所开发,基于 Linux内核 的 CGroup、Namespace、Union FS 等技术实现,对应用程序进行封装隔离,并且独立于宿主机(host)与其它进程,这种运行时封装的状态成为容器。是一种系统级的虚拟化技术。

Docker 并非从石头缝里蹦出来的,而是站在前人的肩膀上,即是 LXC(Linux Containers),因为 LXC 做的非常底层,不方便管理和使用,在2013年 Docker 发布,最初的 Docker 就是对 LXC 做了进一步封装,包括文件系统、网络、镜像管理等方面,极大简化了容器管理。然后从0.7版本以后去除LXC,转为自行研发的 libcontainer,从 1.1 开始又进一步演化为 runc 和containerd。

Docker 所使用的技术也非新技术,但是它在合适的时间做了合适的事情,将一系列技术有机的组合到了一起,提供了极致的用户体验,才有了今天这个跨时代的产品。


目录

一、Container? Docker?

二、Docker体系结构

三、Docker底层技术

四、CentOS安装Docker


一、Container? Docker?

容器(Container)在我们生活中是随处可见的:喝水用的杯子,是水容器;装香烟的烟盒,是香烟的容器;而 Docker 即是应用程序的容器。

它将应用程序以及其运行所依赖的环境都打包到一个可移植的容器中,可发布到任意的 Docker Engine 上,类似于早期Java“到处运行”的理念。

1. 每次部署项目到测试、生产等环境,都要部署一大堆依赖的软件、工具,而且部署期间出现问题几率很大,不经意就花费了许多时间,在 Docker,我们只需要将每个项目环境打包到 image,push到仓库,当需要部署这个项目时,直接 pull image 启动容器,这个项目就可以访问了。而无需考虑不同平台带来的影响。

2. 如果有一个产品需要部署到客户那里,以往都是派一名实施工程师到客户那里部署,花费人工成本高,Docker 可以将这个项目产品封装打包成起来,通过容器编排工具实现一键部署,分分钟搞定。

3. Continuous Integration、Continuous Deployment、Continuous Delivery,CI/CD。CI/CD是一个持续性自动化项目流程,包括构建、部署、测试、发布等工作,原则是自动化而减少人工干预。Docke r将项目及依赖关系打包成 image,可快速部署到任何环境中,包括测试环境、预生产环境、生产环境,消除了线上线下的环境差异问题,极大减少由于环境不一致导致的问题,加快了开发,部署和回滚。

4. 微服务架构是当下最流行的一种业务架构开发模式,目的是让臃肿的业务系统拆分成多个微服务,一个微服务完成某个特定的功能,如电商的购物车、支持、用户后台、消息等等。每一个微服务都是微型应用,都有自己的业务逻辑和适配器。一些微服务还会发布API给其它微服务和应用客户端使用。

微服务特点:组件化、解耦合、去中心、灵活独立。

容器特点:装箱、隔离、可移植、快速部署。

5. 在业务访问量增高时,得扩容服务器。传统方式上新项目或扩容大致上都要先申请设备,然后审批,虚拟机创建,环境部署,测试代码,然后再上线。多部门协作,跑一次起码得搞上一个礼拜。当使用容器技术后,这种资源伸缩就可以靠运行在物理机或云主机上的容器来实现,由于 Docker 容器快速启动的特性(秒级),可以快速部署几十个、上百个容器来提供服务,成倍提高并发能力,缩短上线周期。当业务高峰期下去了,动态销毁一部分容器,释放资源,让业务低成本稳定运行。

6. 公司开展其它业务线,打造自己的生态圈。多业务线给运维带来了一定的挑战,例如不同项目多种开发语言,这就意味着运维环境不同,要维护多个版本,写N个脚本、长期积累还会导致非常杂乱。用 Docker,我们完全可以根据不同环境构建不同的“基础镜像”,例如Java、PHP的运行环境,然后在“基础镜像”之上去构建“项目镜像”,“项目镜像”是基于“基础镜像”之上进行又一次进行打包的。镜像打包好以后在“镜像仓库”中管理、维护,通过版本管理应用环境镜像。

7. container最大的特点就是移植性,现在越来越多的云商研发容器云,用户再也无需担心收到云平台的捆绑了,项目上云下云,混合部署等会变的非常便捷。

二、Docker体系结构

1. Docker daemon

Docker 采用 C/S 架构,Docker daemon 作为服务端接受来自客户端的请求,并处理这些请求,比如创建、管理容器和镜像。

2. Docker Client

通常说的 Docker,指的是 Docker Engine,是以 daemon 模式运行,Docker Client 以系统命令的形式存在,用户通过 Docker Client 来与 daemon 打交道。

3. Containers

Docker 利用容器来运行应用,容器本质上是Linux系统上的一个进程,这个父进程可能会有多个子进程组成,这一组进程受到资源限制,与其他的进程之间隔离,这种运行时的状态就是容器。每一个容器都是从 Docker Image 创建的。

4. Images

镜像是容器运行时的只读模板,镜像可以用来创建容器,一个镜像可以创建N个容器,镜像通常封装了一个应用的基础环境。每个镜像由一系列的层所构成,当改变了一个镜像,一个新的层就会被创建。比如在centos镜像中安装了Java运行环境,就成了Java环境的镜像,其底层一个centos系统镜像,上面叠加了一个Java层,就完成了一个Java镜像的构建。这个centos镜像也是Java镜像的父镜像。

*注:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。

5. Registry

Registry 用来保存镜像,企业通常自建私有仓库,也可以使用公开仓库,比如 Docker Hub,https://hub.docker.com/,是 Docker官方提供的公共托管 Registry,上面有许多现成的镜像,当使用Docker命令基于镜像来运行容器时,如果本地没有镜像,默认就会从这个仓库下载。

三、Docker底层技术

Docker底层的两个核心技术:Namespaces、Control Groups

1. Namespaces

Linux内核提供了6种 namespace 隔离的系统调用

NAMESPACESYSTEM CALLISOLATE
UTSCLONE_NEWUTS主机名、域名
IPCCLONE_NEWIPC信号量、消息队列、共享内存
PIDCLONE_NEWPID进程号
NetworkCLONE_NEWNET网络设备、协议栈、端口
MountCLONE_NEWNS文件系统
UserCLONE_NEWUSER用户和组

(1)UTS Namespace(Unix Time-sharing System)

提供了主机名和域名的隔离,这样每个容器就拥有了独立的主机名和域名,使每个容器的网络被视为一个独立的网络。

(2)IPC Namespace(Inter-Process Communication)

进程间通信,涉及的资源包括信号量、消息队列和共享内存,实现了在同一个 namespace 的进程之间才能可见这些资源。

(3)PID Namaspace

每个 PID namespace 中的进程可以有独立的 PID,不同 namespace 也可以是相同的 PID。

(4)Network Namespace

该 namespace 确保每个容器有独立的网络设备、协议栈、端口。

(5)Mount Namespace

确保每个容器有自己独立的文件系统视图。在容器种看到的目录结构跟Linux系统基本一样的,容器的文件系统完全独立于Docker Host 及其它容器。

(6)User Namespace

隔离用户权限相关的资源,包括用户ID、组ID。在不同的namespace中的用户名、组名、UID、GID可以一样。

 

小结:Docker 利用 namespace 完成了一个容器所需要的6种资源隔离,每一个 namespace 之间是完全独立的存在,这种环境即是 container。

2. Control Groups

Control Groups 是Linux内核提供的一种用于限制、记录、隔离进程组所使用的物理资源的机制。

其提供了以下三大功能:

(1)资源限制:control groups 可以对任务使用的资源总额进行限制,如果应用运行时超出设定的内存的上线,就会报 OOM。CPU不像内存那样可以直接限制分配大小,CPU是根据算法分配进程一个 time slice,一旦用完会将状态保存在寄存器中,以便于下次恢复当时的状态继续处理,control groups 通过限制分配的 time slice来限制容器使用的CPU。

(2)资源统计:control groups 可以统计系统的资源使用量,如CPU使用时长、内存用量等。

(3)任务控制:control groups 可以对任务执行挂起、恢复等操作。

四、CentOS安装Docker

官方的安装文档: https://docs.docker.com/install/linux/docker-ce/centos/

Linux发行版自带的网络源带的docker版本过于老旧,在安装最新稳定版之前需要卸载原有的docker,名字可能是docker、docker-engine之类的

$ sudo yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-selinux \
    docker-engine-selinux \
    docker-engine

安装依赖包

$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2

配置yum源

$ sudo wget -P /etc/yum.repos.d/ https://download.docker.com/linux/centos/docker-ce.repo

查看可用版本

$ yum list docker-ce --showduplicates

安装docker-ce

$ sudo yum install docker-ce

启动docker,设为开机自启动

$ sudo systemctl restart docker.service

$ sudo systemctl enable docker.service

将普通用户加入到docker组,方便使用docker命令

# su - root

# usermod -aG docker qkc

# exit

查看docker版本

$ docker version

查看docker信息

$ docker info

配置加速器     daocloud、docker cn、阿里云加速器、中国科技大学

$ curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://bc437cce.m.daocloud.io

$ sudo systemctl restart docker.service

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值