容器介绍

时间:Nov. 28, 2018 分类:

目录:

容器的核心介绍

容器规范

容器不光是Docker,还有其他容器,比如CoreOS的rkt。为了保证容器生态的健康发展,保证不同容器之间能够兼容,包含Docker、CoreOS、Google在内的若干公司共同成立了一个叫 Open Container Initiative(OCI) 的组织,其目是制定开放的容器规范。

目前 OCI 发布了两个规范:runtime specimage format spec

有了这两个规范,不同组织和厂商开发的容器能够在不同的runtime上运行。这样就保证了容器的可移植性和互操作性。

容器runtime

runtime是容器真正运行的地方。runtime需要跟操作系统kernel紧密协作,为容器提供运行环境

  • lxc 是Linux上老牌的容器runtime。Docker最初也是用lxc作为runtime。
  • runc 是Docker自己开发的容器runtime,符合oci规范,也是现在Docker的默认runtime。
  • rkt 是CoreOS开发的容器runtime,符合oci规范,因而能够运行Docker的容器。

三者对应的管理工具为lxddocker clientrkt cli

容器定义工具

  • docker image docker容器的模板,runtime依据docker image创建容器
  • dockerfile 包含若干命令的文本文件,可以通过这些命令创建出docker image

容器仓库

  • 私有的Registry harbor
  • 公有的Registry Docker Hub(https://hub.docker.com)等

容器操作系统

由于runtime,几乎所有系统都能运行容器,只不过容器OS体积更小,启动更快,运行容器效率更高

容器编排引擎介绍

基于容器的应用一般会采用微服务架构。

在这种架构下,应用被划分为不同的组件,并以服务的形式运行在各自的容器中,通过 API 对外提供服务。为了保证应用的高可用,每个组件都可能会运行多个相同的容器。这些容器会组成集群,集群中的容器会根据业务需要被动态地创建、迁移和销毁。

大家可以看到,这样一个基于微服务架构的应用系统实际上是一个动态的可伸缩的系统。这对我们的部署环境提出了新的要求,我们需要有一种高效的方法来管理容器集群。而这,就是容器编排引擎要干的工作。

所谓编排(orchestration),通常包括容器管理、调度、集群定义和服务发现等。通过容器编排引擎,容器被有机的组合成微服务应用,实现业务需求。

  • docker swarmDocker开发的容器编排引擎。
  • kubernetesGoogle领导开发的开源容器编排引擎,同时支持DockerCoreOS容器。
  • mesos是一个通用的集群资源调度平台,mesosmarathon一起提供容器编排引擎功能。

容器管理平台介绍

容器管理平台是架构在容器编排引擎之上的一个更为通用的平台。通常容器管理平台能够支持多种编排引擎,抽象了编排引擎的底层实现细节,为用户提供更方便的功能,比如application catalog和一键应用部署等。

  • Rancher
  • ContainerShip

基于容器的PaaS介绍

基于容器的 PaaS 为微服务应用开发人员和公司提供了开发、部署和管理应用的平台,使用户不必关心底层基础设施而专注于应用的开发。

Deis、Flynn 和 Dokku 都是开源容器 PaaS 的代表。

容器支持技术

容器网络

容器的出现使网络拓扑变得更加动态和复杂。用户需要专门的解决方案来管理容器与容器,容器与其他实体之间的连通性和隔离性。

docker network 是 Docker 原生的网络解决方案。除此之外,我们还可以采用第三方开源解决方案,例如 flannel、weave 和 calico。不同的方案设计和实现方式不同,各有优势和特定,我们可以根据实际需要来选型。

容器服务发现

动态变化是微服务应用的一大特点。当负载增加时,集群会自动创建新的容器;负载减小,多余的容器会被销毁。容器也会根据 host 的资源使用情况在不同 host 中迁移,容器的 IP 和端口也会随之发生变化。

在这种动态的环境下,必须要有一种机制让 client 能够知道如何访问容器提供的服务。这就是服务发现技术要完成的工作。

服务发现会保存容器集群中所有微服务最新的信息,比如 IP 和端口,并对外提供 API,提供服务查询功能。

etcd、consul 和 zookeeper 是服务发现的典型解决方案。

容器监控

监控对于基础架构非常重要,而容器的动态特征对监控提出更多挑战。

针对容器环境,已经涌现出很多监控工具和方案。

docker ps/top/stats 是 Docker 原生的命令行监控工具。除了命令行,Docker 也提供了 stats API,用户可以通过 HTTP 请求获取容器的状态信息。

sysdig、cAdvisor/Heapster 和 Weave Scope 是其他开源的容器监控方案。

容器数据管理

容器经常会在不同的 host 之间迁移,如何保证持久化数据也能够动态迁移,是 Flocker 这类数据管理工具提供的能力。

容器日志管理

日志为问题排查和事件管理提供了重要依据。

docker logs 是 Docker 原生的日志工具。而 logspout 对日志提供了路由功能,它可以收集不同容器的日志并转发给其他工具进行后处理。

容器安全性

对于年轻的容器,安全性一直是业界争论的焦点。

OpenSCAP 能够对容器镜像进行扫描,发现潜在的漏洞。

第一个容器

安装docker

$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install docker-ce
$ systemctl start docker

更多参考docker文档

启动容器

$ docker run -d -p 80:80 httpd ①
Unable to find image 'httpd:latest' locally ②
latest: Pulling from httpd  ③
0454203f6769: Pull complete 
97569d305060: Pull complete 
28a935a87300: Pull complete 
22883c0483ff: Pull complete 
5d7bfa79e59c: Pull complete 
4d8983b8d1db: Pull complete 
37e6becbe752: Pull complete 
0ae6d7b0b7e0: Pull complete 
6ca9d9cf3c14: Pull complete 
e2e41699dedd: Pull complete 
8b3302fcabd5: Pull complete 
2a86649a2932: Pull complete 
3cdcc299a714: Pull complete 
2681c6e0d961: Pull complete 
50045c5579eb: Pull complete 
Digest: sha256:29c08c75fcc3bdc8210d6fdabf9ad63f485071ca4519ad5a1a656cf9bc4b4c7b
Status: Downloaded newer image for httpd:latest ④
230db2a03d0af9fd9e9bf1e573033e04f9e522e4ccadb1f7fca7d38b2145cca3 ⑤
  1. 执行docker命令
  2. 监测本地是否有对应镜像
  3. Docker Hub下载httpd镜像
  4. 下载完成,镜像httpd被保存到本地
  5. 启动httpd容器,并将容器的80端口映射到host的80端口。

查看本地镜像

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               latest              2a51bb06dc8b        6 days ago          132MB

查看运行的容器

$ docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                NAMES
546121d483f9        httpd               "httpd-foreground"   30 minutes ago      Up 30 minutes       0.0.0.0:80->80/tcp   youthful_matsumoto

验证容器是否正常工作

$ curl 127.0.0.1:80
<html><body><h1>It works!</h1></body></html>

容器工作模式介绍

什么是容器?

容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。

无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。

容器与虚拟机

容器与虚拟机两者都是为应用提供封装和隔离。

不同之处是

  • 虚拟机是创建完整的机器,与其他操作系统隔离
  • 容器在主机用户空间运行,只不过进程之间是隔离的

容器包括应用程序本身和依赖两部分组成,对比虚拟机体积更小,启动容器不需要启动整个操作系统,所以容器部署和启动速度更快,开销更小,也更容易迁移

为什么需要容器?

容器使软件具备了超强的可移植能力。

特性

  • 打包对象 任何软件及其依赖
  • 硬件依赖 容器无需修改便可运行在几乎所有的平台上
  • 隔离性 资源、网络、库都是隔离的,不会出现依赖问题
  • 自动化 提供 run, start, stop 等标准化操作,非常适合自动化
  • 高效性 轻量级,能够快速启动和迁移
  • 职责分工 开发人员只需考虑怎么写代码;运维人员只需关心如何配置基础环境,消除了开发、测试、生产环境的不一致性

容器是如何工作的?

docker采用C/S架构,Client向Server发送请求,Server负责构建,运行和分发容器,Client和Server运行在一个机器,也可以通过socket或REST API进行远程通信

Client

可以直接通过dokcer命令进行操作

docker远程通信

查看一下系统读取的配置文件

$ systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2018-11-22 17:51:17 CST; 6s ago
     Docs: https://docs.docker.com
 Main PID: 11035 (dockerd)
    Tasks: 18
   Memory: 44.9M
   CGroup: /system.slice/docker.service
           ├─11035 /usr/bin/dockerd -H unix://
           └─11050 containerd --config /var/run/docker/containerd/containerd.toml --log-level info

修改/usr/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd -H unix://

可以看到默认为Unix套接字,这边可以调整为tcp连接

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0

重启服务

$ systemctl daemon-reload 
$ systemctl restart docker
$ ss -nlpt
State      Recv-Q Send-Q                                                                                          Local Address:Port                                                                                                         Peer Address:Port              
LISTEN     0      128                                                                                                         *:22                                                                                                                      *:*                   users:(("sshd",pid=1284,fd=3))
LISTEN     0      128                                                                                                        :::2375                                                                                                                   :::*                   users:(("dockerd",pid=11279,fd=5))

通过另一台进行查看,使用-H参数进行连接

$ docker -H 10.139.147.180 info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0

镜像

镜像可以包含一个系统也可以是一个应用

镜像的产生方式

  • 从无到有创建镜像
  • 使用别人的镜像
  • 在现有镜像上创建新的镜像

容器

Docker容器就是Docker镜像的运行实例。

用户可以通过Client或是API启动、停止、移动或删除容器。

仓库

  • docker pull 命令可以从Registry下载镜像。
  • docker run 命令则是先下载镜像(如果本地没有),然后再启动容器。