docker实战(一):docker容器生态系统简介和docker machine多主机管理配置

docker容器生态系统简介

容器技术

docker目前作为容器技术使用最为广泛的容器技术,可以说已经成为了容器技术的代名词。在介绍docker之前首先介绍一下容器技术和虚拟机技术的区别,区分好容器和虚拟机这两个概念,便能够很好得理解容器技术。
首先介绍一下虚拟机技术,一台虚拟机需要模拟整台机器包括硬件。每台虚拟机都需要有自己的操作系统,虚拟机一旦被开启,预分配给它的资源将全部被占用。每一台虚拟机都至少包括应用,必要的二进制和库,以及一个完整的用户操作系统。之前介绍的openstack云平台管理项目,其管理分配的计算,网络和存储等资源即通过虚拟机的形式呈现给用户来使用。因为openstack的主要功能为计算网络存储资源的分配,因此openstack属于Iaas层的技术。
而容器技术是和我们的宿主机共享硬件资源及操作系统,可以实现资源的动态分配。容器包含应用和其所有的依赖包,但是与其他容器共享内核。容器在宿主机操作系统中,在用户空间以分离的进程运行,以linux容器技术例,Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离,相当于是在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。可以说,容器技术是实现操作系统虚拟化的一种途径,可以让您在资源受到隔离的进程中运行应用程序及其依赖关系。docker属于linux容器的封装,属于 Linux 容器的一种封装,提供简单易用的容器使用接口,它是目前最流行的 Linux 容器解决方案。docker可以把一个应用以及应用所依赖的环境打包成一个包,这个包也就是镜像image,这个镜像可以在不同的环境中原生运行,成为一个容器Container,这样就为用户提供了一个环境来保证该应用的开发测试运维环境的一致性,因此docker属于Paas层的技术。镜像image,容器container以及存放image的公有和私有仓库regsitry是docker中的最基本概念。

容器生态系统

以docker为基石容器生态系统,包含核心技术,平台技术和支持技术,下面将针对这三部分内容分别进行介绍

容器核心技术

容器核心技术是指能够让container在host上运行起来的那些技术,主要包括容器规范,容器runtime,容器管理工具,容器定义工具,仓库Registries和容器OS:

  1. 容器规范:docker只是容器技术中的一种,还有其他容器,比如CoreOS的rkt。为了保证不同容器之间能够兼容,制定了开放的容器规范,包括runtime spec和image format spec;
  2. 容器runtime:runtime是容器真正运行的地方。runtime需要跟操作系统Kernel紧密协作,为容器提供运行环境。目前主流的三种容器runtime包括lxc,runc和rkt,docker目前使用的runtime为runc;
  3. 容器管理工具:容器管理工具对内与runtime交互,对外为用户提供interface,比如CLI,使得用户可以使用该工具对容器进行管理。针对不同的容器runtime有不同的容器管理工具,针对runc的容器管理工具为docker engine,docker engine包括daemon和cli两个部分,可以理解为一个后台管理的守护进程以及一个客户端与用户交互;
  4. 容器定义工具:容器定义工具允许用户定义容器的内容与属性,这样容器就能够被保存、共享和重建。对于docker来说容器定义工具包括docker image和dockerfile。docker image是docker 容器的模板,runtime依据docker image创建容器。dockerfile是包含若干命令的文本文件,可以通过这些命令创建出docker image;
  5. Registry:容器通过image创建,需要有一个仓库来统一存放image,这个仓库就叫Registry。目前的公有Registry包括Docker Hub(https://hub.docker.com)和Quay.io(https://quay.io/),企业和个人也可以通过Docker Registry镜像来构建自己的私有Registry;
  6. 容器OS:容器OS是专门运行容器的操作系统,与传统OS相比,容器OS通常体积更小,启动更快,目前的容器OS有CoreOS、Ubuntu Core等;

容器平台技术

前面介绍的容器核心技术可以让容器能够在单个host上运行,而容器平台技术能够让容器作为集群在分布式环境中运行。容器平台技术包括容器编排引擎,容器管理平台和基于容器的Paas:

  1. 容器编排引擎:基于容器的应用一般会采用微服务架构,在这种架构下,应用会被划分为不同的组件,并以服务的形式运行在各自的容器中,通过API来对外提供服务。为了保证应用的高可用,每个组件都可能会运行多个相同的容器,这些容器会组成集群,我们需要有一种高效的方法来管理容器集群,因此便出现了容器编排引擎。所谓编排,通常包括容器管理,调度,集群定义和服务发现等。通过容器编排引擎,容器被有机地组合成微服务应用,实现业务需求。目前的容器编排引擎包括docker自研的docker swarm,Google领导开发的容器编排引擎Kubernetes和mesos集群资源调度平台+marathon联合提供容器编排引擎功能;
  2. 容器管理平台:容器管理平台是架构在容器编排引擎之上更为通用的一个平台。通常容器管理平台能够支持多种编排引擎,抽象了编排引擎的底层实现细节,对用户更加友好。Rancher和ContainerShip是容器管理平台的典型代表;
  3. 基于容器的Paas:基于容器的Paas为微服务应用开发人员和公司提供了开发、部署和管理应用的平台,使用户不必关心底层基础设施而专注于应用的开发。Deis、Flynn和Doku都是开源容器Paas的代表;

容器支持技术

多容器集群的实现和健康运行,需要在网络,服务发现,日志监控等多方面技术上提供支持,这部分即为容器支持技术。容器支持技术,包括容器网络,服务发现,监控,数据管理,日志管理和安全性等方面:

  1. 容器网络:多容器集群的网络,需要管理好容器与容器,容器与宿主机实体之间的连通性和隔离性,这需要专门的容器网络解决方案来进行管理。容器网络解决方案,目前常用的有docker原生的网络解决方案docker network,第三方开源解决方案flannel,weave和calico;
  2. 服务发现:以容器技术为基础的微服务架构,最大的一个特点就是动态变化,能根据外界负载大小自动创建新的容器或者销毁旧的容器,不同host上的容器也能根据不同host的负载情况在host之间进行迁移。这种动态的环境需要一种机制来快速发现服务对应的容器的变化并保存该容器集群中所有微服务的最新消息,比如IP和端口等,并对外提供哦你API和服务,这就是服务发现。目前常用的服务发现的解决方案包括etcd,consul和zookeeper;
  3. 监控:容器集群的动态特性对监控提出了更高的要求与挑战,除了docker原生的命令行工具之外,sysdig、cAdvisor/Heapster和Weave Scope也是常用的第三方开源的容器监控方案;
  4. 数据管理:容器集群中的容器经常会在不同的host之间迁移,如何保证持久化数据也能够动态迁移,是Rex-Ray这类数据管理工具提供的能力;

docker-machine多主机管理工具的安装与使用

通过docker-machine来安装多主机docker

单主机下docker的安装与配置相对来说比较简单(相比较openstack需要用多篇博文来讲解各个组件的配置来说…),这里不再作介绍。我们接下来介绍一种能够在多主机上安装配置docker的工具——docker machine,用docker machine可以批量安装和配置docker host。我们的实验环境为一台安装了linux系统的宿主机192.168.1.102,两台运行在virtualbox中的虚拟机192.168.1.104和192.168.1.105,系统均为ubuntu16。首先要配置宿主机在root账号下免密码ssh登录两台虚拟机,具体方法可参考我之前写的博文https://blog.csdn.net/weixin_41977332/article/details/104130967。之后在宿主机上安装docker-machine,官方安装文档在https://docs.docker.com/machine/install-machine/,主要是在root用户下执行如下命令

base=https://github.com/docker/machine/releases/download/v0.16.0 &&
  curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&
  sudo mv /tmp/docker-machine /usr/local/bin/docker-machine &&
  chmod +x /usr/local/bin/docker-machine

执行完安装命令后,若在命令行执行docker-machine version能够显示docker-machine的版本,证明docker-machine安装成功。
对于docker machine来说,术语Machine就是运行docker daemon的主机,创建Machine就是在host上安装和部署docker,以在虚拟机192.168.1.104上部署docker为例,在该虚拟机上创建host1的命令如下:

docker-machine create --driver generic --generic-ip-address=192.168.1.104 --engine-registry-mirror http://XXXXX.m.daocloud.io host1

其中–driver部分的参数,因为我们要在linux系统中安装docker,所以使用generic driver,其他的driver可参考https://docs.docker.com/machine/drivers/。–engine-registry-mirror为配置国内加速镜像,因为在国内的网络环境中可能会因为网络问题导致安装失败,所以需要去daocloud.io网站上注册一个用户,然后获取加速镜像网址。
如果安装成功的话,在安装了docker-machine的宿主机上执行docker-machine ls 命令,能够显示host相关的信息,如下所示:
在这里插入图片描述

bash completion script配置

如果我们需要在宿主机上登录host1,可以通过如下命令来进行访问

docker-machine env host1

会显示如下内容

export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.1.104:2376"
export DOCKER_CERT_PATH="/root/.docker/machine/machines/host1"
export DOCKER_MACHINE_NAME="host1"
# Run this command to configure your shell: 
# eval $(docker-machine env host1)

所以接下来执行eval $(docker-machine env host1)即可进入host1环境
在这里插入图片描述注意,在未配置bash completion script之前,方括号内的host1是不会显示的,此时很难判断是否进入host1环境中,因此需要配置bash completion script,其步骤如下:
首先下载三个脚本

git clone https://github.com/docker/machine/contrib/completion/bash

将三个脚本放到/etc/bash_completion.d中
将如下代码添加到~/.bashrc中

PS1='[\u@\h \W$(__docker_machine_ps1)]\$ '
source /etc/bash_completion.d/docker-machine-wrapper.bash
source /etc/bash_completion.d/docker-machine-prompt.bash
source /etc/bash_completion.d/docker-machine.bash

退出root用户exit,重新登录su后,通过docker-machine登录host1即能显示如上内容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章