传统运维可能会遇到的问题

1、机器很多但是版本各异

  1. 1000服务器
  2. 700 CentOS
  3. 200 Ubuntu
  4. 100 Windows Server
  5. CentOS 7 CentOS 6 之间区别典型的:
  6. - CentOS 7 : systemctl start nginx
  7. - CentOS 6 : service nginx start
  8. 使用自动化运维工具(Ansible)来避免不同型号,不同版本导致的服务器之间的命令的不同。
  9. 安装Nginx时,需要配置HTTPS的时候,必须依赖于OpenSSL这个系统插件
  10. 自动化运维工具无法解决的问题?
  11. - 当系统不支持时,自动化运维工具无法解决。
  12. - 当大规模应用需要部署时,无法解决稳定运行的问题。

2、将编写好了的软件进行打包,如果需要运行的时候,直接运行安装包即可实现服务稳定运行。如果出现服务运行宕机等不稳定现象时,将自动重启直至服务稳定运行。

实现这一功能的软件有两个,打包的软件叫作:Docker;实现自动化部署和运行的软件叫作:kubernetes。

3、打包的过程叫作虚拟化。下面我们一起聊聊虚拟化的过程。

  • 20世纪90年代的时候,Linux操作系统中为了解决多进程之间的相互隔离的问题,创建出了一个systemd的虚拟化
  • 21世纪初,提出了操作系统软件虚拟化。
  • 21世纪10年代初,Google的一个科学家发布了一篇关于软件虚拟化的论文。
  • 2013年,有一个dotCloud公司,开发出了一款叫作Docker的虚拟化软件。
  • 2014年,Google公司推出了一款容器管理软件:kubernetes

至此,容器化可以落地并且实现规模化。

Docker简介

Docker可以说是一个依赖于Linux虚拟化的容器软件。它是由dotClound公司使用Golang语言在2013年初开发的。后来加入了Linux基金会,遵循Apache 2.0协议同时将源代码开源至GitHub上。

1、Docker与虚拟机之间的区别

特性 启动速度 性能 内存使用 运行密度 隔离性 迁移
容器 秒级 接近原生 MB级 单台机器可以运行上千个容器 进程级的隔离 非常便利
虚拟机 分钟级 接近原生 GB级 单台机器只支持几个 完全隔离 一般

容器中的数据无法永久保存,但是虚拟机中的数据可以永久保存。

2、安装部署Docker

  • 如果你之前安装过 docker,请先删掉
  1. sudo yum remove docker docker-common docker-selinux docker-engine
  • 安装一些依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 wget
  • 安装yum源
wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
  • 替换下载源
sudo sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
  • 安装Docker
sudo yum makecache fast
sudo yum install docker-ce
  • 启动Docker
[root@kubernetes ~]# systemctl enable --now docker
  • 测试安装情况
[root@kubernetes ~]# docker info
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)
  scan: Docker Scan (Docker Inc.)

Docker中的三大概念

在Docker中,有三个核心概念,分别是:镜像、容器以及仓库。

1、镜像

在Docker中,部署的所有的应用都必须打包成一个镜像。也就是说镜像就是我们将软件打包之后的安装包。

2、容器

容器是镜像运行之后的一个实例。实质上,容器就是一个进程。

3、仓库

仓库是用来存放镜像的地方。

Docker镜像

在Docker中,部署的所有的应用都必须打包成一个镜像。也就是说镜像就是我们将软件打包之后的安装包。

1、获取Docker镜像

docker镜像的来源,分别是:

下载镜像的格式:docker pull [仓库URL]/[名称空间]/仓库名称:版本号

  • 查询默认的仓库名称

    [root@kubernetes ~]# docker info
    # 默认的仓库URL
    Registry: https://index.docker.io/v1/
    
  • 默认的名称空间:library

  • 默认的版本号:latest

案例:在阿里云上下载docker镜像

docker pull registry.cn-hangzhou.aliyuncs.com/k8stes/kube-proxy:v1.18.8

2、查看本机下载的镜像

  • 命令:docker images 或者 docker image ls

3、搜索镜像

  • 命令:docker search [镜像名称]

    [root@kubernetes ~]# docker search nginx
    NAME                                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
    nginx                                             Official build of Nginx.                        16478     [OK]
    bitnami/nginx                                     Bitnami nginx Docker Image                      120                  [OK]
    
  • NAME:镜像名称

  • DESCRIPTION:简介
  • STARS:收藏(点赞)的个数
  • OFFICIAL:是否是官方构建的镜像
  • AUTOMATED:是否是自构建的镜像

参数:

  • —limit : 指定每次搜索显示的行数

    [root@kubernetes ~]# docker search nginx --limit=2
    NAME            DESCRIPTION                  STARS     OFFICIAL   AUTOMATED
    nginx           Official build of Nginx.     16478     [OK]
    bitnami/nginx   Bitnami nginx Docker Image   120                  [OK]
    
  • -f : 过滤

    [root@kubernetes ~]# docker search nginx --limit=2 -f is-official=true
    NAME      DESCRIPTION                STARS     OFFICIAL   AUTOMATED
    nginx     Official build of Nginx.   16478     [OK]
    
  • —no-trunc:不截断输出

    [root@kubernetes ~]# docker search nginx --no-trunc
    

4、为镜像添加tag

# 格式:docker tag [原名称] 新名称
[root@kubernetes ~]# docker tag 605c77e624dd registry.cn-hangzhou.aliyuncs.com/k8stes/nginx:latest

5、上传镜像到仓库

  • 登录仓库 ```bash 格式:docker login [仓库的URL] 默认登录的是官方仓库URL

[root@kubernetes ~]# docker login Login with your Docker ID to push and pull images from Docker Hub. If you don’t have a Docker ID, head over to https://hub.docker.com to create one. Username: alvinos Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded


- 上传至仓库
```bash
格式:docker push [镜像名称]
[root@kubernetes ~]# docker push registry.cn-hangzhou.aliyuncs.com/k8stes/nginx:latest
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/k8stes/nginx]
d874fd2bc83b: Pushed
32ce5f6a5106: Pushed
f1db227348d0: Pushed
b8d6e692a25e: Pushed
e379e8aedd4d: Pushed
2edcec3590a4: Pushed
latest: digest: sha256:c4c20a2fa2aaa7ede3 size: 1570

6、镜像详情

查询镜像更多的详细信息。

[root@kubernetes ~]# docker inspect 605c77e624dd
[root@kubernetes ~]# docker inspect -f '{{ .DockerVersion }}'  605c77e624dd
20.10.7
[root@kubernetes ~]# docker inspect -f '{{ .ContainerConfig.Hostname }}'  605c77e624dd
ca3e48389f71

7、镜像的历史

查看镜像构建的历史。

[root@kubernetes ~]# docker history 605c77e624dd

8、删除和清理镜像

  • 删除镜像

    注意:如果镜像有多个TAG,docker rmi删除的就是tag;如果没有了tag,才会删除docker镜像。

[root@kubernetes ~]# docker rmi test:v2
Untagged: test:v2
  • 清理镜像

    将当前电脑中,所有的未被使用过的镜像全部删除。

[root@kubernetes ~]# docker image prune -a

9、构建镜像
10、保存镜像

Docker 容器

镜像运行起来对外提供服务的一个实例。

1、创建容器

  • 语法:docker run [参数] [镜像] [启动命令]

案例:创建一个CentOS容器。

[root@kubernetes ~]# docker run centos bash

注意:容器内必须至少有一个进程运行在前台。

参数

1、-d : docker容器以守护进程的方式运行

docker容器内部的进程需要运行在docker内部的前台,docker容器默认运行在命令行窗口的前台

2、端口映射

  • -p:指定端口映射

    # 指定一个宿主主机的端口,来代理容器内部的端口。
    [root@kubernetes ~]# docker run -d -p 30080:80 nginx
    
  • -P:随机端口映射

    # 随机分配一个宿主主机的端口,用来代理容器的端口
    [root@kubernetes ~]# docker run -d -P nginx
    

3、容器生命周期一旦结束,立即删除容器

[root@kubernetes ~]# docker run --rm -d centos sleep 11

4、设置容器的名称

1、设置容器的名称 2、将容器的名称解析至容器DNS上

[root@kubernetes ~]# docker run -d --name test  nginx
b39f7dbb596a8d386d77ec838a10286b70d74bf6b1a993431b6d992c36027f9d
[root@kubernetes ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                     NAMES
b39f7dbb596a   nginx          "/docker-entrypoint.…"   1 second ago     Up 1 second     80/tcp                                    test

5、目录挂载

Docker容器是无法永久保存数据的,一旦容器被删除,则里面的数据就会全部删掉。

将docker容器内部的数据保存在宿主主机中。

docker run -d -P -v /root/teszt/:/usr/share/nginx/html/ nginx

6、分配终端

  • -i : 打开输出
  • -t : 分配终端
    [root@kubernetes teszt]# docker run -i -t centos bash
    

7、设置容器内部的环境变量

[root@kubernetes teszt]# docker run -e NAME=CentOS centos printenv
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=496092fe086d
NAME=CentOS
HOME=/root

8、关于网络的参数

  • —network
  • —link

案例:启动一个Nginx容器

docker run -d --name nginx-test -P -v /root/nginx-test:/usr/share/nginx/html -e Name=Nginx-test  nginx

2、查看容器

查询操作系统中,运行过的容器。

  • 格式:docker ps
  • 参数

    • -a : 查看所有的容器。
      [root@kubernetes ~]# docker ps -a
      CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS                      PORTS     NAMES
      9b119a6b1032   centos         "bash"                   2 minutes ago   Exited (0) 2 minutes ago              angry_dhawan
      
  • CONTAINER ID : 容器ID

  • IMAGE:镜像命令
  • COMMAND:运行的命令
  • CREATED:创建的时间
  • STATUS:启动状态
    • UP:正常启动
    • DOWN:正常关闭
    • Exited:启动失败
  • PORTS:启动的端口
  • NAMES:容器的名称

3、查看docker容器的日志

  • 语法:docker log [容器的名称]
  • 参数:
    • -f : 实时打印日志

4、开启/停止容器

  • 开启:docker start [容器名称]
  • 停止:docker stop [容器名称]

    [root@kubernetes ~]# docker start exciting_meninsky
    [root@kubernetes ~]# docker stop exciting_meninsky
    

    5、查看容器详细信息

  • 语法:docker inspect [容器名称]

    [root@kubernetes ~]# docker inspect jovial_cori
    

    6、删除容器

    将容器在宿主主机中删除。

  • 语法:docker rm [容器名称]

  • 参数

    • -f : 强制删除
      [root@kubernetes ~]# docker rm -f exciting_meninsky
      exciting_meninsky
      

      7、保存容器和镜像

  • 保存容器为镜像

    将正在运行的容器保存为镜像。

    • 语法:docker commit [容器名称] [镜像名称]
    • 参数:
      • -a : 指定作者
      • -c :修改的列表
      • -m :提交信息
      • -p :暂停容器
        [root@kubernetes ~]# docker commit jovial_cori test:v1
        sha256:e9a3491205940b0f390461086bffb7bf08da497b327ce0d67c0462cfc89f452f
        [root@kubernetes ~]# docker images
        REPOSITORY                                                        TAG       IMAGE ID       CREATED         SIZE
        test                                                              v1        e9a349120594   5 seconds ago   141MB
        
  • 导出容器为镜像

    将正在运行的容器,导出为一个镜像压缩包。

    • 导出:docker export

      [root@kubernetes teszt]# docker export -o nginx.tar jovial_cori
      [root@kubernetes teszt]# ll
      总用量 140660
      -rw------- 1 root root 144025600 3月  18 11:00 nginx.tar
      
    • 导入:docker import

      [root@kubernetes teszt]# docker import -m '测试导出' ./nginx.tar test:v2
      sha256:ac7290ff39286ffbc88a23b520d634851f017c71bad4ab53985f95bd1f73e750
      [root@kubernetes teszt]# docker images
      REPOSITORY                                                        TAG       IMAGE ID       CREATED         SIZE
      test                                                              v2        ac7290ff3928   6 seconds ago   140MB
      
  • 导出镜像

    将宿主主机中的镜像导出为镜像压缩包。

    • 导出镜像

      [root@kubernetes teszt]# docker save -o centos.tar centos:latest
      
    • 导入镜像

      [root@kubernetes teszt]# docker load -i centos.tar
      Loaded image: centos:latest
      [root@kubernetes teszt]# docker images
      REPOSITORY                                                        TAG       IMAGE ID       CREATED          SIZE
      centos                                                            latest    8becc16f3db7   4 months ago     204MB
      

      8、进入容器

      有的时候,需要进入容器对应用程序进行修改。

  • attach ```bash

    早期,docker进入容器的方式。

    它主要是建立一个进程管道,链接上容器中的PID为1的这个进程。

    [root@kubernetes ~]# docker attach jovial_cori

注意:attach有一个缺点

一旦,attach退出,容器也就跟着退出了。


- exec
```bash
# 主要用来在宿主主机中执行容器内的命令的。
[root@kubernetes ~]# docker exec -it relaxed_swirles bash
  • nsenter
    # 主要是建立一个进程管道,并且在容器中新建一个bash进程。
    [root@kubernetes ~]# nsenter --target $(docker inspect -f '{{ .State.Pid }}' relaxed_swirles) --mount --uts --ipc --net --pid
    root@6e753b656281:/#
    

9、容器复制文件

将容器内的文件复制到宿主主机中,或者将宿主主机中的文件复制到容器中。

  • 将容器内的文件复制到宿主主机中

    • 语法: docker cp [容器名称]:文件路径 宿主主机中的路径
      [root@kubernetes ~]# docker cp nervous_murdock:/root/openvpn-user-crt.sh /opt/
      
  • 将宿主主机中的文件复制到容器中

    • 语法:docker cp 宿主主机中的路径 [容器名称]:文件路径
      [root@kubernetes ~]# docker cp ./openvpn-user-crt.sh nervous_murdock:/root/
      

案例:利用容器将web服务部署出来

1、安装Python和Django
[root@kubernetes django]# yum install python3
[root@kubernetes django]# pip3 install django==2.2.1 -i https://pypi.tuna.tsinghua.edu.cn/simple/

2、生成代码
[root@kubernetes django]# django-admin startproject linux
[root@kubernetes django]# cd linux/
[root@kubernetes linux]# django-admin startapp application

3、启动容器
[root@kubernetes linux]# docker run -d -v /root/django/linux/:/opt -p 8080:8080 -it python:3.6 bash

4、在容器内安装Django

[root@kubernetes linux]# docker exec -it musing_tharp bash
root@dc3d430ad62c:/opt# pip install django==2.2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple/
root@dc3d430ad62c:/opt# python manage.py runserver 0.0.0.0:8080