# 2.容器和Docker
# 什么是容器化?
容器化是将应用程序或服务、其依赖项及其配置(抽象化为部署清单文件)一起打包为容器映像的一种软件开发方法。

软件容器充当软件部署的标准单元,其中可以包含不同的代码和依赖项。 按照这种方式容器化软件,开发人员和 IT 专业人员只需进行极少修改或不修改,即可将其部署到不同的环境。
容器化应用程序在容器主机上运行,而容器主机在 OS(Linux 或 Windows)上运行。因此,容器的占用比虚拟机 (VM) 映像小得多。
容器化的特点:
- 一致的运行环境
- 可伸缩性
- 更方便的移植
- 隔离性
# 什么是Docker?
Docker (opens new window)是用GO语言开发的应用容器引擎,基于容器化,沙箱机制的应用部署技术。可适用于自动化测试、打包,持续集成和发布应用程序等场景,包括阿里云,亚马逊在内的云计算服务商都采用了docker来打造serverless服务平台。它不仅仅可以部署项目,还可以用于数据库搭建,nginx服务搭建,nodejs、php等编程语言环境搭建。
PS: docker现已改名为moby
Docker中的三个重要概念:
镜像(image):分片的(只读)文件系统,由Dockerfile创建
独立、易扩展、更效率
容器(container):由Docker进程创建和管理的:文件系统 + 系统资源 + 网络配置 + 日志管理
docker是docker镜像的运行环境,所以容器的概念就比较好理解了
仓库(registry):用来远端存储docker镜像
版本控制、变更管理、为持续集成与快速部署提供便利
# Docker vs 虚拟机

- 容器是应用层的抽象,它将代码和依赖关系打包在一起。 多个容器可以在同一台机器上运行,并与其他容器共享操作系统内核,每个容器在用户空间中作为独立进程运行。 容器占用的空间比VM少(容器映像的大小通常为几十MB),可以处理更多的应用程序,并且需要更少的VM和操作系统。
- 虚拟机(VM)是物理硬件的抽象,将一台服务器转变为多台服务器。 管理程序允许多台VM在单台机器上运行。 每个VM都包含操作系统的完整副本,应用程序,必要的二进制文件和库 - 占用数十GB。 虚拟机也可能很慢启动。
总结一下:
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为 MB | 一般为 GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
开发/环境定制 | 方便(命令行、面向对象式) | 进入虚拟机 |
相同点:
- 文件隔离/文件共享(沙箱)
- 资源隔离
- 网络隔离
- 支持多种宿主环境(扩展)
- 快照/镜像(版本控制/变更管理)
不同点:
- 不同的资源管理/依赖//释放(虚拟机占用更多的系统资源)
- 不同的应用运行环境
- Docker是写时复制
- 不同的日志方式(Docker收集日志,而虚拟机需要在虚拟系统里面看日志)
- 不同的交互方式(Docker偏shell,虚拟机偏GUI)
# Docker的工作原理(重点)

Docker是容器化部署技术,它主要作用在于通过运行容器来实现应用部署,而容器基于镜像运行。
简单地说,就是将你的项目和依赖包(基础镜像)打成一个带有启动指令的项目镜像,然后在服务器创建一个容器,让镜像在容器内运行,从而实现项目的部署。
服务器就是容器的宿主机,docker容器与宿主机之间是相互隔离的。
Docker 的基础是Linux容器(LXC:Linux Containers)等技术。
一般情况下:
Linux(服务器) -> tomcat安装 -> Java依赖 -> maven依赖 ->放置在/usr/lib目录 -> 配置tomcat端口/目录 -> 运行tomcat中的startup.sh脚本 -> 配置网络、防火墙等(后续) -> 服务启动
Docker:
使用基于java的tomcat镜像 -> docker run -> 指定端口/挂载webapp目录 -> 服务启动
这其中,发生了什么?
Docker会自己拉取镜像,若本地已经存在该镜像,则不用到网上去拉取
创建新的容器
分配文件系统并且挂着一个可读写的层,任何修改容器的操作都会被记录在这个读写层上,你可以保存这些修改成新的镜像,也可以选择不保存,那么下次运行改镜像的时候所有修改操作都会被消除
分配网络\桥接接口,创建一个允许容器与本地主机通信的网络接口
设置ip地址,从池中寻找一个可用的ip地址附加到容器上,换句话说,localhost并不能访问到容器
运行你指定的程序
捕获并且提供应用输出,包括输入、输出、报错信息
Docker的价值:
从应用架构角度:统一复杂的构建环境;
从应用部署角度:解决依赖不同、构建麻烦的问题,结合自动化工具(如jenkins)提高效率。
从集群管理角度:规范的服务调度,服务发现,负载均衡
← 1.容器化运维操作 3.常见的应用场景介绍 →