当前位置: 首页 > news >正文

云计算基础之Docker

云计算是什么

云计算的本质是计算资源的虚拟化。

与磁盘逻辑卷的分配类似,云计算是在负载波动时动态调整服务器计算资源,避免资源浪费的做法,生产环境中,厂商一般将服务器组成一个池,实现逻辑管理计算资源,对不同的部署项目动态调整算力,
比如电商在618、双十一需要应对极大的数据量,而平时并不需要这么多的计算资源,所以只需要在个别情景下增加计算资源即可。

docker是什么

docker是云计算的实现形式之一,该程序2013年开源,基于go语言实现。

核心组成是:镜像、容器和仓库。
镜像和容器对应程序和进程,仓库则是镜像的集合。

核心技术是Namespace命名空间隔离、Control Group控制组资源限制、Union Filesystem联合文件系统。

docker核心技术

核心技术都在Linux内核层实现:

Namespace对全局系统资源的一种封装隔离,用于解决多个容器命名等可能产生冲突的问题,每个命名空间内的资源彼此独立互不干扰。

该技术本质是Linux中chroot的派生版,早先的chroot用于限制文件访问本身以外的内容。

Namespace的具体空间划分如下:

隔离类型功能系统调用参数说明
MNT Namespace(mount)提供磁盘挂载点和文件系统的隔离能力CLONE_NEWNS保证容器使用空间独立
IPC Namespace(Inter-Process Communication)提供进程间通信的隔离能力CLONE_NEWIPC允许容器内进程通信,阻止容器间进程通信
UTS Namespace(UNIX Timesharing System)提供主机名隔离能力CLONE_NEWUTS通过主机名和域名隔离
PID Namespace(Process Identification)提供进程隔离能力CLONE_NEWPID管理容器内进程
Net Namespace(network)提供网络隔离能力CLONE_NEWNET不同容器网络独立,有自己的网卡docker0
User Namespace(user)提供用户隔离能力CLONE_NEWUSER允许不同容器用户名相同,实现用户隔离

Control Group资源控制是为了防止容器无限申请资源的情况发生,通过将进程按组管理的形式实现,作为使用者了解到这应该就行了,更多信息可以看看其他文章。

Union Filesystem联合文件系统用于将多个物理位置不同的文件挂载到同一个目录,从而达到从逻辑上看是一个整体文件系统的效果。
该技术可以使得制作镜像更为方便,新的镜像可以从基础镜像开始,构造新的功能作为新的层添加到文件联合系统中,大大提高了存储效率和开发效率,共享时也只需要传输新加的层,而无需更新整个镜像,同时将文件系统分层便于维护和回滚,不同的文件层相当于快照可以随时恢复。

云计算和虚拟机的区别

如果说逻辑管理计算资源,我们用虚拟机也能实现,docker云计算的实现手段高明在哪呢?

首先虚拟机的确可以实现计算资源的管理,并且还很方便,但因为其原理,虚拟机是真实操作系统之上又建立起的虚拟操作系统,指令从硬件到程序需要穿透两层操作系统,其中还有复杂的Hypervisor虚拟机监视器,性能损失很大,并且再小的程序也需要完整的操作系统,造成很大的存储资源浪费,docker正是弥补了这些不足才得以广泛应用。

但虚拟机也有docker不具备的有点,因为虚拟机允许独立的操作系统,所以其隔离性高于docker,安全性更高。

从应用来说都是二者都是虚拟化计算资源,但虚拟机是虚拟完整的运行环境,docker只虚拟容器所需的资源,二者的结构区别见下图:
虚拟机与docker结构
虚拟化实现的是物理资源的隔离,docker实现的是应用层面的隔离。

docker快速开始

安装docker

yum install wget				# 安装网络下载工具,通过HTTP、HTTPS、FTP三个最常见的TCP/IP协议下载,并可以使用HTTP代理				# yum则是红帽系列Linux的系统安装方式
rm -rf /etc/yum.repos.d/*		# 清除原有源文件 
wget -O /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 将各种源切换为阿里云
yum install -y docker-ce		# 安装新版的docker-ce
systemctl start docker			# 启动docker服务

切换仓库

此时我们如果要直接拉取镜像会出现如下场景:
拉取等待
因为网络等原因,我们有时无法连接到dockers仓库,所以需要手动配置镜像,先前我们更改的源只是保证我们能正确获取到docker软件,切换仓库的方法如下:
vim /etc/docker/daemon.json创建或修改docker的配置文件,添加如下内容:

{"registry-mirrors" : ["https://docker.mirrors.ustc.edu.cn" ] # 中国科技大学
}

切换完成后重启容器服务systemctl daemon-reloadsystemctl restart docker,此时再通过docker pull nginx命令就可以拉取到nginx镜像,通过docker images可以查看已有镜像,如下图:
查看镜像
再使用docker run -d -p 80:80 nginx运行服务,出现下图说明运行成功
运行服务成功

RUN的一些参数

-d, --detach: 以守护进程方式运行容器
-p, --publish: 映射容器端口到宿主机端口
格式: -p [hostPort]:[containerPort]
-v, --volume: 挂载数据卷
格式: -v [hostPath]:[containerPath]
-e, --env: 设置环境变量
--name: 为容器指定名称
--network: 指定容器所属网络
--restart: 容器退出时的重启策略
可选值: no, on-failure, unless-stopped, always
-i, --interactive: 保持标准输入打开
-t, --tty: 分配一个伪终端
-u, --user: 指定运行容器的用户
--entrypoint: 覆盖容器的默认入口点
--rm: 容器退出后自动删除
--hostname: 设置容器主机名
--add-host: 添加自定义主机名到 IP 的映射
--link: 添加到另一个容器的链接
--expose: 暴露容器端口
--volume-driver: 指定数据卷驱动程序
--cpu-shares: 设置 CPU 权重
--memory: 设置容器内存限制

docker方法

镜像管理

直接展示管理方法:

目的方法
搜索docker search 名称
下载docker pull 名称:标签(默认为latest)
删除docker rmi ID或名称
查看docker images
修改标签docker tag 名称:原标签 新名称:新标签
显示详细信息docker inspect 名称
查看历史/各层docker history 名称
导出docker save 名称 -o或> 文件名称
导入load -i或< 名称

容器管理

容器是运行着的镜像,同样直接展示管理方法:

目的方法
创建容器docker create
启动容器docker start
创建并启动docker run
显示容器docker ps -a
端口映射-P随机映射 -p 指定端口:容器目的端口
查看映射端口docker port
暂停docker pause
停止docker stop
删除docker rm -f 查询结果
进入容器内部docker exec
后台启动docker run -d

容器要保证运行状态,必须依赖前台进程

镜像制作

手动方法为:
1,拉取基础操作系统环境
2,装载需要的应用
3,关闭后台运行
4,commit提交容器为镜像

但在企业生产环境中,一般使用专门的镜像制作工具Dockerfile,该工具本质上类似于一个解释器,将内容解释为Linux命令,工具生成的文件名必须为dockerfile,新建该文件后即可写入镜像的构建步骤,一些常用指令如下:

FROM		指定基础镜像,用于后续的指令构建。
MAINTAINER	指定Dockerfile的作者/维护者。(已弃用,推荐使用LABEL指令)
LABEL		添加镜像的元数据,使用键值对的形式。
RUN			在构建过程中在镜像中执行命令。
CMD			指定容器创建时的默认命令。(可以被覆盖)
ENTRYPOINT	设置容器创建时的主要命令。(不可被覆盖)
EXPOSE		声明容器运行时监听的特定网络端口。
ENV			在容器内部设置环境变量。
ADD			将文件、目录或远程URL复制到镜像中。
COPY		将文件或目录复制到镜像中。
VOLUME		为容器创建挂载点或声明卷。
WORKDIR		设置后续指令的工作目录。
USER		指定后续指令的用户上下文。
ARG			定义在构建过程中传递给构建器的变量,可使用 "docker build" 命令设置。
ONBUILD		当该镜像被用作另一个构建过程的基础时,添加触发器。
STOPSIGNAL	设置发送给容器以退出的系统调用信号。
HEALTHCHECK	定义周期性检查容器健康状态的命令。
SHELL		覆盖Docker中默认的shell,用于RUN、CMD和ENTRYPOINT指令。

详细步骤可见该文章

数据管理

容器运行过程中数据独立,如果我们部署的容器发生损坏,数据也同样存储在容器内部,如何将容器内部的数据持久化到外部主机呢?这是生产环境中常面临的问题,解决方法之一是数据卷:

即用本机的文件代替容器文件,将宿主机的目录挂载到容器目录上,通过docker run -v 宿主机目录:容器目录将目录映射到容器内部,该方法可以实现文件的复用,也可以避免容器损坏而影响本地数据,容器程序损坏只需要重新拉取然后挂载即可。

另一个方法是使用数据卷容器,即单独用一个容器作为存储介质,供其他容器交换信息,容器本身的隔离机制并不允许这么做,所以我们需要通过--volume-from 数据卷容器来告知容器可以从数据卷容器中获取信息,就可以实现容器的通信和数据持久化操作。

网络管理

容器间要进行网络通信,可以通过宿主机同一个端口映射或docker0的网桥来实现,命令可以使用--link 名称或别名方法实现网络互通。

docker本质也是一个虚拟机,只是其更侧重于应用的虚拟机,所以其网络连接方式也有很多种,分别对应不同的网络策略,说明如下:

网络模式配置方法说明
host模式–net=host容器和宿主机共享Network namespace
container模式–net=container:NAME或ID容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network
none模式–net=none容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等
bridge模式–net=bridge默认为该模式,容器与虚拟网桥通信,虚拟网桥作为在网络中作为交换机

总结

其实学多了,我们大多数也只是拉现成的镜像下来使用,知道pullrun基本就算会docker了。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux网络编程入门及OSI七层模型
  • 基于Fail2Ban入侵防御软件预防通过ssh暴力破解
  • BEV学习---LSS-1:论文原理及代码串讲
  • 智谱携基座大模型 GLM-4-Plus 亮相 KDD,清言全新升级视频通话功能
  • 面试题集锦:数据库
  • 治愈系风景视频素材下载网站有哪些?令人治愈美景素材库网站分享
  • 使用安信可Ai-WB2-12F开启wifi与手机通信TCP-IP(AT指令)
  • C++系列-泛型编程概念及函数模板
  • Vue3其他Api
  • React中实现antd自定义图标,鼠标悬浮变色
  • RecyclerView网格布局如何动态设置item的显示个数
  • 【虚拟化】使用packer手搓安装linux,windows镜像并导入virsh进行管理(含Kickstart安装与linux内核参数配置)
  • SqlHelper 使用EF-Core框架 连接池处理并发
  • 数字化转型升级探索(二)
  • 算法中常用的排序
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • axios 和 cookie 的那些事
  • bootstrap创建登录注册页面
  • C++类中的特殊成员函数
  • javascript从右向左截取指定位数字符的3种方法
  • jdbc就是这么简单
  • Less 日常用法
  • MobX
  • Odoo domain写法及运用
  • Promise初体验
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Swoft 源码剖析 - 代码自动更新机制
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 不上全站https的网站你们就等着被恶心死吧
  • 计算机常识 - 收藏集 - 掘金
  • 两列自适应布局方案整理
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 前端相关框架总和
  • 时间复杂度与空间复杂度分析
  • 数组大概知多少
  • 算法系列——算法入门之递归分而治之思想的实现
  • 异常机制详解
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 自定义函数
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • 正则表达式-基础知识Review
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​Java并发新构件之Exchanger
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #systemverilog# 之 event region 和 timeslot 仿真调度(十)高层次视角看仿真调度事件的发生
  • $.ajax中的eval及dataType