Docker你需要知道的知识点--1.Docker核心组成部分介绍

311 阅读8分钟

在正文的第一句加入: 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

目前随着CICD的普及,Docker 的应用也越来越多,为了开发环境和部署环境的统一,公司也开始要求前端在Docker基础上进行项目开发,于是乎最近也开始研究Docker, 这里把学习的docker知识分享下,希望我分享的内容能够帮大家对Docker有个更好的理解,让我们一起学习交流,一起加油!

1.Docker简介

虚拟化技术

讲到Docker就必须先提到一个技术“虚拟化技术”,在传统的方式上,一台物理机就对应一个服务,这样就会有很多资源空闲,最终导致资源浪费,所以虚拟化技术就出现了。虚拟机一般是跨平台的,所以在虚拟机上的命令都会通过虚拟的转化成各个宿主平台的指令。但是虚拟机也存在以下的缺陷:

  • 性能降低:虚拟化在硬件层之上进行了封装,相比传统的物理机的方式,必然会损失一部分性能。在IO流方面,通常的IO是直接写在物理硬盘上,而虚拟机的IO则是先写在host系统的虚拟机镜像文件上,再由host以某种策略写入物理硬盘
  • 配置相对复杂:虚拟机相对于物理机配置相对复杂所以增加的维护成本

容器技术

Docker所应用的技术叫“容器技术”,容器技术是虚拟化技术的一种,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本。原因是因为在传统的虚拟化技术中,任何命令都需要通过虚拟平台转化一次,但是容器中不存在命令转化这说法,它是基于linux内核的cgroup和namespace,以及 OverlayFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。它使用的都是linux的命令,所以不存在命令转化这一步骤。虽然docker 推出了windows和MAC的版本,但是其原理也是先在window和Mac的系统上构建一个虚拟的linux内核,然后再在此基础上运行docker

Docker

由于容器化的技术可以保持环境一致性,且Docker 对系统资源的利用率更高,拥有更快的启动时间,更轻松的应用迁移,所以在开发效率、部署效率、测试效率、运维效率这几个方面都会有显著的提升

Docker设计理念

Docker 中一般推崇的是“一个应用一个容器”,一般来说为了方便管理,都是采用的一个容器对应一个应用的方式

2.Docker 核心组成部分

镜像

Docker镜像 是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等,它不包含任何的动态数据

Docker的镜像是增量式,会有如下的特性

  • 镜像构建时,会一层层构建,前一层是后一层的基础
  • 每次对镜像的修改都是对原有镜像的增量添加
  • 如果你在当前层删除了上一层的文件,结果不是真正的删除掉,而仅仅是标记为不删除的状态,所以在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西

容器

如果把镜像比喻成类,那么容器就是实例,

容器中包含了以下的部分

  • 镜像:每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为“容器存储层”,容器消亡时候“容器存储层”也消亡了

  • 运行环境: 直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间,这种隔离性使得容器进程更加安全

  • 一套指令集合: 包括创建、启动、停止、删除、暂停等

  • 数据卷:一般来说都不会放在容器存储层中,而是外挂到宿主的文件系统中

  • 网络:容器设置一套独立的域名解析,让多个容器加入一个独立环境

Docker engine

Docker Deamon:Docker 所能提供的容器管理、应用编排、镜像分发等功能都集中在docker deamon中,镜像模块、容器模块、数据卷模块和网络模块也都实现在其中,而且它暴露了一套Restful Api,来实现对Docker Deamon进行操作

Docker Cli:Docker Cli 为一个控制台程序来调用RESTFul Api

3.Docker install

Docker 分2个版本

社区版本(免费):所有的容器基本管理的基本功能

企业版(收费):提供容器管理、镜像管理、安全等功能

Linux安装

安装手册参考官网:www.docker.com/

上手使用

sudo systemctl start docker  //启动服务
sudo systemctl enable docker //启动自动启动

sudo docker version // 查看docker的版本
sudo docker info // 查看docker engine的更多信息

配置访问镜像

在 Linux 环境下,我们可以通过修改 /etc/docker/daemon.json ( 如果文件不存在,你可以直接创建它 ) 这个 Docker 服务的配置文件达到效果。

{
    "registry-mirrors": [
        "https://registry.docker-cn.com"
    ]
}

修改完成后重启docker

$ sudo systemctl restart docker

要验证我们配置的镜像源是否生效,我们可以通过 docker info 来查阅当前注册的镜像源列表。

$ sudo docker info
## ......
Registry Mirrors:
 https://registry.docker-cn.com/
## ......

如果你使用的是docker desktop, 可以在setting中设置

Settings.png

Docker desktop

版本

  • Windows 版本
  • Mac版本

运行原理:是创建一个虚拟的Linux 在window 或者OsX上面,然后在上面建立docker deamon ,通过RESTful api 进行通讯

文件挂载

  • windows版 在 shared driver
  • Mac版 在file Sharing

网络设置

  • Windows版本在 NETWORK
  • Mac版本在Resources的NETWORK

Deamon的配置在Docker Engine => configuration file => deamon.json

4.Docker 镜像和容器

镜像

Docker image 是按照docker固定的格式进行打包的,所以需要使用docker的api进行打包,这样的好处是方便共享。镜像除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等),镜像有如下的特点

  • 镜像ID一般都是由64位的hashcode组成,镜像ID中都是包含了构建镜像的基础层的id的。
  • 镜像的分成存储
    • 显示出来的镜像大小是真实的大小,而在docker hub上显示的是压缩包(节省网络带宽)的大小
    • 这里显示的大小也不是真实在硬盘上存储的大小,因为docker image 会共用相同的基础层,所以在实际镜像占用磁盘的大小可能会远远小于真实的占用磁盘大小

容器

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间,容器内的进程是运行在一个隔离的环境里,这中特性使得容器内的应用更加的安全。容器在创建和启动的时候并没有复制,而是使用2个指针指向同一个内存空间,只有修改的时候才复制一份出来修改。

容器和镜像一样都是分层存储的,容器在运行的时候是以镜像为基础层的,在其基础上创建了存储层,这个存储层的会随着容器的消亡而消亡,所有在存储数据的时候推荐绑定数据卷(volume)到宿主文件系统中,这样数据的读写会跳过容器的存储层,直接在宿主系统中进行,保障了数据的稳定性和性能

容器的生命周期如下

  • created
  • running
  • stopped
  • paused
  • deleted

仓库

Docker仓库类似于github一样,存放着各种别人打包好的镜像,可以直接拉下来用。以 Ubuntu 镜像 为例,ubuntu 是仓库的名字,其内包含有不同的版本标签,如,16.04, 18.04。我们可以通过 ubuntu:16.04,或者 ubuntu:18.04 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 ubuntu,那将视为 ubuntu:latest。

相关资料

大家喜欢的可以看看我的专栏 (Docker你需要知道的知识点) 我会尽量保持每周更新,如果喜欢的麻烦帮我点个赞,十分感谢

大家如果喜欢“Typescript”的话,可以看看我分享的另外一个专栏(TypeScript常用知识)里面有常见的Typescript知识点分享,希望帮大家更好的理解TS的意义

大家如果喜欢“算法”的话,可以看看我分享的另外一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能帮助大家更深的理解算法

文章内容目的在于学习讨论与分享学习TS过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com