云原生技术系列-Containerization容器化Docke

2019-11-30  本文已影响0人  GeekerLou

前言

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

image.png

正文

物理机、虚拟机和容器

image.png image.png image.png

容器虚拟化的是操作系统而不是硬件,容器之间是共享同一套操作系统资源的。
虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统。
因此容器的隔离级别会稍低一些。

image.png

明显区别:
Docker比虚拟化少了两层,取消了 hypervisor 层和 GuestOS 层,使用 Docker Engine 进行调度和隔离,所有应用共用主机操作系统,因此在体量上 Docker 较虚拟机更轻量级,在性能上优于虚拟化,接近裸机性能。

本质区别:

image.png

Docker优势:

Docker不足:

Docker的优势

Docker Engine

Docker daemon: 运行在宿主机上,Docker守护进程,用户通过Docker client(Docker命令)与Docker daemon交互

Docker client: Docker 命令行工具,是用户使用Docker的主要方式,Docker client与Docker daemon通信并将结果返回给用户,Docker client也可以通过socket或者RESTful api访问远程的Docker daemon

image.png

Docker的理念

Build, Ship, and Run Any App, Anywhere

image.png image.png

Docker的核心组成

image.png

镜像Image

image.png image.png

容器(Container)

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。

容器可以被创建、启动、停止、删除、暂停等 。

容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。使用数据卷来帮助解决这个问题。

数据卷(Volume)

文件数据存储是数据交互的重要组成,在虚拟机中,通常直接采用虚拟机的文件系统作为应用数据等文件的存储位置,这种方式的问题在于,虚拟机或者容器出现问题导致文件系统无法使用时,之前存放的数据也就丢失了。

另外一种方式,就是挂载真实数据源的方式,Docker就是采用这种方式,通过底层的Union File System 技术,除了能够从宿主操作系统中挂载目录外,还能够建立独立的目录持久存放数据,或者在容器间共享。

数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此, 使用数据卷后,容器可以随意删除、重新run,数据却不会丢失。

仓库( Repository)

镜像仓库是Docker用来集中存放镜像文件的地方,类似于我们之前常用的代码仓库。

一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以latest作为默认标签。

Docker Registry有公服和私服之分,类似于Maven的公共仓库和私有仓库。

网络(Network)

image.png

docker生命周期

image.png

可以看到,容器的生命周期分为五种状态

此外,这张图中对于一些常用的指令也进行了标注,建议可以结合这张图,一方面了解docker容器的生命周期,一方面也了解一些常用的docker操作指令。

DockerFile

作用:定义docker镜像构建步骤,适用于构建比较复杂的docker镜像。有点类似于makefile之于CPP项目,shell script之于shell指令。

命令 含义
FROM 指定基础镜像
RUN 构建指令,会生成新的层。支持 \ 换行,多条之间用 && 连接,减少新层
COPY 将构建命令所在的主机本地的文件或目录,复制到镜像文件系统
ADD 不仅能够将构建命令所在的主机本地的文件或目录,而且能够将远程URL所对应的文件或目录,作为资源复制到镜像文件系统。
ENTRYPOINT 主要用于对容器进行一些初始化
CMD 定义容器中主程序的启动命令,建议使用数组的方式
EXPOSE 指定暴露的端口
VOLUME 指定挂载持久卷的位置

构建镜像指令:

docker build  -t {目录} –f {dockerfile文件地址} 

Dockerfile的使用-一个完整的Demo


image.png

总结

最后来一张图:

image.png
上一篇 下一篇

猜你喜欢

热点阅读