Docker基础介绍

什么是docker ?

  • Docker在之前容器技术的基础上,进行了进一步的封装,从文件系统,网络互联到进程隔离等,极大的简化了容器的创建和维护,使得容器技术比虚拟化技术更轻便,快捷。
  • Docker 将应用程序与该程序的依赖,打包在一个文件里。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了Docker就不用担心环境问题。
  • 总体来说,Docker的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理,复制,分享,修改,就像管理普通代码一样。

 

Docker底层实现原理:
 Docker = Cgroup + Namespace + UnionFS + Docker引擎
  • Cgroup:计算资源控制
  • Namespace:访问隔离
  • UnionFS:联合文件系统

 Cgroup:

    是linux内核提供的一种可以限制单个进程或者多个进程所使用资源的机制,可以对cpu,内存等资源实现精细化的控制

 Namespace:

 

 

 

 

UnionFS

  • UnionFS 可以把文件系统上多个目录(也叫做分支)内容联合挂在到同一个目录下,而目录的物理位置是分开的
UNionFS实现:
  • UnionFS的其它实现分别有:aufs,device,mapper,btrfs,overlayfs,vfs,zfs
  • aufs是ubuntu常用的,device mapper是centos,btrfs是suse常用的,overlayfs 是Ubuntu和centos都会使用的
  • 现在最新的docker版本中默认两个系统都是使用的overlayfs
 

镜像

  • 镜像通常包括:
    • 一个轻量的操作系统发行版
    • 相关依赖
    • 单个应用或服务
  • 镜像:
    • 可用于创建容器的只读模板
    • 基于分层文件系统构建
    • 每一层在其上一层文件系统的基础上增加或替换部分内容
 

镜像仓库

  • 用于存放Docker镜像的制品库,被称之为Docker镜像仓库
  • docker pull/push/search 拉去,推送和搜索镜像
  • docker默认镜像仓库由docker团队维护的基于云的docker hub
  • 其它可用于构建私有镜像仓库的有:Docker Registry,Harbor,Nexus,JFrog Artifactory
 
 

Docker网络

  • 会创建一个名为docker0的网络接口
  • 默认容器私有IP地址段
  • 需要通过端口暴露服务
  • 端口映射避免与主机端口冲突
  • 不同的主机的容器不能相互通信

docker网络模型:

  • bridge模式 --net=bridge
  • host模式 --net=host
    • host模式是docker默认自带的网络模式,若启用则容器与宿主机共用一个网络名称空间。容器将不会虚拟出自己的网卡,配置自己的ip等,而是使用宿主机的ip和端口
  • container模式 --net=container:NAME_or_ID
    • 该模式是docker特有的一种网络模式。处于该模式下的容器会共享其它容器的网络环境,因此在此模式下容器与容器不存在网络隔离,但与宿主机是隔离状态
  • none模式 --net=none
    • 该模式下容器没有网络
  • 用户自定义模式 --net=xxx
    • 用户通过docker network create --driver network_type network_name 命令即可创建自定义网络。其中--driver后面支持三种:bridge,macvlan,overlay
    • 通过docker network inspect network_name 可以查看该网络信息
 

Docker数据持久化

  • 默认容器的数据读写发生在容器存储层,当容器被删除时其上的数据将会丢失
  • 如何方便的对容器中的文件进行访问
  • 容器间的数据共享
 
 

Docker是如何工作的

 实际上docker使用率常见的cs架构,也就是client-server模式,docker client负责处理用户输入的各种命令,比如docker build,docker run,真正工作的是server,也就是docker demon,值得注意的是,docker client和docker demon 可以运行在同一台机器上,接下来详解一些docker工作流程:
1.docker build
当我们写完dockerfile交给docker“编译”时,使用这个命令,那么client在接收到请求后转发给docker daemon,接着docker daemon 根据dockerfile创建出“可执行程序”image
2.docker run
有了可执行程序,image后就可以运行程序了,接下来使用命令docker run,docker daemon接收到该命令后找到具体的images,然后加载到内存开始执行,image执行起来就是所谓的container
3.docker pull
将build的可执行程序image推送到仓库存储
 

 与虚拟机的区别

 虚拟机有一个问题,就是虚拟机里面的操作系统本身会占用相当一部分资源。例如最新版的Windows 10,安装完毕什么都不干,就占用20~30G的硬盘空间,2~3G的内存。即使是只有字符终端没有图形界面的Linux,根据发行版和安装软件的不同,往往也需要100M~1G的内存,1~10G的硬盘空间。如果说同时运行2~3台还能接受这个开销的话,同时运行数十台,这个开销就不是少数了。事实上,往往这数十台虚拟机运行的都是相同的操作系统,只是根据业务需求的不同,安装的软件,或者软件版本不同而已。因此,业界提出了操作系统虚拟化(也叫容器,Containerization)的概念——所有的虚拟机使用同一个操作系统内核
 
 

posted @ 2020-09-27 16:18  星河霓虹  阅读(76)  评论(0)    收藏  举报