Docker容器原理详解

Posted 我的紫霞辣辣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker容器原理详解相关的知识,希望对你有一定的参考价值。

Linux部署服务的形式

1. 纯物理机的服务器部署

2. 虚拟化的部署形式

相比纯物理机的部署形式,虚拟机的部署形式解决了哪些问题

  1. 控制了成本
  2. 节约了一定的资源
  3. 迁移和扩展也得到了优化,可以利用虚拟机的模板功能,vmware提供了模板克隆

虚拟化部署的局限性

  • 每一个虚拟机都是一个完整的操作系统,要分配系统资源,虚拟机多到一定程度时,操作系统本身的资源也就消耗殆尽,或者说必须扩容。

Hypervisor是一种运行在物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享一套基础物理硬件,因此也可以看作是虚拟环境中的“元”操作系统,它可以协调访问服务器上的所有物理设备和虚拟机,也叫虚拟机监视器。Hypervisor是所有虚拟化技术的核心。非中断地支持多工作负载迁移的能力是Hypervisor的基本功能。当服务器启动并执行Hypervisor时,它会给每一台虚拟机分配适量的内存、CPU、网络和磁盘,并加载所有虚拟机的客户操作系统。

虚拟化技术的应用

  云计算技术,将计算的工作放在云上去执行
  去阿里云购买RDS数据库服务,不需要自己搭建数据库,做数据库高可用等等
  对数据的增删改查,用的全都是云上的数据库,云计算的技术就是基于kvm虚拟化技术去实现的

常用的虚拟化工具

  • VMware workstation(属于个人学习使用),主要用于windows平台(创建虚拟机+安装系统)
  • 企业版虚拟化,VMware esxi虚拟化工具,高性能服务结合,进行服务器资源虚拟化
  • KVM工具,linux下的虚拟机工具(创建虚拟机+安装各种系统)

KVM虚拟化工具和VMware虚拟化工具的差别

  在虚拟化底层技术上,KVM和VMware后续版本一样,都是基于硬件辅助虚拟化实现
  不同的是VMware作为独立的第三方软件可以安装在Linux、Windows、MacOS等多种不同的操作系统之上
  KVM是基于内核的虚拟机,kvm技术只能基于Linux系统上使用

什么是虚拟化技术

  • 虚拟化(技术)是一种资源管理技术,是将计算机的各种实体资源(CPU,内存,磁盘空间,网络适配器等),予以抽象,转换后呈现出来并可供分隔、组合为一个或多个电脑配置环境。

3.Docker容器的部署形式

虚拟化技术分为全虚拟化技术,半虚拟化技术,还有基于CPU硬件加持下的全虚拟化技术。但是虚拟化技术的目的都是虚拟化出一台完整的计算机,拥有底层的物理硬件、操作系统和应用程序的完整环境。这种方式背后都是HyperVisor(虚拟机监控程序)虚拟化做了大量的工作,特别重量级。

  • 不同于虚拟化技术要完整的虚拟化一台计算机,容器技术更像是操作系统层面的虚拟化,它只需要虚拟出一个操作系统环境,这种方式对于物理机本身的资源充分利用有着巨大的好处。
  • 容器内的应用程序直接运行在宿主机的内核上,容器内没有自己的内核,也没有对硬件进行虚拟,因此容器比起虚拟机更为轻便。

Docker技术详解

Docker底层原理

  • Docker是基于Google公司推出的Golang语言开发而来,基于Linux系统内核的Cgroups、NameSpace,以及Union FS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。
  • 对进程进行封装隔离,属于操作系统层面的虚拟化技术。
  • 利用Docker可以实现开发,测试,生产环境的部署一致性,极大的减少运维成本。如下所示:

传统虚拟机技术与容器技术的对比

Docker引擎

Docker组成

docker最核心的组件

  • image镜像,构建容器(我们将应用程序运行所需的环境,打包为镜像文件)
  • Container,容器(你的应用程序,就跑在容器中)
  • 镜像仓库(dockerhub)(保存镜像文件,提供上传,下载镜像)
  • Dockerfile,将你部署项目的操作,写成一个部署脚本,这就是dockerfile,且该脚本还能够构建出镜像文件

创建容器的过程

  获取镜像,如docker pull centos ,从镜像仓库拉取 
  使用镜像创建容器
  分配文件系统,挂载一个读写层,在读写层加载镜像 
  分配网络/网桥接口,创建一个网络接口,让容器和宿主机通信 
  容器获取IP地址
  执行容器命令,如/bin/bash 
  反馈容器启动结果。

Images(镜像)

  镜像是一个只读模板,用于创建容器,也可以通过Dockerfile文本描述镜像的内容。
  镜像的概念类似于编程开发里面向对象的类,从一个基类开始(基础镜像Base Image) 
  构建容器的过程,就是运行镜像,生成容器实例。

Dacker镜像的描述文件是Dockerfile,包含了如下的指令

  • FROM定义基础镜像
  • MAINTAINER作者
  • RUN运行Linux命令
  • ADD添加文件/目录
  • ENV环境变量
  • CMD运行进程

Container(容器)

  容器是一个镜像的运行实例,镜像>容器。

创建容器的过程

  • 获取镜像,如docker pull centos ,从镜像仓库拉取
  • 使用镜像创建容器
  • 分配文件系统,挂载一个读写层,在读写层加载镜像
  • 分配网络/网桥接口,创建一个网络接口,让容器和宿主机通信
  • 容器获取IP地址
  • 执行容器命令,如/bin/bash
  • 反馈容器启动结果。

Registry(仓库)

  Docker镜像需要进行管理,docker提供了Registry仓库,其实它也是一个容器,可以用于可以基于该容器运行私有仓库。 
  也可以使用Docker Hub互联网公有镜像仓库。

安装Docker

Docker官网:https://www.docker.com/

基础环境配置

# 更新基础仓库
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

# 更新阿里云仓库
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

yum clean all && yum makecache

# 安装常用命令
yum install -y bash-completion vim lrzsz wget expect net-tools nc nmap tree dos2unix htop iftop iotop unzip telnet sl psmisc nethogs glances bc ntpdate openldap-devel

开启linux内核流量转发

cat > /etc/sysctl.d/docker.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.conf.default.rp_filter = 0 
net.ipv4.conf.all.rp_filter = 0 
net.ipv4.ip_forward = 1
EOF

# 加载修改内核的参数,配置文件
# 按照如下命令,执顺序
modprobe br_netfilter
sysctl -p /etc/sysctl.d/docker.conf
# net.bridge.bridge-nf-call-ip6tables = 1
# net.bridge.bridge-nf-call-iptables = 1
# net.ipv4.conf.default.rp_filter = 0
# net.ipv4.conf.all.rp_filter = 0
# net.ipv4.ip_forward = 1

利用yum快速安装docker

# 提前配置好yum仓库
# 1.阿里云自带仓库	2.阿里云提供的docker专属repo仓库
curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo

# 更新yum缓存
yum clean all && yum makecache

# 查看yum仓库中docker的可用版本
yum list docker-ce --showduplicates | sort -r

# yum安装dokcer
yum -y install docker-ce-20.10.6

# 如果需要安装旧版本,软件名称结尾直接跟版本号即可
# yum -y install docker-ce-18.09.9

镜像加速器

  • 使用dokcer首要操作就是获取镜像文件,默认下载时Docker Hub(国外网站)下载,网速较慢。国内很多云服务商都提供了加速服务,阿里云加速器,Daocloud加速器,灵雀云加速器。

打开阿里云官网: 产品 => 容器与中间件 => 容器与镜像服务ACR => 管理控制台 => 镜像加速器 => CentOS

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://0r3dxh20.mirror.aliyuncs.com"]
}
EOF

# 启动docker
systemctl daemon-reload
systemctl enable docker
systemctl restart docker

# 查看docker是否正确启动
docker version

Docker基础命令

nginx Web服务器,运行一个80端口的网站
在宿主机上,运行Nginx

  1. 开启服务器
  2. 在服务器上安装好nginx所需的依赖关系
  3. 安装Nginx  yum -y install nginx
  4. 修改Nginx配置文件
  5. 启动Nginx服务
  6. 客户端去访问Nginx
  - 该运行方式,是比较耗时的。。。

在Docker容器中,运行Nginx

  1. 获取镜像
  2. 运行镜像,生成容器,你想要的容器,就运行在容器中。

用docker运行Nginx

# 先搜索一下,查看镜像文件是否存在
docker search nginx

# 获取镜像,获取是从你配置好的镜像站中,去拉取nginx镜像
docker pull nginx

# 查看本地的docker镜像有哪些
docker images 

# 删除镜像
docker rmi [镜像id]

# 运行镜像的命令,参数如下
docker run 参数  镜像的名字/id

# -d 后台运行容器
# -p 80:80 端口映射,宿主机端口:容器内端口(客户访问宿主机端口,也就访问到了容器内端口) 
# 运行结果如下,docker run命令,会返回一个容器的ID
docker run -d -p 80:80 nginx
# 3e239919b44a429b884193c84dfc709eaa3d4bc4c27f768c302b184dbc5d5b8a

# 查看容器是否在运行 
# docker ps -a :显示所有的容器,包括未运行的。
docker ps
# CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS              PORTS                               NAMES
# 3e239919b44a   nginx     "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp, :::80->80/tcp   elated_blackburn

# 此时可以访问到宿主机的80端口,查看容器内的80端口的应用是什么了
在本机浏览器输入虚拟机ip地址:192.168.15.80

# 可以尝试停止容器,看一下结果
docker stop [容器id]

docker stop 3e239919b44a
# 3e239919b44a

# 查看容器是否在运行
docker ps
# CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

以上是关于Docker容器原理详解的主要内容,如果未能解决你的问题,请参考以下文章

强力的应用容器引擎——Docker网络部分详解

云时代Docker原理万字详解!!!

详解Dockerfile原理镜像容器命令总结

Docker Kubernetes 服务发现原理详解

docker 命令详解

Docker&Kubernetes ❀ Docker 容器技术笔记链接梳理