# 云原生技术

# 云原生

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

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

云原生元素如下图:

img

# 微服务

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

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

# DevOps

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

# 持续交付

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

# 容器化

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

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

# 云原生之k8s

k8s基础详解 (opens new window)

# Docker

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

# Docker应用场景

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

# Docker的架构

img

# 优势分析

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

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

与虚拟机比较

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

官网文档: https://docs.docker.com (opens new window)

镜像

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

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

docker pull lorisleiva/laravel-docker
1

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

docker pull hello-world
1

容器

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

仓库

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

# CENTOS

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

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

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

# 初始环境

  1. 卸载旧版本

    sudo yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-engine
    
    1
    2
    3
    4
    5
    6
    7
    8
  2. 安装工具包

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

    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
    2
    3
    4
    5
    6
    7

# 安装软件

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

    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
    
    1
  2. 安装最新版本 DOCKER

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

    docker -v
    
    1
  4. 启动 DOCKER

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

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

    sudo docker run hello-world
    
    1

# UBUNTU

# 环境配置

  1. 删除旧版本

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

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

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

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

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

    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]
    
    1
    2
    3
    4
    5
    6
  5. 添加软件源

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

    sudo apt-get update
    
    1

某些系统更新失败

当执行 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,或者转到下一步安装特定版本:

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

    sudo docker run hello-world
    
    1

# 进程维护

  1. 停止、启动、重启 docker

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

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

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

    sudo systemctl list-unit-files | grep docker
    
    1

# 维护升级

升级

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

卸载

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

# 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组。

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

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

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

    docker images
    
    1

# 镜像加速

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

# LINUX

  1. 修改配置文件

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

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

    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
    1
    2

# MAC

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

http://f1361db2.m.daocloud.io
或
http://hub-mirror.c.163.com
1
2
3

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

Docker Toolbox 等配置方法请参考帮助文档 (opens new window)

# WINDOWS

Docker For Windows

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

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

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

# 镜像管理

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

# 搜索镜像

docker search ubuntu
1

# 安装镜像

使用 pull 可以从仓库 (opens new window)下载镜像

docker pull lorisleiva/laravel-docker
1

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

docker pull hello-world
1

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

docker run hello-world
1

# 查看镜像

docker images
1

# 删除镜像

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

docker rmi -f ubuntu:latest
1

批量删除镜像

docker rmi -f `docker images -q`
1

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

docker rmi -f ubuntu
1

删除所有无用镜像

docker image prune -a
1

# 容器管理

# 启动停止

以守护进程启动容器

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

通过-name 设置容器名 hd

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

容器停止运行后自动删除

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

停止容器

docker stop 3c5e00452777
1

批量停止所有容器

docker stop `docker ps -q`
1

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

docker kill 3c5e00452777
1

启动停止的容器

docker start 3c5e00452777
1

# 查看容器

查看运行的容器

docker ps
1

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

docker ps -a
1

查看容器进程

docker top ubuntu
1

查看容器端口映射

docker port xx
1

查看容器元信息(如 IP)

docker inspect xx
1

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

docker logs xx
1

过滤显示信息

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

# 删除容器

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

docker rm hdcms
1

强制删除指定容器

docker rm -f hdcms
1

批量删除容器

docker rm  -f  `docker ps -aq`
1

清理所有停止运行的容器

docker container prune
## or
docker rm $(docker ps -aq)
1
2
3

清理所有无用数据卷

docker volume prune
1

# 登录容器

docker exec -it 3c5e00452777 /bin/bash
1

# 常用命令

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

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

查看窗器内存等使用状况

docker stats houdunren-php houdunren-nginx
1

运行结果如下

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
1
2
3

# 数据卷

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

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

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

删除无用数据卷

docker volume prune
1

# 防火墙

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

sudo systemctl stop firewalld.service
1

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

sudo systemctl disable firewalld.service
1

查看防火墙状态

sudo systemctl status firewalld.service
1

关闭 setlinux

  1. 修改配置文件

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

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

    setenforce 0
    
    1