Skip to content

云原生技术

云原生

云原生是面向云应用设计的一种全新架构理念,是充分发挥云效能的最佳实践路径,可以帮助企业构建弹性可靠、松耦合、易管理可观测的应用系统,提升关键应用的交付效率,降低系统的运维复杂度。

云原生”顾名思义,就是“生在云上、长在云上”。 云原生是一种以云计算技术为基础,利用容器、微服务、DevOps 和自动化等技术实现敏捷开发、快速部署的应用程序架构,这就是云原生。 云原生是面向“云”而设计的应用,因此技术部分依赖于传统云计算的 3 层概念,基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服务(SaaS)。 img

云原生元素如下图:

img

微服务

微服务解决的是我们软件开发中一直追求的低耦合+高内聚,记得有一次我们系统的接口出了问题,结果影响了用户的前台操作,于是黎叔拍案而起,灵魂发问:“为啥这两个会互相影响?!”

微服务可以解决这个问题,微服务的本质是把一块大饼分成若干块低耦合的小饼,比如一块小饼专门负责接收外部的数据,一块小饼专门负责响应前台的操作,小饼可以进一步拆分,比如负责接收外部数据的小饼可以继续分成多块负责接收不同类型数据的小饼,这样每个小饼出问题了,其它小饼还能正常对外提供服务。

DevOps

DevOps 的意思就是开发和运维不再是分开的两个团队,而是你中有我,我中有你的一个团队。我们现在开发和运维已经是一个团队了,但是运维方面的知识和经验还需要持续提高。

持续交付

持续交付的意思就是在不影响用户使用服务的前提下频繁把新功能发布给用户使用,要做到这点非常非常难。我们现在两周一个版本,每次上线之后都会给不同的用户造成不同程度的影响。

容器化

容器化的好处在于运维的时候不需要再关心每个服务所使用的技术栈了,每个服务都被无差别地封装在容器里,可以被无差别地管理和维护,现在比较流行的工具是 docker 和 k8s。

所以你也可以简单地把云原生理解为:云原生 = 微服务 + DevOps + 持续交付 + 容器化

云原生之k8s

k8s基础详解

Docker

Docker 是一个开源的应用容器引擎,基于Go 语言并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。

Docker应用场景

  • Web 应用的自动化打包和发布。
  • 自动化测试和持续集成、发布。
  • 在服务型环境中部署和调整数据库或其他的后台应用。
  • 解决软件跨境迁移的问题

Docker的架构

img

优势分析

应用应该脱离底层硬件的限制,在任何时间与地点可以获取 ,Docker 就是基于此思想 ,可以快速分发与部署。

有了 docker 可以轻松将网站在不同操作系统,不同云服务器中迁移。只要把容器打包,就可以轻松部署。不需要像过去一样,重复安装 mysql/php/apache....。

与虚拟机比较

  • 使用内核虚拟化技术速度更快
  • 系统资源占用少,一台主机上可以同时运行数千个 Docker 容器。
  • 起动速度秒级,而虚拟机分钟级
  • 硬盘占用更少,虚拟机是完整系统占用往往达到 G 级

官网文档: https://docs.docker.com

镜像

镜像类似于虚拟机中的镜像,镜像是只读的,可以方便的从网上下载镜像,类似面向对象编程中的类。仓库 中已经存在非常多的镜像,我们可以直接下载使用,后期向军大叔也会教大家自己开发镜像。

镜像是以 组织/镜像 的结构保存在 仓库 中,如 lorisleiva/laravel-docker,安装的时候要使用这个镜像名安装

text
docker pull lorisleiva/laravel-docker

但官方组织中的镜像可以省略组织名,如 hello-world 是官方镜像可以简写

text
docker pull hello-world

容器

容器是从镜像创建的运行对象,也是我们最终应用的场所。可以启动/删除/停止,容器间都是相互独立的,类似面向对象编程中的对象。

仓库

类型于管理镜像的 GITHUB,可以将镜像提交到仓库,供其他用户或其他平台轻松使用。

CENTOS

下面介绍在 CENTOS 中安装 DOCKER 环境,也可以查看官方文档 进行安装。

  1. 建议选择次版本,最新版本可能出现软件不兼容问题
  2. 以下命令如果使用 root 执行,就不需要使用 sudo 了

后缀章节的使用主要在 CENTOS 7 中完成建议使用一样的系统,系统安装课程已经在后盾人 发布

初始环境

  1. 卸载旧版本

    text
    sudo yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-engine
  2. 安装工具包

    text
    sudo yum install -y yum-utils \
      device-mapper-persistent-data \
      lvm2
  3. 添加软件仓库

    text
    sudo yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo
    
    sudo yum-config-manager --enable docker-ce-nightly
    sudo yum-config-manager --enable docker-ce-test
    sudo yum-config-manager --disable docker-ce-nightly

安装软件

  1. 默认源里的containerd.io版本太低,需要安装最新版本

    text
    sudo yum -y install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
  2. 安装最新版本 DOCKER

    text
    sudo dnf install -y docker-ce docker-ce-cli containerd.io
  3. 查看是否安装成功

    text
    docker -v
  4. 启动 DOCKER

    text
    sudo systemctl start docker
  5. 将 docker 加入系统启动服务,使其开机自动运行

    text
    sudo systemctl enable docker
  6. 通过运行hello-world 映像来验证安装,会下载镜像并在容器中运行

    text
    sudo docker run hello-world

UBUNTU

环境配置

  1. 删除旧版本

    text
    sudo apt-get remove docker docker-engine docker.io containerd runc
  2. 更新apt包索引:

    text
    sudo apt-get update
  3. 安装包以允许apt通过 HTTPS 使用存储库:

    text
    sudo apt-get install \
        apt-transport-https \
        ca-certificates \
        curl \
        gnupg-agent \
        software-properties-common
  4. 添加 Docker 的官方 GPG 密钥:

    text
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

    9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88通过搜索指纹的最后 8 个字符,验证您现在拥有带指纹的密钥 。

    text
    sudo apt-key fingerprint 0EBFCD88
    
    pub   rsa4096 2017-02-22 [SCEA]
          9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
    uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
    sub   rsa4096 2017-02-22 [S]
  5. 添加软件源

    text
    sudo add-apt-repository \
       "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
       $(lsb_release -cs) \
       stable"
  6. 更新apt包索引。

    text
    sudo apt-get update

某些系统更新失败

当执行 apt-get update 失败时,使用命令 sudo software-properties-gtk 在软件的 Other Software标签中将 https://download.docker.com/linux/ubuntu 源的distribution 值设置为 bionic,也可以直接修改 /etc/apt/source.lists 文件。

安装方法

  1. 安装最新版本的 Docker CE 和 containerd,或者转到下一步安装特定版本:

    text
    sudo apt-get install docker-ce docker-ce-cli containerd.io
  2. 通过运行hello-world 映像验证是否正确安装了 Docker CE 。

    text
    sudo docker run hello-world

进程维护

  1. 停止、启动、重启 docker

    text
    sudo systemctl start | stop | restart docker.service
  2. 查看 docker 版本

    text
    sudo docker version
  3. 加入开机自启

    text
    sudo systemctl enable docker
  4. 开机启动检测

    text
    sudo systemctl list-unit-files | grep docker

维护升级

升级

要升级 Docker CE,请先运行sudo apt-get update

卸载

text
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker docker.io
sudo rm -rf /var/lib/docker
sudo apt autoremove

MAC

安装软件

Docker Desktop for Mac

下载地址: https://hub.docker.com/?overlay=onboarding

Docker Toolbox 包括以下 Docker 工具:

  • Docker CLI 客户端,用于运行 Docker Engine 以创建映像和容器
  • Docker Machine,因此您可以从 Windows 终端运行 Docker Engine 命令
  • Docker Compose 用于运行docker-compose命令
  • Kitematic,Docker GUI
  • 为 Docker 命令行环境预配置的 Docker QuickStart shell
  • Oracle VM VirtualBox

帐号权限

每次运行 docker 都要使用 sudo,下面介绍使用当前登录帐号执行 docker 的方法 。

设置帐号

  1. 创建docker组。

    text
    sudo groupadd docker
  2. 将当前用户添加到该docker组。

    text
    sudo usermod -aG docker $USER
  3. 注销帐号并重新登录

  4. 验证您是否可以运行docker命令sudo

    text
    docker images

镜像加速

提升国内用户访问 Docker Hub 拉取镜像的速度及稳定性。

LINUX

  1. 修改配置文件

    text
    sudo vim /etc/docker/daemon.json
  2. 添加国内镜像

    text
    {
      "registry-mirrors": [
        "https://hub-mirror.c.163.com",
        "https://mirror.ccs.tencentyun.com",
        "https://docker.mirrors.ustc.edu.cn"
      ]
    }
  3. 更新镜像缓存

    text
    sudo systemctl daemon-reload
    sudo systemctl restart docker

MAC

右键点击桌面顶栏的 docker 图标,选择 Preferences ,在 Daemon 标签(Docker 17.03 之前版本为 Advanced 标签)下的 Registry mirrors 列表中加入下面的镜像地址:

text
http://f1361db2.m.daocloud.io

http://hub-mirror.c.163.com

点击 Apply & Restart 按钮使设置生效。

Docker Toolbox 等配置方法请参考帮助文档

WINDOWS

Docker For Windows

在桌面右下角状态栏中右键 docker 图标,修改在 Docker Daemon 标签页中的 json ,把下面的地址:

text
http://f1361db2.m.daocloud.io

加到" registry-mirrors"的数组里。点击 Apply 。

镜像管理

镜像是以 组织/镜像 的结构保存在 仓库 中,如 lorisleiva/laravel-docker,安装的时候要使用这个镜像名安装

搜索镜像

text
docker search ubuntu

安装镜像

使用 pull 可以从仓库 下载镜像

text
docker pull lorisleiva/laravel-docker

但官方组织中的镜像可以省略组织名,如 hello-world 是官方镜像可以简写

text
docker pull hello-world

使用 run 命令用来通过镜像生成容器,如果镜像不存在会从仓库下载,也就是具有 pull 功能

text
docker run hello-world

查看镜像

text
docker images

删除镜像

可以使用 name 或 tag 删除镜像,要保证没有容器使用该镜像。

text
docker rmi -f ubuntu:latest

批量删除镜像

text
docker rmi -f `docker images -q`

强制删除镜像,即便有容器引用该镜像

text
docker rmi -f ubuntu

删除所有无用镜像

text
docker image prune -a

容器管理

启动停止

以守护进程启动容器

text
docker run -tid ubuntu /bin/bash
## -i 表示允许我们对容器进行操作 -t 表示在新容器内指定一个为终端 -d 表示容器在后台执行

通过-name 设置容器名 hd

text
docker run -tid --name hd ubuntu /bin/bash

容器停止运行后自动删除

text
docker run -tid --rm --name hd ubuntu /bin/bash

停止容器

text
docker stop 3c5e00452777

批量停止所有容器

text
docker stop `docker ps -q`

kill 立刻停止容器,类似于直接关机

text
docker kill 3c5e00452777

启动停止的容器

text
docker start 3c5e00452777

查看容器

查看运行的容器

text
docker ps

查看所有容器,包括停止的容器

text
docker ps -a

查看容器进程

text
docker top ubuntu

查看容器端口映射

text
docker port xx

查看容器元信息(如 IP)

text
docker inspect xx

容器异常时通过查看日志分析

text
docker logs xx

过滤显示信息

text
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}"

删除容器

删除容器,如果在使用将无法删除

text
docker rm hdcms

强制删除指定容器

text
docker rm -f hdcms

批量删除容器

text
docker rm  -f  `docker ps -aq`

清理所有停止运行的容器

text
docker container prune
## or
docker rm $(docker ps -aq)

清理所有无用数据卷

text
docker volume prune

登录容器

text
docker exec -it 3c5e00452777 /bin/bash

常用命令

在宿主环境执行容器命令,下面是在 houdunren-php 容器中执行命令 php -v

text
docker exec -it houdunren-php /bin/bash -c 'php -v'

查看窗器内存等使用状况

text
docker stats houdunren-php houdunren-nginx

运行结果如下

text
CONTAINER ID   NAME              CPU %     MEM USAGE / LIMIT     MEM %     NET I/O       BLOCK I/O     PIDS
de32eaf31b74   houdunren-php     0.02%     7.434MiB / 1.941GiB   0.37%     1.01kB / 0B   1.68MB / 0B   3
122903daba2d   houdunren-nginx   0.00%     6.102MiB / 1.941GiB   0.31%     1.01kB / 0B   2.15MB / 0B   5

数据卷

数据卷是存在于一个或多个容器中的特定文件或文件夹,这个文件或文件夹以独立于 docker 文件系统的形式存在于宿主机中。数据卷的最大特定是:其生存周期独立于容器的生存周期

比如在多个容器共享数据时,多个容器会挂载一个数据卷,又或者使用 docker-compose 编排容器时自动定义的数据卷。

但随着 docker 的运行可能会出现很多无用的数据卷,造成磁盘空间占用过大,甚至达到 100%

删除无用数据卷

text
docker volume prune

防火墙

在学习阶段可以先关闭防火墙,保证端口不受访问限制,以下是 LINUX 管理防火墙的基本指令

text
sudo systemctl stop firewalld.service

练习时也可以永久关闭防火墙

text
sudo systemctl disable firewalld.service

查看防火墙状态

text
sudo systemctl status firewalld.service

关闭 setlinux

  1. 修改配置文件

    text
    sudo vim /etc/selinux/config
  2. 修改 SELINUX 值为 disabled,永久有效但需要重起系统

    text
    SELINUX=disabled
  3. 可以执行以下命令,立刻生效(建议和上面命令一起使用)

    text
    setenforce 0