Open wangbo123855842 opened 3 years ago
正如 Docker 创始人 Solomon Hykes 所说,“测试环境使用 Python 2.7,但是生产环境使用 Python 3,那么一些奇怪的事情就会发生。或者你依赖某个特定版本的 SSl 库的行为,但是却安装了另外一个版本。在 Debian 上运行测试环境,但是生产环境使用 Redhat,那么任何奇怪的事情都可能发生。”
首先需要区分Linux内核与Linux发行版 Linux内核是Linux操作系统的核心, 负责硬件管理, 比如管理内存、管理磁盘(文件系统)、管理CPU(进程)等 Linux发行版是在Linux内核的基础上添加了一些工具软件,比如图形界面、函数库、软件包管理系统等
CentOS与Ubuntu是不同的Linux发行版, 它们都是基于Linux内核, 只是添加的工具软件不同。 因此CentOS与Ubuntu的内核是相同的(版本可能不同), 只是所安装的软件不同, 即文件系统不同。
Docker容器技术是基于Linux内核实现的, 它主要用到了两个内核模块: Namespace: 用于容器的隔离, 例如PID Namespace使得容器中的进程无法感知宿主机以及其他容器中的进程。 Cgroups: 用于容器的资源控制, 比如限制容器所使用的内存大小或者CPU个数。
所有docker容器都是使用的宿主机的OS。这一点和Virtual Machine会虚拟化出Guest OS完全不同。 你可以试一下,假设你的宿主机是Ubuntu 16.04的,内核版本是4.9。不管你运行哪个版本的ubuntu/centOS容器,看内核版本都是4.9。
共用Host OS(内核)是docker的特点!
问题一,Container内需不需要OS? Container指的是Docker Run出的运行环境,因为在里面我们可以运行一些命令,让使用者以为它就是一个完整的OS环境,这是不对的。其实Docker只是一个进程。当你使用docker exec登录进去的也只是一个Terminal的模拟环境。它不是真实的OS。正因为它不是OS,所以它是直接调用主机的Kernel的。而Container本身只是一个系统进程
第二个问题:为何需要OS的基础镜像? 首先,OS的问题上面已经解释过了,它不是一个OS,但为何需要OS的基础镜像?其实这里的基础镜像是一个包含rootfs的镜像。Kernel启动后是需要把启动文件解压到rootfs上的,然后kernel找到init文件启动就可以得到一个Linux环境了,Docker做的事情就是模拟这个过程,让kernel给出一个独立的隔离环境。
rootfs 根文件系统首先是内核启动时所mount的第一个文件系统, 内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。 展开来细说就是,根文件系统首先是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文件的功能,但是相对于普通的文件系统,它的特殊之处在于,它是内核启动时所挂载(mount)的第一个文件系统 我们要明白文件系统和内核是完全独立的两个部分 ・根文件系统提供了根目录“/” ・init进程的应用程序必须运行在根文件系统上 ・shell命令程序必须运行在根文件系统上
docker是容器不同于虚拟机,运行之后只有应用程序在里面运行,基础镜像只是为应用程序提供依赖包。应用程序是主,基础镜像是次。 一般docker镜像中的程序都是要依赖一些rootfs中的文件的,最重要的就是libc.so这些动态库了,像/bin下面的系统命令一般不是必要的,但为了方便也都放到里面了。即便是大家熟悉的ubuntu,centos这些镜像,也是做过精简的,跟我们自己从.iso一步步安装得到的不完全一样。 补充一下,如果要启动的进程没有任何依赖,即:没有使用任何系统命令,静态链接的(没有使用libc.so等动态库)的程序,这样极端的情况是可以没有rootfs的。
因为容器本身是共享宿主操作系统内核 容器基础系统镜像包本身就是一个标准 rootfs + 用户自定义的工具
・ Image(镜像) ・ Container(容器) ・ Repository(仓库)
镜像是 Docker 运行容器的前提,仓库是存放镜像的场所,可见镜像更是 Docker 的核心
docker tag wang/unbantu:17.10.0 wang/unbantu-test:lastest
docker login
docker push wang/unbantu-test:lastest
参考: https://blog.csdn.net/jctian000/article/details/82704252
在 Dockerfile 中, 应该至少指定一个 CMD 和 ENTRYPOINT; 将 Docker 当作可执行程序时, 应该使用 ENTRYPOINT 进行配置; CMD 可以用作 ENTRYPOINT 默认参数, 或者用作 Docker 的默认命令; CMD 可以被 docker run 传入的参数覆盖; docker run 传入的参数会附加到 ENTRYPOINT 之后, 前提是使用了 exec 格式 。
如果没有 entrypoint(默认命令是" / bin / sh -c "), CMD 可以包含一个可执行文件。 如果 ENTRYPOINT 已经运行一个可执行文件,那么 CMD 参数就是这个命令的参数。
比如下面的 Dockerfile 片段
ENTRYPOINT ["/bin/echo", "Hello"] CMD ["world"]
当容器通过 docker run -it [image] 启动时,输出为
docker run -it [image]
Hello world
而如果通过 docker run -it [image] CloudMan 启动,则输出为
docker run -it [image] CloudMan
Hello CloudMan
Docker Machine 是一种可以让您在虚拟主机上安装 Docker 的工具,并可以使用 docker-machine 命令来管理主机。 Docker Machine 也可以集中管理所有的 docker 主机,比如快速的给 100 台服务器安装上 docker。
Swarm工具本身不是很成熟,不建议用在生产环境。 而 Google 开源的Kubernetes 是目前容器生态圈中最受欢迎的编排部署工具。
虚拟化
Hypervisor
虚拟化种类
容器
为什么出现容器技术
正如 Docker 创始人 Solomon Hykes 所说,“测试环境使用 Python 2.7,但是生产环境使用 Python 3,那么一些奇怪的事情就会发生。或者你依赖某个特定版本的 SSl 库的行为,但是却安装了另外一个版本。在 Debian 上运行测试环境,但是生产环境使用 Redhat,那么任何奇怪的事情都可能发生。”
容器是什么
容器 与 VM
别墅是物理机, 公寓的每一个住户是VM,胶囊公寓的每一个胶囊是容器
容器 与 宿主OS(补充说明)
首先需要区分Linux内核与Linux发行版 Linux内核是Linux操作系统的核心, 负责硬件管理, 比如管理内存、管理磁盘(文件系统)、管理CPU(进程)等 Linux发行版是在Linux内核的基础上添加了一些工具软件,比如图形界面、函数库、软件包管理系统等
CentOS与Ubuntu是不同的Linux发行版, 它们都是基于Linux内核, 只是添加的工具软件不同。 因此CentOS与Ubuntu的内核是相同的(版本可能不同), 只是所安装的软件不同, 即文件系统不同。
Docker容器技术是基于Linux内核实现的, 它主要用到了两个内核模块: Namespace: 用于容器的隔离, 例如PID Namespace使得容器中的进程无法感知宿主机以及其他容器中的进程。 Cgroups: 用于容器的资源控制, 比如限制容器所使用的内存大小或者CPU个数。
所有docker容器都是使用的宿主机的OS。这一点和Virtual Machine会虚拟化出Guest OS完全不同。 你可以试一下,假设你的宿主机是Ubuntu 16.04的,内核版本是4.9。不管你运行哪个版本的ubuntu/centOS容器,看内核版本都是4.9。
共用Host OS(内核)是docker的特点!
问题一,Container内需不需要OS? Container指的是Docker Run出的运行环境,因为在里面我们可以运行一些命令,让使用者以为它就是一个完整的OS环境,这是不对的。其实Docker只是一个进程。当你使用docker exec登录进去的也只是一个Terminal的模拟环境。它不是真实的OS。正因为它不是OS,所以它是直接调用主机的Kernel的。而Container本身只是一个系统进程
第二个问题:为何需要OS的基础镜像? 首先,OS的问题上面已经解释过了,它不是一个OS,但为何需要OS的基础镜像?其实这里的基础镜像是一个包含rootfs的镜像。Kernel启动后是需要把启动文件解压到rootfs上的,然后kernel找到init文件启动就可以得到一个Linux环境了,Docker做的事情就是模拟这个过程,让kernel给出一个独立的隔离环境。
rootfs 根文件系统首先是内核启动时所mount的第一个文件系统, 内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。 展开来细说就是,根文件系统首先是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文件的功能,但是相对于普通的文件系统,它的特殊之处在于,它是内核启动时所挂载(mount)的第一个文件系统 我们要明白文件系统和内核是完全独立的两个部分 ・根文件系统提供了根目录“/” ・init进程的应用程序必须运行在根文件系统上 ・shell命令程序必须运行在根文件系统上
docker是容器不同于虚拟机,运行之后只有应用程序在里面运行,基础镜像只是为应用程序提供依赖包。应用程序是主,基础镜像是次。 一般docker镜像中的程序都是要依赖一些rootfs中的文件的,最重要的就是libc.so这些动态库了,像/bin下面的系统命令一般不是必要的,但为了方便也都放到里面了。即便是大家熟悉的ubuntu,centos这些镜像,也是做过精简的,跟我们自己从.iso一步步安装得到的不完全一样。 补充一下,如果要启动的进程没有任何依赖,即:没有使用任何系统命令,静态链接的(没有使用libc.so等动态库)的程序,这样极端的情况是可以没有rootfs的。
因为容器本身是共享宿主操作系统内核 容器基础系统镜像包本身就是一个标准 rootfs + 用户自定义的工具
Docker
Docker本身并不是容器,它是创建容器的工具,是应用容器引擎
Build once,Run anywhere!
Docker概念构成
・ Image(镜像) ・ Container(容器) ・ Repository(仓库)
镜像是 Docker 运行容器的前提,仓库是存放镜像的场所,可见镜像更是 Docker 的核心
镜像
容器
仓库
Docker架构
Docker组件是如何协作运行容器
docker run hello-world
安装
常用命令
docker hub上传镜像
镜像导入导出(import export)和加载保存(load,save)
参考: https://blog.csdn.net/jctian000/article/details/82704252
Dockerfile
Dockerfile常用指令
entrypoint 和 cmd 区别
在 Dockerfile 中, 应该至少指定一个 CMD 和 ENTRYPOINT; 将 Docker 当作可执行程序时, 应该使用 ENTRYPOINT 进行配置; CMD 可以用作 ENTRYPOINT 默认参数, 或者用作 Docker 的默认命令; CMD 可以被 docker run 传入的参数覆盖; docker run 传入的参数会附加到 ENTRYPOINT 之后, 前提是使用了 exec 格式 。
如果没有 entrypoint(默认命令是" / bin / sh -c "), CMD 可以包含一个可执行文件。 如果 ENTRYPOINT 已经运行一个可执行文件,那么 CMD 参数就是这个命令的参数。
比如下面的 Dockerfile 片段
当容器通过
docker run -it [image]
启动时,输出为而如果通过
docker run -it [image] CloudMan
启动,则输出为Dockerfile例子
Docker三剑客
compose、machine 和 swarm 是docker 原生提供的三大编排工具
compose
Machine
Docker Machine 是一种可以让您在虚拟主机上安装 Docker 的工具,并可以使用 docker-machine 命令来管理主机。 Docker Machine 也可以集中管理所有的 docker 主机,比如快速的给 100 台服务器安装上 docker。
Swarm
Swarm工具本身不是很成熟,不建议用在生产环境。 而 Google 开源的Kubernetes 是目前容器生态圈中最受欢迎的编排部署工具。