Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。 简单的说就是一个实现虚拟化的容器引擎,它与传统的虚拟机不同:传统的虚拟机是虚拟出一套硬件之后在其上运行一个完整的操作系统,在操作系统上运行程序所需要的进程;而Docker的容器直接运行在宿主机的内核中。容器没有自己的内核,更没有进行硬件的虚拟。因此容器要比传统的虚拟机更为轻便。
传统的虚拟化 DockerDocker的镜像提供了除内核外完整的运行环境,确保了应用环境一致性,从而不会再出现“这段代码在我的机器上没问题啊”这类问题。 可以做到秒级,甚至毫秒级的启动时间。大大节约了开发时间、部署、测试的时间。 很好的隔离性,避免公用的服务器资源会容易受其他用户的影响。 善于处理集中爆发的服务器使用压力。弹性伸缩,扩展性强。 可以很轻易的把在一个平台上运行的应用,迁移到另一个平台上,而不用担心环境的变化带来兼容性的问题。 使用Docker可以通过定制应用镜像来实现持续交付,部署。
1,镜像 (Image) 2,容器 (Container) 3,仓库 (Repository)
操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载root文件系统为其提供用户空间支持。而 Docker 镜像就是一个特殊的root文件系统,提供容器运行时所需的程序、库、资源、配置等文件,不包含任何动态数据。 特点:分层存储,镜像是一个虚拟的概念,并非像ISO那样打包成一个文件组成,它是由多层文件系统组成。构建镜像时,会一层一层构建,前一层是后一层的基础。比方说在一个基础镜像上安装一些新的程序,提交后不会影响基础的文件层,会在之前的基础上新增层用来存储这些变动。 分层存储的特征还使得镜像的复用、定制变的更为容易。可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像
//查看镜像元数据 docker inspect imageid ...... "RootFS": { "Type": "layers", "Layers": [ "sha256:d69483a6face4499acb974449d1303591fcbb5cdce5420f36f8a6607bda11854", "sha256:22c94307fc9cef4198bcb9231249f85faeab17527624de672fd3fcda097ce9d6", "sha256:c8615da6d24e268c91c716003587a413b20fd1d076a55833a8d87c667d15c5cc", "sha256:5db2eebfb35f3729fea8ce5843147f736c005e257ad0ad192bcc2626e4fe0e37", "sha256:71c2b8ff4e7b67b08006c70c3b388bbf245f041efe49332be2c4b57d1fcd9995", "sha256:590c01907951d3c77165ad82b583fdc74af251d295fe68b3bc5e091138360e19" ] } ......镜像和容器的关系,就像是面向对象程序设计中的类和实例 一样,镜像是静态的定义,容器是镜像运行时的实体。 容器的本质是进程,与直接在宿主机上运行的进程不同,容器运行在属于自己的namespace,与其他容器隔离,有属于自己的文件系统、网络配置、进程空间等。这种隔离的特性使容器封装的应用比直接在宿主机更加安全。
Docker Registry 创建好容器后,可以在宿主机上运行。但是,如果其他服务器上需要使用这个镜像,我们需要一个提供镜像托管服务——Docker Registry,类似于我们的代码托管的Git。
私有的Docker Registry类似于我们私有的Git Lab服务。 公有的Docker Registry类似于我们常用的Git hub。常用的公开 Registry有官方有Docker Hub,有者大量的高质量的官方镜像。国内也有类似于 网易云镜像,阿里云镜像,DaoCloud镜像市场等云服务商提供的服务。
一个Docker Registry可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。
仓库(Repository)类似于我们git的代码仓库。 Tag 与Git 的 标签 类似。每个Tag对应一个镜像。
根据官网安装引导,本文不详细介绍
Dockerfile是最常用的编排镜像的一种手段。它是 一个文本文件,包含了一条条的指令,每一条指令构建 一层,因此每一条指令描述了该层应当如何构建。 在一个空白目录,建立一个文本文件,并命名为Dockerfile:
FROM nginx RUN echo '<h1>Hello Docker!</h1>' > /usr/share/nginx/html/index.html构建镜像
docker build -t nginx:test .更多Dockerfile指令请参考Dockerfile文档
Compose是Docker的服务编排工具,主要用来构建基于Docker的复杂应用,Compose 通过一个配置文件来管理多个Docker容器,非常适合组合使用多个容器进行开发的场景。
docker-compose是编排容器的。例如,你有一个php镜像,一个mysql镜像,一个nginx镜像。如果没有docker-compose,那么每次启动的时候,你需要敲各个容器的启动参数,环境变量,容器命名,指定不同容器的链接参数等等一系列的操作,相当繁琐。而用了docker-composer之后,你就可以把这些命令一次性写在docker-composer.yml文件中,以后每次启动这一整个环境(含3个容器)的时候,你只要敲一个docker-composer up命令就可以了。
新建文件夹,编写app.py
from flask import Flask from redis import Redis app = Flask(__name__) redis = Redis(host='redis', port=6379) @app.route('/') def hello(): count = redis.incr('hits') return 'Hello World! 该页面已被访问 {} 次。\n'.format(count) if __name__ == "__main__": app.run(host="0.0.0.0", debug=True)编写Dockerfile文件,内容是
FROM python:3.6-alpine ADD . /code WORKDIR /code RUN pip install redis flask CMD ["python", "app.py"]编写docker-compose.yml模板文件
version: '3' services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine"运行compose项目
docker-compose up此时访问本地 5000 端口,每次刷新页面,计数就会加 1。
以上是 docker-compose 的简单运行示例,更多 docker-compose指令请查阅官方文档
Docker Machine 是 Docker 官方编排项目之一,负责在多种平台上快速安装 Docker 环境。 Docker Machine 是一个工具,它允许你在虚拟宿主机上安装 Docker Engine ,并使用 docker-machine 命令管理这些宿主机。你可以使用 Machine 在你本地的 Mac 或 Windows 或像 阿里云 或 腾讯云这样的云提供商上创建 Docker 宿主机。 使用 docker-machine 命令,你可以启动、审查、停止和重新启动托管的宿主机、升级 Docker 客户端和守护程序、并配置 Docker 客户端与你的宿主机通信。
1,Docker daemon 2,一套与 Docker daemon 交互的 REST API 3,一个命令行客户端
下图很清晰的展示了它们之间的关系: Docker-machine跟docker的关系: 开发者可以通过docker主机控制:
如果遇到热点事件,比如某促销活动,或者某个明星离婚等热点事件,可能会导致原本的服务器承受不住突然的大量访问,但是又没有这么多的服务器。那么通过docker machine来创建docker临时服务器(实际的ECS,按时计费)来应对突发的服务器压力,等热点过去后,可以根据情况停止、删除等。
官网手册 https://docs.docker.com/machine/install-machine/ 第三方驱动 https://github.com/docker/docker.github.io/blob/master/machine/AVAILABLE_DRIVER_PLUGINS.md
Swarm是Docker公司推出的用来管理docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机 。 应用想要扩容到两台以上的服务器上,多台服务器总是比单台服务器复杂,可以使用docker-swarm进行集群化的管理跟伸缩。
顺便docker swarm 功能类似的集群管理工具 kubernates(k8s),虽然swarm是docker官方推出的集群方案,但是凭借着更加擅长处理解决复杂场景下应用的部署,k8s已经逐步一统江湖,感兴趣的同学可以研究一下~