Docker容器原理详解
Posted 我的紫霞辣辣
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker容器原理详解相关的知识,希望对你有一定的参考价值。
Linux部署服务的形式
1. 纯物理机的服务器部署
2. 虚拟化的部署形式
相比纯物理机的部署形式,虚拟机的部署形式解决了哪些问题
- 控制了成本
- 节约了一定的资源
- 迁移和扩展也得到了优化,可以利用虚拟机的模板功能,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端口的网站
在宿主机上,运行Nginx1. 开启服务器 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容器原理详解的主要内容,如果未能解决你的问题,请参考以下文章