背景 1.不同的应用程序可能会有不同的应用环境,比如.net开发的网站和php开发的网站依赖的软件就不一样,如果把他们依赖的软件都安装在一个服务器上就要调试很久,而且很麻烦,还会造成一些冲突。比如IIS和Apache访问端口冲突。这个时候你就要隔离.net开发的网站和php开发的网站。常规来讲,我们可以在服务器上创建不同的虚拟机在不同的虚拟机上放置不同的应用,但是虚拟机开销比较高。docker可以实现虚拟机隔离应用环境的功能,并且开销比虚拟机小,小就意味着省钱了。
2.你开发软件的时候用的是Ubuntu,但是运维管理的都是centos,运维在把你的软件从开发环境转移到生产环境的时候就会遇到一些Ubuntu转centos的问题,比如:有个特殊版本的数据库,只有Ubuntu支持,centos不支持,在转移的过程当中运维就得想办法解决这样的问题。这时候要是有docker你就可以把开发环境直接封装转移给运维,运维直接部署你给他的docker就可以了。而且部署速度快。
3.在服务器负载方面,如果你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker部署的话,这些内存就会利用起来。 zhuanlan.zhihu.com/p/71741225
theme: cyanosis
1.操作镜像相关命令
1.1 什么是镜像
我们应该知道操作系统主要分为两个部分:内核 和 用户空间。内核启动后,会挂载 root 文件系统为其提供用户空间支持。
操作系统相关知识
概念:操作系统是管理计算机硬件与软件资源的计算机程序。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。
感性认识:操作系统就是用户与电脑机器运行的中介,也就是说我们如何让电脑执行用户的指令,如何打开文件,播放音乐,这些都是通过操作系统来让电脑硬件工作的。可以说,如果没有操作系统,我们无法使用电脑。 常见的操作系统:UNIX、Linux、Windows操作系统功能:
进程管理:其工作主要是进程调度,如果我希望在打字的时候听音乐,就需要多个程序并发,这个时候如何分配资源,因此诞生了进程来来解决以前程序不能并发的问题。(在单用户单任务的情况下,处理器仅为一个用户的一个任务所独占。浪费资源)。因此将进程作为一个工作单元,可以认为打开一个app就是新建一个进程来让你的app得以运行。进程管理就是在多程序的情况下,或者组织多个作业或任务时,就要解决处理器的调度、分配和回收等问题(进程是操作系统资源分配的基本单位,而线程是在进程分配的资源的基础上,进一步拆除的工作任务执行单位,这些线程/工作单位共享进程的资源内存等)。举例:一块田就是一个进程,一个农名就是一个线程,这个地就是资源,可以供多个农民线程耕种。
存储管理:主要是对内存的分配、保护和扩充,主要包括存储分配、存储共享、存储保护、存储扩张。
设备管理:设备分配、设备传输控制、设备独立性,对所有输人、输出设备的管理,保证设备的正常使用。
文件管理:文件存储空间的管理、目录管理、文件操作管理、文件保护。主要涉及文件的逻辑组织和物理组织,目录的结构和管理。
作业管理:是负责处理用户提交的任何要求,为用户提供一个友好的环境,方便用户组织自己的工作流程。
进程与线程关系图:
blog.csdn.net/qq_46254436…
1.1 unionfs 联合文件系统
联合文件系统,顾名思义也是一种文件系统,之所以叫联合,是因为在这个文件系统中对文件系统的修改通过层层叠加覆盖上去的(类似于commit),而不是传统的直接修改。此外,联合文件系统还有一个特点:可以将不同目录挂载在同一个虚拟文件系统下。联合文件系统是镜像的基础。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
Docker镜像原理
本质上是由一层一层的文件系统组成,构成联合文件系统。所以,docker镜像是由各个文件系统层叠而成。基础是引导文件系统bootfs,它类似于典型的Linux/Unix引导文件系统。
镜像不是一个单一的文件,而是很多层
www.php.cn/docker/4855…
www.404bugs.com/index.php/d…
1.2 操作命令
- docker image ls : 查看全部镜像
- docker search 【imagesName】: 查找镜像
- docker inspect【imagesName】: 显示一个镜像的详细信息
- docker pull【imagesName】: 拉取一个镜像
- docker push【imagesName】: 发布一个镜像到镜像仓库
- docker rmi【imagesName】: 删除一个镜像
- docker image prune【imagesName】: 删除没有产生容器的镜像
- docker export -o ***.tar 【imageId】 : 将一个容器导出一个tar包
- docker import ***.tar: 导入一个tar包
2.操作容器相关命令
2.1 容器
- 容器生成以后,就会同时存在两个文件,image文件和容器文件
- 关闭容器不会删除容器文件,只是容器停止运行
- image文件生成的容器实例,本身也是一个文件,称为容器文件
docker实现原理
docker容器最主要的是实现隔离:其中通过linux namespace实现进程隔离, unionfiles实现文件系统隔离,controlgroup控制组实现对一组进程以及内部的子进程资源限制隔离(例如可以限制某个进程的资源占用,例如:cpu,内存,存储,网络,设备访问权限)
概括起来就是namespace做资源隔离,controlgroup做资源限制,unionfiles做容器文件系统的轻量化虚拟技术
mikechen.cc/24762.html
2.2 操作命令
- docker container run [imageName] : 从镜像运行一个容器
- docker container ls : 列出容器列表(只查看在运行的容器)
- docker attach : 要attach上去的容器必须正在运行,可以同时连接上同一个container来共享屏幕
- docker container stats : 显示容器资源使用统计
- docker container top: 显示一个容器运行的进程
- docker container port : 更新一个或多个容器配置
- docker container inspect : 展示一个容器的详细信息
- docker container port : 查看容器的端口暴露情况
- docker container stop : 停止一个容器
- docker container start :开启一个容器
- docker container rm : 删除一个容器
- docker container exec -it [containerID] /bin/bash : 启动一个正在运行的容器13. docker container cp [containerID] :/文件 宿主机路径 : 拷贝一个docker容器内的文件到宿主机
- docker container run -it [imageName] /bin/bash : 启动交互式的容器
3.compose
例如一个网站需要mysql,nginx,node...,在docker中,我们要编排这些容器,让我们更好的控制这些容器。
1.考虑选择那些镜像
2.按照合适的顺序启动这些容器
3.管理容器中的服务器
4.如果服务器关机了,还要重启容器
5.如果服务器负载过大,动态扩容
6.如果程序更新了,还要动态升级镜像和容器和服务
所以docker compose的出现就很有意义;
- compose通过一个配置文件来管理多个Docker容器
- 在配置文件中,所有的容器通过service来定义,然后使用docker-compse脚本来启动、停止和重启应用和应用中的服务以及所有依赖服务器的容器
注意1:与虚拟机通过操作系统实现隔离不同,容器技术只隔离应用程序的运行时环境但容器之间可以共享同一个操作系统,这里的运行时环境指的是程序运行依赖的各种库以及配置。 容器的隔离性强:指的是容器中包含了程序运行所需要的环境(node版本)、依赖(node_modules)、配置文件config以及程序本身的代码等,因此才导致隔离性强 可移植性强:因为容器可以抽象为镜像,可以导出交付,因此移植性强
掌握程度: 听到容器就立刻反应出这是一个具有自己单独环境、依赖、配置来运行自己程序的盒子,盒子与盒子之间具有隔离性 听到镜像:就能明白这是容器的抽象打包 重点参考文献:zhuanlan.zhihu.com/p/187505981