1. 容器生态介绍
基本概念
说到容器技术,大家都想到docker,可能认为容器就是docker,docker也是容器。其实,docker仅仅是一种容器的引擎。除了docker以外,还有CoreOS的RKT,还有linux的容器技术LXC等。而docker是这些容器引擎技术中最为成熟的技术。当我们谈到容器,不得不说的是虚拟机,例如:VMware,VirtualBox等,虚拟机是基于硬件的虚拟化技术,会完全虚拟出一整套的物理主机,包括CPU、内存、磁盘、网卡等硬件设施,呈现的是一种物理主机的特性。架构图如左边所示。而对于容器技术,是一种基于操作系统的虚拟化技术,运行在操作系统之上的用户空间,容器提供是一种进程级别的隔离,让每个容器都像运行在单独的系统之上,但是又能共享很多的底层资源。
docker最核心的三个概念
镜像,容器,仓库
docker的网络
一个宿主机上可以运行成百上千个容器,当多个宿主机组成容器的集群时,开发者就需要考虑容器之间以及容器与其他实体之间的连通性以及隔离性的问题。docker network 是docker原生的解决方案。
主要有三种网络模式:
1.host 模式
docker 底层采用的是linux的Namespace技术来进行资源的隔离技术,其中Network Namespace隔离的是网络。一个Network Namespace隔离的是一个独立的网络环境,包括网络、路由等资源,而采用host模式并不是使用独立的Network Namespace,而是和宿主机共用一个Network Namespace,使用的是相同的IP和端口。
2.bridge 模式
桥接模式下,会把docker容器挂载在一个虚拟网桥上,docker会给每个容器配置自己的Network Namespace,设置IP地址。
3.none 网络
none网络就是什么都没有的网络,挂载在这个网络下面的容器除了lo,没有其它任何网卡。
4.user-defined 模式
开发者可以根据业务需要自定义网络,docker提高三种自定义网络驱动,bridge、overlay和macvlan。
容器监控方案
一台宿主机上一般都可以运行成百上千台容器,而容器的动态性能是开发者所关心的,针对于少量的容器,可以采用docker的命令来监控性能,例如:docker ps /top/stats,除此之外还有 开源的工具比如:cAdvisor,第三方监控工具:data dog。
容器的编排技术
容器的编排包括容器管理、容器调度、容器集群定义和服务发现等,通过容器编排引擎,容器被有机地组合成微服务应用,实现业务的需求。
目前最常见的编排工具有:
1.docker原生的Swarm
swarm在多台docker主机上建立一层抽象,还提供宿主机资源的分配和管理。swarm的特性主要有:配置简单,去中心话设计思想,可伸缩服务,负载均衡,高可用等特性。
2.google开源的Kubernetes
kubernetes是一个管理跨主机容器化应用的系统,实现了应用部署,高可用管理和服务伸缩在内的一系列基础功能并封装成简单易用的RESTful API 对外提供服务。
3.是Apache开源的集群资源调度平台mesos
docker容器基本命令
安装 docker 在线安装
centos yum install docker
ubuntu apt-get install docker
windows 安装 boot2docker
boot2docker是一个极小的虚拟机,它在 windows宿主机上安装一个原生的命令行工具,并提供一个 docker环境。
离线安装
wget https://yum.dockerproject.org/repo/main/centos/7/Packages/docker-engine-1.12.6-1.el7.centos.x86_64.rpm wget https://yum.dockerproject.org/repo/main/centos/7/Packages/docker-engine-selinux-1.12.6-1.el7.centos.noarch.rpm yum localinstall -y docker-engine*
查看安装的版本
docker --version docker info
所有的程序都是从hello world开始的。
镜像的命令
docker search image:tag docker pull image:tag docker search hello-world docker pull hello-world docker run hello-world docker pull centos docker run -it -d --name test-centos centos /bin/bash -i:以交互式模式运行容器 -t :为容器分配一个伪终端 --name: 为容器指定一个名称 /bin/bash 这是表示载入容器后运行bash ,docker中必须要保持一个进程的运行,要不然整个容器就会退出。 docker ps docker exec -it <id/name> ls mkdir test
退出容器 crtl +p+q
ls / 发现没有创建的文件夹,这就可以验证 centos的容器是一个隔离的环境。
在这个容器中环境是和宿主机是隔离的,我们就可以做一些安装软件,运行程序的操作。比如,我们使用python环境,想装一个 python2以及python3的环境,就可以采用 docker。
docker pull python 2.7 docker pull python 3.5 docker run -it --name python2 python:2.5 /bin/bash docker run -it --name python3 python:3.5 /bin/bash
这样就比较容易的实现了环境的隔离。
Namespce做环境隔离
网络隔离
docker inspect <container>
uts隔离机制
docker run -it --name test-centos-1 --hostname centos /bin/bash
除此之外还有:IPC隔离,PID隔离等。
资源限制
Cgroup
Linux Cgroup 可让您为系统中所运行任务(进程)的用户定义组群分配资源 — 比如 CPU 时间、系统内存、网络带宽或者这些资源的组合 。
默认情况下,所有的容器可以平等地使用 host CPU资源并且没有限制,通过 -c可以限制容器使用 CPU的权重,不指定则默认是1024. -m 设置内存的使用限制。
docker run -it --name test-centos-2 -c 1024 -m 200m centos docker run -it --name test-centos-3 -c 512 -m 200m centos
当两个容器容器都需要 CPU资源时,test-centos-2 是 3的两倍。
docker stop container docker rm container docker rmi image:tag docker exec docker attach
端口映射与挂载
docker run -it -v /code:/code python:2.7 python /code/hello.py docker run -it -d -p 3306:3306 -v /code/data:/var/lib/mysql -e MYSQL_PASS="my_pass" mysql:5.7 docker run -it -d -p:2080:80 -v /code/nginx:/usr/share/nginx/html --name test-nginx nginx
使用容器的一些经验:
一个容器中只运行一个进程。
容器故障退出时候,可以通过查看日志,排查错误。
docker logs [options] container
创建容器的时候,一定要通过挂载做持久化,防止容器被误删除后,重要数据丢失。做了持久化后,即使容器被删除了,挂载在宿主机的数据还会存在。
交流的问题:
介绍下 云计算提供的三种服务?
云计算提供的三种服务分别是:
IAAS:基础设施即服务,举个例子:阿里云服务器,金山云服务器,亚马逊云服务器,这个底层都是对集群的虚拟化,提供是虚拟机。而PAAS:平台即服务,提供的是一些mysql服务,kafka的服务,使用 docker实现的。saas:软件即服务,我们不需要在本地安装各种软件,只需要打开浏览器注册账号,就可以使用各种软件,比如QQ,Word等。
容器 host模式下,启动一个nginx,是不是直接是 宿主机的ip+port?
是的,host模式下,主机和容器共享一个网段,容器不会使用 namespace空间。