一. docker的架构

1.1 docker的架构

先来看docker官网给出的docker架构图:

看官网,docker的架构描述: https://docs.docker.com/get-started/overview/

Docker使用客户端-服务器架构。Docker 客户端与Docker 守护进程进行对话,该守护进程完成了构建,运行和分发Docker容器的繁重工作。Docker客户端和守护程序可以 在同一系统上运行,也可以将Docker客户端连接到远程Docker守护程序。Docker客户端和守护程序在UNIX套接字或网络接口上使用REST API进行通信。

从上图我们也可以看出, 整体分为三个部分: docker客户端, docker后台(相当于一个小型的linux), docker仓库. 接下来一个一个看.

1. Docker客户端--The Docker client

Docker客户端是许多Docker用户与Docker交互的主要方式。当您使用诸如之类的命令时docker run,客户端会将这些命令发送到dockerd,以执行它们。该docker命令使用Docker API。Docker客户端可以与多个守护程序通信。

2. Docker守护程序 -- The Docker daemon

Docker守护程序(dockerd)侦听Docker API请求并管理Docker对象,例如图像,容器,网络和卷。守护程序还可以与其他守护程序通信以管理Docker服务。

3. Docker仓库 -- Docker registries

Docker registries存储Docker映像。Docker Hub是任何人都可以使用的公共注册表,并且默认情况下,Docker已配置为在Docker Hub上查找映像。您可以运行自己的私人注册表。如果使用Docker数据中心(DDC),则其中包括Docker可信registries(DTR)。

使用docker pull或docker run命令时,所需的图像将从配置的注册表中提取。使用该docker push命令时,会将映像推送到配置的注册表。

1.2 docker的基本元素 -- Docker对象

通过上面的架构图, 我们可以看到docker主要包含: 镜像, 容器, 仓库. 下面就来具体看看这几个概念

1. images

一个图像是用于创建一个码头工人容器指令的只读模板。通常,一个映像基于另一个映像,并进行一些其他自定义。例如,您可以基于该ubuntu 映像构建映像,但是安装Apache Web服务器和您的应用程序,以及运行该应用程序所需的配置详细信息。

您可以创建自己的图像,也可以仅使用其他人创建并在注册表中发布的图像。要构建自己的映像,您可以 使用简单的语法创建一个Dockerfile,以定义创建映像并运行它所需的步骤。Dockerfile中的每个指令都会在映像中创建一个层。当您更改Dockerfile并重建映像时,仅重建那些已更改的层。与其他虚拟化技术相比,这是使映像如此轻巧,小型和快速的部分原因。

2. container

容器是图像的可运行实例。您可以使用Docker API或CLI创建,启动,停止,移动或删除容器。您可以将容器连接到一个或多个网络,将存储连接到它,甚至根据其当前状态创建新映像。

默认情况下,容器与其他容器及其主机之间的隔离程度相对较高。您可以控制容器的网络,存储或其他基础子系统与其他容器或与主机的隔离程度。

容器由其映像以及在创建或启动时为其提供的任何配置选项定义。删除容器后,未存储在持久性存储中的状态更改将消失。

3. 仓库

仓库是存放镜像的地方, 分为共有仓库和私有仓库

共有仓库: dockerHub(国外) , 阿里云(国内)

私有仓库: 自定义的仓库

二.docker的安装及应用

1. docker支持的centos版本

2. docker安装的前提条件

  • 目前centos仅发行版本的内核支持docker
  • docker运行在centos7上, 要求系统为64位,系统内核版本为3.10以上
  • docker运行在centos6.5或更高版本上,要求系统64位,系统内核版本为2.6.32-431或者更高版本

uname命令打印系统相关信息

uname -r

我的服务器版本是5.10.23, 64位

查询系统版本

cat /etc/redhat-release    或者  cat /etc/os-release

3. centos6.5及以上的安装docker

安装docker, 我们主要借助于帮助文档, 文档地址: https://docs.docker.com/engine/install/, 对照文档安装

第一步: 卸载旧版本的docker

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

如上图所示, 表示之前没有安装过docker, 如果安装过, 会提示,卸载完毕.

第二步: 安装docker

官网给出, 安装docker有三种方法:

  • 第一种: 是从仓库安装,
  • 第二种是通过RPM包安装,
  • 第三种是通过脚本安装.

我们这里采用第一种从仓库安装

1. 安装docker前需要安装的依赖包

yum install -y yum-utils

2. 设置镜像仓库

在一台新的主机上首次安装docker engine之前, 需要先设置docker镜像仓库, 后面可以从镜像仓库安装和更新docker.

镜像仓库官网给的是国外的, 我们尽量不用, 速度太慢

sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

我们百度搜索, 找到阿里云docker镜像参考的地址, 国内使用这个

sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3. 安装最新版docker引擎

安装引擎之前, 先来安装yml软件包索引

yum makecache fast

这个命令什么意思呢? 科普一下

我们在更新yum源或者出现配置yum源之后,通常都会使用yum makecache 生成缓存

yum makecache fast
这个命令是将软件包信息提前在本地缓存一份,用来提高搜索安装软件的速度 yum clean all
yum 会把下载的软件包和header存储在cache中而不自动删除。如果觉得占用磁盘空间,可以使用yum clean指令清除缓存。

然后安装docker

sudo yum install docker-ce docker-ce-cli containerd.io

这里安装了docker, docker-cli 和容器. docker-ce是社区版的意思, docker-ee是企业版. 通常我们使用的都是社区版的.

注意: 有很多朋友使用的linux服务器, 这里在执行这个命令的时候, 会报错:

这里报错的原因是, 阿里云操作系统是Alibaba Cloud Linux, 而不是存粹的centOS, 这时我们可以参考阿里云提供的docker安装文档: https://help.aliyun.com/document_detail/264695.html

4. 启动docker

systemctl start docker

5. 检查是否安装成功

docker version

6. 拉取docker镜像拉取helloworld

7. 配置阿里云镜像加速器

第一步:访问国内阿里云的网址

dev.aliyun.com

第二步:登录

第三步: 获取镜像地址

在产品与服务-->搜索"容器镜像服务" --> 镜像工具 --> 镜像加速器 --> 复制镜像加速器地址

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

配置方法:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://6w5zrjdk.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

三. docker的底层原理

1. docker是怎么工作的?

docker是一个client-server结构的系统,Docker的守护进程运行在主机上, 然后通过Socket连接从客户端访问, 守护进程从客户端接受命令并管理运行在主机上的容器, 容器,是一个运行时环境, 就是我们前面说到的集装箱

客户端通过socket连接到后台守护进程, 然后通过命令告诉守护进程, 调用容器. 可见容器和客户端是互相隔离的. 我们可以把容器理解为一个小型的linux, 他有自己的端口号, 比如mysql容器端口号是3306, 容器中的端口, 通过客户端是不能直接访问的. 我们需要做端口映射.

2. 虚拟机和容器的区别

docker将虚拟机的Hypervisor和操作系统应将cpu, 内存等去掉了. 替换成了Docker Engine. 而这两块恰恰就是虚拟机笨重的地方. docker共享了宿主机的操作系统, 内核, cpu. 省略了自己构建的过程.

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

以上是虚拟机和容器的区别

2.docker安装及原理的更多相关文章

  1. 2、docker安装:内核要求、docker三要素、安装、helloworld、底层原理

    1.前提说明 1.CentOS Docker 安装 Docker支持以下的CentOS版本: CentOS 7 (64-bit) CentOS 6.5 (64-bit) 或更高的版本 2.前提条件:内 ...

  2. [原][Docker]特性与原理解析

    Docker特性与原理解析 文章假设你已经熟悉了Docker的基本命令和基本知识 首先看看Docker提供了哪些特性: 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上, ...

  3. 使用docker安装部署Spark集群来训练CNN(含Python实例)

    使用docker安装部署Spark集群来训练CNN(含Python实例) http://blog.csdn.net/cyh_24/article/details/49683221 实验室有4台神服务器 ...

  4. centos7之docker安装

    下午四点左右,我准备接触docker这个技术.之所以接触它,原因来自tomcat服务器老是挂,也不能说老是挂,一周一次吧,或者不定时,最初出现的问题,分为这么几类? 一类,java代码的问题,某个类导 ...

  5. Docker容器的原理与实践(上)

    本文来自网易云社区. 虚拟化 是一种资源管理技术,将计算机的各种资源予以抽象.转换后呈现出来, 打破实体结构间的不可切割的障碍,使用户可以比原本更好的方式来应用这些资源. Hypervisor 一种运 ...

  6. 利用Docker安装Web前端性能测试工具Sitespeed.io

    目录结构 一.Sitespeed.io概述 1.Sitespeed.io简介 2.Sitespeed.io使用场景 二.Sitespeed.io的安装和使用 1.安装Sitespeed.io 2.连接 ...

  7. Docker安装及常用操作

    Docker简介: Docker是一个轻量级容器技术,类似于虚拟机技术,但性能远远高于虚拟机,Docker支持将软件编译成一个镜像(image),在这个镜像中做好对软件的各种配置,然后可以运行这个镜像 ...

  8. Docker系列-(1) 原理与基本操作

    Docker是一个开源的应用容器引擎,基于Go语言,并遵从Apache2.0协议开源. Docker可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的Linux机器 ...

  9. Docker系列之原理简单介绍

    目录 1.1.Docker架构简介 1.2.Docker 两个主要部件 1.3.虚拟机和Docker对比: 1.4.Docker内部结构 Docker系列之原理简单介绍 @ Docker是一个开源的应 ...

随机推荐

  1. 007 PCI总线的桥与配置(二)

    一.PCI桥与PCI设备的配置空间 PCI设备都有独立的配置空间,HOST主桥通过配置读写总线事务访问这段空间.PCI总线规定了三种类型的PCI配置空间,分别是PCI Agent设备使用的配置空间,P ...

  2. 在Asp .net core 中通过属性映射实现动态排序和数据塑形

    目录 属性映射服务实现 动态排序 数据塑形 属性映射服务实现 public class PropertyMappingValue { public IEnumerable<string> ...

  3. mpvue学习笔记

    坑一: 挂载在Vue.prototype上的属性,在模板语法里面是undefined,必须经过computed计算过一下才能用. 坑二: 关于生命周期钩子 因为小程序的历史页面不会销毁,所以在生命周期 ...

  4. mysql自带分区(不修改源码)

    SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'xw_user_appl ...

  5. WPF原理剖析——路由事件

    一.路由事件与传统事件传统事件的触发者和处理者是紧密相连的,而路由事件则不是,路由事件允许一个元素的事件有另外的元素触发.也即就是说路由事件的拥有者和响应者之间没有显示的订阅关系.事件的拥有者只负责激 ...

  6. mfc HackerTools远程线程注入

    在一个进程中,调用CreateThread或CreateRemoteThreadEx函数,在另一个进程内创建一个线程(因为不在同一个进程中,所以叫做远程线程).创建的线程一般为Windows API函 ...

  7. 如何让BootStrap栅格之间留出空白间隙呢?

    BootStrap栅格之间留出空隙 BootStrap栅格系统可以把我们的container容器划分为若干等分,如果想要每个部分之间留出一定的空隙,我们很可能首先想到的方法就是用margin外边距来使 ...

  8. etcd raft 处理流程图系列3-wal的存储和运行

    存储和节点的创建 raftexample中的存储其实有两种,一个是通过raft.NewMemoryStorage()进行创建的raft.raftStorage,关联到单个raft节点,另一个是通过ne ...

  9. centos6.10下安装mysql8.0.16root密码修改的坑

    上图截取别人的自己懒得弄,检查自己的linux是否有安装就按上图做就行了 接下来是我的干货 mysql8.0安群策略对密码设置很严格规则:大小写加数字和特殊字符串 使用yum安装mysql 后 my. ...

  10. 微信小程序从入门到实践(一)-设置底部导航栏

    微信小程序最多能加5个导航图标.因为我们只有两个默认页面,这里我们就添加两个导航图标 先看我们要达到的就是这么一个效果 接下来开始实践: (1)准备工作 找几个图标,将上述起好名字的图标 保存到 小程 ...