服务的容器化过程
1.容器和虚拟机
虚拟机: 用于为用户提供一个完整的系统镜像,常见的虚拟机有VMware,WirtualBox,KVM等.多个容器可以共享操作系统内容. 容器: 一种轻量级、可移植的为应用程序提供隔离的运行空间.每个容器内都包含一个独享的完整用户环境,并且一个容器内的环境变动不会影响其他容器的运行环境,可以使应用程序在几乎任何地方以相同的方式运行.每台虚拟机必须包括一整套操作系统、应用程序和各种依赖库等.

服务和环境

2.Docker
2.1 Docker架构
Docker引擎
- Docker后台服务(
Docker Daemon):是长时间运行在后台的守护进程,是Docker的核心服务,可以通过命令dockerd与它交互通信 - REST接口(
REST API): 程序可以通过REST的接口来访问后台服务,或向它发送操作指令 - 交互式命令行界面(
Docker CLI):大多数时间都在使用命令行界面与Docker进行交互

Docker架构
- Docker后台服务监听REST接口的请求,管理Docker的对象,比如Docker的镜像,容器,网络和磁盘卷
- Docker客户端(
Docker Client): 和Docker后台服务交互的主要工具,在使用docker run命令时,客户端把命令发送到Docker后台服务,再由后台服务执行该命令.Docker客户端可以连接多个后台服务并与他们通信 - Docker仓库(
Docker Registry): 存储Docker镜像.当使用Docker pull或Docker run命令时,就会从我们配置的docker仓库下载镜像,当使用docker push命令时,镜像就会被推送到Docker仓库中 - Docker对象(
Docker Object): 包括镜像、容器、网络、磁盘卷和插件等.在使用Docker时,就会创建和使用Docker对象- 镜像(
image): 只读的指令模板,用户创建Docker容器(container).通常一个镜像会继承另外一个镜像,然后扩展自定义的指令. - 容器(
container): 镜像运行的一个实例.可以使用Docker的API或CLI创建、运行、停止、移动或者删除容器.可以为容器绑定一个或多个网络(network)或挂载一个磁盘卷(volume),也可以通过继承它来创建一个新的容器.通过一个容器与另一个容器或它的宿主机都是相对独立和隔离的.在容器停止运行后,它其中的所有改变的状态如果没有保存,则都将会消失 - Docker服务(
service): 允许在多个Docker后台服务(deamon)中伸缩扩展容器,这些容器组成了一个拥有多住多从模式的集群.集群中每一个成员都是一个Docker后台服务,它们之间通过Docker接口通信.我们可以通过Docker服务来定义集群的参数,如果集群中容器的副本个数.默认情况下,集群的负载是面向所有容器节点的
- 镜像(
- 命名空间(Namespaces): Docker使用命名空间为容器提供了很好的隔离性.每个容器都是一个独立的命名空间,容器仅仅限制在自己的命名空间中访问权限
- pd命名空间(
pid namespace): 隔离进程的ID空间,使得不同pid命名空间里的进程ID可以重复且相互之间不受影响 - net命名空间(
net namespace): 管理网络协议栈的多个实例 - ipc命名空间(
ipc namespace): 管理和访问IPC资源 - mnt命名空间(
mnt namespace): 管理文件系统的挂载点 - uts命名空间(
uts namespace): 隔离内核和版本信息
- pd命名空间(
- cgroups(
control groups): 确保Docker将可用的硬件资源共享给所有容器,并且可以对容器限制硬件资源 - UnionFS(
Union File Systems): 是Docker在创建层时使用的文件系统.这种文件系统使Docker变得轻量级并且执行速度很快. - 容器格式(
container format): Docker将namespaces、control groups和UnionFS封装成container format,称其为容器.默认的容器类型是libcontainer

2.2 Docker安装使用
Docker基本信息
# 查看Docker版本
$ docker --version
# 查看Docker-compose版本
$ docker-compose --version
# 查看docker-machine版本
$ docker-machine --version
# 查看docker的更多信息
$ docker version
Docker命令
# 查看本地镜像
$ docker images
# 查看运行的容器
$ docker ps
# 运行docker自带的hello world
$ docker run hello-world
# 以后台模式在80端口启动Nginx容器
$ docker run -d -p 80:80 --name webserver nginx