大家好,欢迎来到IT知识分享网。
1、Docker
1.1、什么是容器
容器的英文是container,其实container还有集装箱的意思
- 物理机
- 一个或多个应用部署在同一台机器上
- 一个应用在部署之前需要先安装各种依赖环境,然后进行应用的部署
- 资源利用率低:传统的CPU、内存利用率都在15%左右
- 成本高:集群部署,需要多台物理机,每台物理机购买成本较高
- 不隔离:多个应用之间不隔离,共用CPU、内存等硬件资源,相互影响
- 有限的可伸缩性:迁移和扩展困难(都需要新的物理机,扩展新的物理机都需要安装各种依赖环境)
- 虚拟机
- 一台物理机安装多个虚拟机(VM),一个虚拟机部署一个或多个应用
Hypervisor
),可以将物理机的CPU、内存、硬盘等资源进行虚拟化,再通过虚拟化出来的空间上安装操作系统
-
- 虚拟机本身占用大量的资源,8G内存的虚拟机,应用可用的只有7G或更少
- 虚拟机硬件需要初始化,其本身也是一个操作系统,启动较为耗时
- 容器化
- 一台物理机安装多个容器实例(container),一个容器跑一个或多个应用
是一种将虚拟化带到操作系统级别的虚拟化。虚拟化为硬件带来了抽象,而容器化为操作系统带来了抽象。
只隔离应用程序的运行时环境但容器之间可以共享同一个操作系统(这里的运行时环境指的是程序运行依赖的必要的操作系统包、应用程序及配置,通常不包含完整的操作系统)
- 更加的轻量级且占用的资源更少,与操作系统相比,容器体积小
- 资源利用率高:容器之间可以共享资源,最大化资源的利用率
- 运行速度快:直接运行于宿主系统内核,容器里面的应用就是底层系统的一个进程,所以启动容器相当于直接运行本机的一个进程,而不是一个完整并臃肿的操作系统,自然就快很多
虚拟机和容器的区别?
1)速度:虚拟机启动时间比容器长的多,因为虚拟机硬件需要初始化,其本身也是一个操作系统,启动较为耗时;而容器是直接运行于宿主系统内核,容器里面的应用就是底层系统的一个进程,所以启动容器相当于直接运行本机的一个进程,而不是一个完整并臃肿的操作系统,自然就快很多;
2)资源:虚拟机最终是虚拟出了一台完整的计算机系统,其拥有底层的物理硬件、操作系统和应用程序执行的完整环境,都对硬件资源造成了一定的消耗,比较重量化,即使虚拟机不处理用户请求,虚拟机本身也会消耗内存,能应用可用资源就偏少;而容器更加轻量级且占用资源更少,容器之间可以共享资源,最大化资源的利用率;
3)安全性和隔离性:虚拟机是保持独立和相互隔离的;而容器只隔离应用程序的运行时环境但容器之间可以共享同一个操作系统,它是对进程的隔离;
4)可移植性和应用程序共享:虚拟机需要复制整个操作系统、主机内核、系统库、配置文件和任何必要的文件目录,在共享或转移时面临挑战;而容器镜像比虚拟机小得多,它们更容易转移,并节省主机文件系统的空间
1.2、什么是Docker
1.3、Docker基本概念
- 镜像(Image):Docker镜像(Image),就相当于是一个root文件系统。比如官方镜像ubuntu:16.04就包含了完整的一套Ubuntu16.04最小系统的root文件系统
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行的实体。容器可以被创建、启动、停止、删除、暂停等
- 仓库(Repository):用来保存镜像,集中存放镜像的地方。最大的公开仓库是 Docker Hub:https://hub.docker.com,存放了数量庞大的镜像供用户下载
1.4、Kubernetes
- 如何协调和调度这些容器?
- 如何在升级应用程序时不会中断服务?
- 如何监视应用程序的运行状况?
- 如何批量重新启动容器里的程序?
2、CI/CD
2.1、什么是CI/CD
2.2、GitLab CI/CD
stages:
- appstore-upgrade-package-prd
- appstore-upgrade-build-image-prd
# 自定义变量配置,实际项目中建议配置在项目GitLab-->Setting-->CI/CD-->Variables中
variables:
MICR_PROJECT: appstore # 项目名/工程名
REPO_NAMESPACE: appstore # MICR容器镜像平台的命名空间,其中保存镜像仓库,建议与
REPO_PASS: xxx
REPO_SERVER: xxx.cn
REPO_USER: yangyongjie
# 电视应用商店升级模块生产环境打包
appstore-upgrade-package-prd:
stage: appstore-upgrade-package-prd
image:
name: cr.d.xiaomi.net/containercloud/ubuntu-openjdk1.8-maven3.5:latest
script:
- mvn clean package -P prd -Dmaven.test.skip=true
artifacts:
paths:
- appstore-upgrade/target/appstore-upgrade-*.jar
after_script:
- echo "appstore-upgrade-package-prd completed"
only:
refs:
- master
changes:
- appstore-config/**/*
- appstore-common/**/*
- appstore-upgrade/**/*
- .gitlab-ci.yml
- pom.xml
# 电视应用商店升级模块生产环境镜像构建
appstore-upgrade-build-image-prd:
stage: appstore-upgrade-build-image-prd
image:
name: cr.d.xiaomi.net/containercloud/kaniko-executor-xiaomi:release
entrypoint: [ "" ]
script: # kanio Docker镜像构建工具
- APPSTORE_UPGRADE_IMAGE=$REPO_SERVER/$REPO_NAMESPACE/appstore-upgrade:prd-$CI_COMMIT_SHORT_SHA
- echo "{\"auths\":{\"$REPO_SERVER\":{\"username\":\"$REPO_USER\",\"password\":\"$REPO_PASS\"}}}" > /kaniko/.docker/config.json
- /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/appstore-upgrade/Dockerfile --destination $APPSTORE_UPGRADE_IMAGE --validate-image
after_script:
- echo "appstore-upgrade-build-image-prd completed"
only:
refs:
- master
changes:
- appstore-config/**/*
- appstore-common/**/*
- appstore-upgrade/**/*
- .gitlab-ci.yml
- pom.xml
retry: 2
- stages
- 用于定义包括作业(job)组的阶段。在作业中使用stage以将作业配置为在特定阶段运行
- stages定义了作业的执行顺序,下一阶段的作业在上一阶段的作业成功完成后运行
- variables
- 自定义CI/CD作业所需的变量
- 出了自定义变量外,还有预定义的CI/CD变量
-
CI_PROJECT_DIR:当前项目目录
-
CI_COMMIT_SHA:构建项目的提交修订号
-
CI_COMMIT_SHORT_SHA:CI_COMMIT_SHA的前8个字符
-
- 配置作业(job)的关键词
- stage:定义作业所属阶段
- image:指定作业运行的 Docker 镜像,CI/CD作业在此镜像中运行
- name:作业运行所在的 Docker 镜像的名称
- script:由运行程序执行的 Shell 脚本
- artifacts:artifacts,构件,job执行成功后保存到文件和目录列表,job作业完成后,构件将发送到GitLab,默认情况下,后期阶段的作业会自动下载早期阶段作业创建的所有构件
- path:路径是相对于项目目录 ($CI_PROJECT_DIR) 的,不能直接链接到项目目录之外
- after_script:定义在每个作业之后运行的命令数组,包括失败的作业
- only:控制何时执行job作业
- refs:分支名称
- changes:哪些文件有变动
.gitlab-ci.yml详细配置说明:https://docs.gitlab.com/ee/ci/yaml/index.html#default
预定义变量说明:https://docs.gitlab.com/ee/ci/variables/predefined_variables.html
#指定了运行容器的镜像并把生成程序文件拷贝到镜像根目录用以运行
FROM xxx/openjdk:8-jre-alpine
ENV TZ "Asia/Shanghai"
COPY appstore-upgrade/target/appstore-upgrade-*.jar /opt/appstore-upgrade.jar
WORKDIR /opt
CMD ["java", "-jar", "appstore-upgrade.jar"]
-
FROM:使用的基础镜像源
-
RUN:用于执行后面跟着的命令行命令
-
注意:Dockerfile的指令每执行一次都会在docker上新建一层。所以过多无意义的层,会造成镜像膨胀过大。因此 RUN 后面有多个命令的话,以&&符号连接命令,这样执行后,只会创建一层镜像。
-
RUN命令有两种格式:
-
shell格式:RUN <命令行命令>
-
exec格式:RUN [“可执行文件”, “参数1”, “参数2”]
-
-
-
COPY:复制指令,从上下文路径中复制文件或目录到容器指定路径
-
上下文路径:是指docker在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令在得知这个路径后,会将路径下的所有内容打包。默认的上下文目录是Dockerfile所在的目录
-
-
CMD:类似RUN指令,但二者运行的时间点不同:
-
RUN是在docker build,CMD在docker run时运行
-
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖
-
-
ENV:设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量
-
WORKDIR:为 Dockerfile 中任何 RUN、CMD、ENTRYPOINT、COPY 和 ADD 指令设置工作目录,如果未指定,则默认工作目录为 /
Dockerfile详细配置说明:https://docs.docker.com/engine/reference/builder/
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/30903.html