认识docker

最近的三年多时间,关注容器圈的话应该会知道这么几个事情:

  • 容器技术持续火爆

  • Kubernetes(k8s)成为容器编排管理的标准

  • 国内外厂商均已开始了全面拥抱Kubernetes的转型, 无数中小型企业已经落地 Kubernetes,或正走落地的道路上 。基于目前的发展趋势可以预见,未来几年以kubernetes平台为核心的容器运维管理、DevOps等将迎来全面的发展。

本着实践为核心的思想 , 分别讲述三个事情:

  • 项目的容器化

    教大家如何把公司的项目做成容器,并且运行在docker环境中

  • 使用Kubernetes集群来管理容器化的项目

    带大家一步一步部署k8s集群,并把容器化后的demo项目使用k8s来管理起来

  • 使用Jenkins和Kubernetes集成,实现demo项目的持续集成/持续交付(CI/CD)

    会使用k8s管理应用生命周期后,还差最后的环节,就是如何把开发、测试、部署的流程使用自动化工具整合起来,最后一部分呢,课程会教会大家如何优雅的使用gitlab+Jenkins+k8s构建企业级的DevOps平台

你将学到哪些

  • Docker相关

    • 如何使用Dockerfile快速构建镜像
    • Docker镜像、容器、仓库的常用操作
    • Docker容器的网络(Bridge下的SNAT、DNAT)
  • Kubernetes相关

    • 集群的快速搭建
    • kubernetes的架构及工作流程
    • 使用Pod控制器管理业务应用的生命周期
    • 使用CoreDNS、Service和Ingress实现服务发现、负载均衡及四层、七层网络的访问
    • Kubernetes的认证授权体系
  • 使用EFK构建集群业务应用的日志收集系统

  • 基于Gitlab+Jenkins+k8s构建DevOps平台

    • Jenkins介绍及流水线的使用
    • Jenkinsfile及多分支流水线的实际应用
    • Jenkins集成sonarQube、Docker、Kubernetes
    • 使用groovy编写sharedLibrary,实现CI/CD流程的优化

学习视频

流程示意

image-20220330173451788

认识docker

怎么出现的
  • 轻量、高效的虚拟化

    Docker 公司位于旧金山,原名dotCloud,底层利用了Linux容器技术(在操作系统中实现资源隔离与限制)。为了方便创建和管理这些容器,dotCloud 开发了一套内部工具,之后被命名为“Docker”。Docker就是这样诞生的。

    (思考为啥要用Linux容器技术?)

Hypervisor: 一种运行在基础物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享硬件 。常见的VMware的 Workstation 、ESXi、微软的Hyper-V或者思杰的XenServer。

Container Runtime:通过Linux内核虚拟化能力管理多个容器,多个容器共享一套操作系统内核。因此摘掉了内核占用的空间及运行所需要的耗时,使得容器极其轻量与快速。

  • 软件交付过程中的环境依赖
几个知识点
  • 可以把应用程序代码及运行依赖环境打包成镜像,作为交付介质,在各环境部署

  • 可以将镜像(image)启动成为容器(container),并且提供多容器的生命周期进行管理(启、停、删)

  • container容器之间相互隔离,且每个容器可以设置资源限额

  • 提供轻量级虚拟化功能,容器就是在宿主机中的一个个的虚拟的空间,彼此相互隔离,完全独立

  • CS架构的软件产品

发展史

13年成立,15年开始,迎来了飞速发展。

Docker 1.8之前,使用 LXC ,Docker在上层做了封装, 把LXC复杂的容器创建与使用方式简化为自己的一套命令体系。

lxc介绍文章

之后,为了实现跨平台等复杂的场景,Docker抽出了libcontainer项目,把对namespace、cgroup的操作封装在libcontainer项目里,支持不同的平台类型。

2015年6月,Docker牵头成立了 OCI(Open Container Initiative开放容器计划)组织,这个组织的目的是建立起一个围绕容器的通用标准 。 容器格式标准是一种不受上层结构绑定的协议,即不限于某种特定操作系统、硬件、CPU架构、公有云等 , 允许任何人在遵循该标准的情况下开发应用容器技术,这使得容器技术有了一个更广阔的发展空间。

OCI成立后,libcontainer 交给OCI组织来维护,但是libcontainer中只包含了与kernel交互的库,因此基于libcontainer项目,后面又加入了一个CLI工具,并且项目改名为runC ( https://github.com/opencontainers/runc ), 目前runC已经成为一个功能强大的runtime工具。

Docker也做了架构调整。将容器运行时相关的程序从docker daemon剥离出来,形成了containerd。containerd向上为Docker Daemon提供了gRPC接口,使得Docker Daemon屏蔽下面的结构变化,确保原有接口向下兼容。向下通过containerd-shim结合runC,使得引擎可以独立升级,避免之前Docker Daemon升级会导致所有容器不可用的问题。

Docker 网络

1
docker network ls

https://img-blog.csdnimg.cn/20190702223222117.png

网络模式 介绍
Host【主机】 容器不虚拟出自己的网卡,配置自己的ip
Bridge【桥接】 此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。
None 该模式关闭了容器的网络功能。
Container 创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。
自定义网络

参考文章

查看 docker 的 network

给你个全的,你在Linux环境下多试下就明白了: $0 这个程式的执行名字 $n 这个程式的第n个参数值,n=1…9 $* 这个程式的所有参数,此选项参数可超过9个。 $# 这个程式的参数个数 $$ 这个程式的PID(脚本运行的当前进程ID号) $! 执行上一个背景指令的PID(后台运行的最后一个进程的进程ID号) $? 执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误) $- 显示shell使用的当前选项,与set命令功能相同

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
ll /proc/14464/ns
# 查看对应的进程下面的 namespace 

# 查看当前进程的 ns
ls /proc/$$/ns




## 其他笔记

[[post/14.新语言学习记录/云原生原理/Docker学习/docker基本命令学习 | docker命令学习]]





## 待学


学习 docker link原理