Docker的概念、架构、安装详解

Docker的概念、架构、安装详解

一、Docker产生的背景和优势

微服务架构的兴起伴随着各种各样相比于单体架构的优势,但是微服务的拆分和集群却大大增加了部署的难度。

比如:

  • 分布式系统中,依赖关系复杂,容易出现兼容性问题。

  • 开发、测试、生产环境各有有差异,有的差异还比较大。

Docker没有出现之前,通常使用虚拟机的方式来部署微服务。

但是使用虚拟机来部署为服务,依旧有很多困扰。

除了对服务器性能有所要求,操作起来也是非常的繁琐。

光是使用vmware创建不同微服务的虚拟机,再配置不同微服务的运行环境就让人望而却步。

Docker的出现就是为了解决分布式部署的难题,并且以更低的成本去创建微服务的部署环境。

1.1 Docker是如何解决这些问题的

1.1.1 解决依赖的兼容问题
  • 将应用的Libs(函数库)、Deps(依赖)、配置与应用本身一起打包

  • 将每个打包好的应用放到一个隔离容器去运行,避免互相干扰

这样打包好的应用包中,既包含应用本身,也包含应用所需要的LibsDeps,无需再操作系统上安装这些。

因此就不存在不同应用之间的兼容问题了。

1.1.2 解决打包应用跨不同Linux系统运行的问题
  • Docker将用户程序与所需要调用的系统(比如CenterOS)的函数库一起打包。
  • Docker运行到不同操作系统时,直接基于打包的函数库,借助于操作系统的Linux内核来运行。

关于函数库的解释:

各种不同的Linux系统,其Linux内核都是相同的。只是系统应用不相同。

并且对于操作Linux内核的指令集的封装有所不同。

而不同系统对于自己Linux指令集的封装可能会不一样,就会形成不同的函数库。

Docker直接借助不同操作系统的Linux内核去运行,二部是直接使用当前系统的函数库。

自然就解决了跨系统运行的问题。

因此Docker打包好的应用可以部署在任何基于Linux内核的系统上运行!

注意:

Docker本质上只能够在Linux系统上运行。

即使现在有了可以在Windows上运行的Docker,也只不过是虚拟了一个隔离的Linux环境去运行Docker

只不过这个过程用户看不到。

1.2 Docker的优势

  • 可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统。
  • 运行时利用沙箱机制形成隔离容器,各个应用互不干扰。
  • 启动、移除都可以通过一行命令完成,方便快捷。
  • 占用资源小。
  • 共享操作系统主机资源和系统内核。

1.3 Docker与虚拟机的主要不同点

1) 系统方面

  • Docker是一个系统进程;
  • 虚拟机是在操作系统中的操作系统。

2)运行和占用资源方面

  • Docker体积小,硬盘占用以MB为单位,启动速度快,性能好;
  • 虚拟机体积大、,硬盘占用以GB为单位,启动速度慢,性能一般。

Docker的概念、架构、安装详解_第1张图片

Docker容器 虚拟机
操作系统 与宿主机共享操作系统 宿主机操作系统上运行虚拟机操作系统
存储大小 镜像小,便于存储与传输 镜像庞大(vmdk、vdi等)
运行性能 几乎无额外性能损失 操作系统额外的CPU、内存消耗
移植性 轻便、灵活,适应于Linux 笨重,与虚拟化技术耦合度高
硬件亲和性 面向软件开发者 面向硬件运维者
部署速度 快速,秒级 较慢,10s以上

二、Docker重要概念

名称 说明
镜像(Image) Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像
容器(Container) 镜像中的应用运行后形成的进程就是容器,Docker会给容器进程做隔离,对外不可见
仓库(Repository) Docker 仓库和Git的仓库相似,在本地构建完镜像之后,即可通过仓库进行镜像的分发

2.1 镜像和容器的解释

应用最终都是代码组成,都是硬盘中的一个个的字节形成的文件。只有运行时,才会加载到内存,形成进程。

  • 镜像,就是把一个应用在硬盘上的文件、运行环境、部分系统函数库打包形成的文件包。文件包是只读的。

    image文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。

  • 容器,就是将这些文件中编写的程序、函数加载到 内存中,形成进程,只不过要隔离起来。

    因此一个镜像可以启动多次,形成多个容器进程。

  • 仓库,就是放一堆镜像的地方,可以把镜像发布到仓库中,需要的时候再从仓库中拉下来就可以了。

    意思就是Docker可以从镜像托管仓库中拉取镜像到本地仓库,也可以把本地仓库中的镜像上传到镜像托管仓库。

2.2 镜像托管仓库DockerHub

开源应用程序非常多,打包这些应用往往是重复的劳动。

为了避免这些重复劳动,人们就会将自己打包的应用镜像,例如RedisMySQL镜像放到网络上,共享使用。

就像GitGitHub的代码共享一样。

  • DockerHub是一个官方的Docker镜像的托管平台。这样的平台称为Docker Registry(Docker注册中心)。

    https://hub.docker.com/
    
  • 国内也有类似于DockerHub 的公开服务,比如 :

    • 网易云镜像服务

      https://c.163yun.com/hub
      
    • 阿里云镜像库

      https://cr.console.aliyun.com/
      
  • 自己也可以构建Docker仓库,构建一个属于自己的私有云仓库。

使用国内镜像仓库可以提升拉取镜像的速度。

2.3 Docker架构

Docker是一个CS架构的程序,由两部分组成:

  • 服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等
  • 客户端(client):通过命令或RestAPIDocker服务端发送指令。可以在本地或远程向服务端发送指令。
    Docker的概念、架构、安装详解_第2张图片

释义:

假设客户端使用docker pull系列命令拉取一个Nginx镜像,

客户端再用docker run系列命令,让Docker服务端执行对应的镜像,生成一个不被其它容器影响的独立容器。

2.4 Docker运行的基本流程

  • 用户使用Docker ClientDocker Daemon建立通信,并表送请求给后者。

  • Docker Daemon作为Docker陈构中的主体部分。

    首先提供DockerServer的功能使其可以按受Docker Client的请求。

  • Docker Engine执行Docker内部的一系列工作,每一项工作都是以一个Job的形式的存在。

  • job的运行过程中,当需要容器镜像时,则从Docker Registry 中下载镜像,并通过镜像管理驱动Graph driver形式存储

  • 当需要为Docket创建网络环境时。通过网络管理驱动Network diver创建并配置Docker容器网络环境。

  • 当需要限制Docker容器运行资源或执行用户指令等操作时,则通过Exec driver来完成。

  • Libcontainer是一项独立的容器管理包。Network driver以及Exec driver都是通过Libcontainer来实现具体对容器进行的操作

三、Docker的安装

Docker 分为 CEEE 两大版本:

  • CE 即社区版(免费)。

  • EE 即企业版,强调安全,付费使用。

官方安装文档:

https://docs.docker.com/install/

Docker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10, CentOS 7 满足最低内核的要求。

这里就以Docker CECentOS 7上的安装为例。

3.1.卸载(可选操作)

如果之前安装过旧版本的Docker,可以先卸载:

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine \
                  docker-ce

注:

\是命令分隔符,当一行命令太长的时候,可以使用它来进行换行。

3.2 安装yum-utils工具

# 安装它是因为系统默认没有命令yum-config-manager
# yum-config-manager命令在yum-utils中
yum install -y yum-utils \
           device-mapper-persistent-data \
           lvm2 --skip-broken

3.3 重新设置本地yum镜像源

#命令1 添加 Docker 稳定版本的 yum 软件源,即配置docker仓库
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
# 命令2 sed -i 直接修改读取的文件内容,而不是输出到终端
# sed -i 's/原字符串/新字符串/g' /etc/yum.repos.d/docker-ce.repo
# 这里就是把文件/etc/yum.repos.d/docker-ce.repo中的
# download.docker.com/mirrors.aliyun.com\ 替换为 docker-ce
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo

#命令3 将软件包信息提前在本地索引缓存,用来提高搜索安装软件的速度,执行这个命令可以提升yum安装的速度
yum makecache fast

Docker的概念、架构、安装详解_第3张图片

3.4 安装docker-ce版本

yum install -y docker-ce

看到完毕字样即安装成功!

3.5 拓展

# ubuntu下docker官方安装教程
https://docs.docker.com/engine/install/ubuntu/

ubuntudocker的安装和CentOS是不一样的,官网步骤写的很清楚。

如果想要今后版本更新了,安装方式有变化时,按官网上的教程来肯定是不会错的。

四、启动Docker

4.1 关于端口

Docker应用需要用到各种端口

  • 企业中选择逐一去修改防火墙设置。
# 开放某个端口 这里以8080为例
firewall-cmd --zone=public --add-port=8080/tcp --permanent
# 重启防火墙,让刚开开放的端口生效
firewall-cmd --reload
# 查看已经开放的端口列表
firewall-cmd --zone=public --list-ports
  • 个人学习可以选择直接关闭防火墙,这样任何端口就都被开放了。
# 关闭防火墙
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
# 如果以后又想开启防火墙了可以使用如下命令让防火墙开机自启,运行完后重启生效
systemctl enable firewalld

4.2 Docker启动命令

systemctl start docker  	# 启动docker服务

systemctl stop docker  		# 停止docker服务

systemctl restart docker  	# 重启docker服务

systemctl status docker		# 查看docker状态

systemctl enable docker		# 开机自启docker

docker info					# 查看docker概要信息

4.3 查看docker版本

docker -v

只要能正确显示当前的Docker版本就说明Docker安装成功!

4.4 帮助命令

# 查看docker总体帮助文档: 
docker --help
# 查看docker命令帮助文档: 
docker 具体命令 --help

4.5 配置docker的阿里云镜像加速

阿里云镜像加速官方文档:

https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

CentOS栏目下得知配置镜像加速器。

针对Docker客户端版本大于 1.10.0 的用户。

可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器。

# 在etc目录下创建一个docker目录 
sudo mkdir -p /etc/docker
# 在/etc/docke文件新建/daemon.json,并把 EOF之间的内容写到daemon.json中去
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://pi7aby9g.mirror.aliyuncs.com"]
}
EOF
# 重新加载daemon.json文件
sudo systemctl daemon-reload
# 重启docker
sudo systemctl restart docker

你可能感兴趣的:(Docker,docker,linux,容器,架构,运维开发)