【微服务】容器化之Docker & Kubernetes

本文介绍了容器技术的生态系统,重点讨论了Docker和Kubernetes。Docker作为轻量级容器引擎,提供资源隔离和自动化部署。Kubernetes(k8s)用于管理容器集群,实现持续部署、跨云平台支持和环境标准化。详细阐述了Docker的三大核心概念,Dockerfile与镜像、容器的关系,以及Kubernetes的集群架构、核心概念和服务相关组件,包括Pod、Service、Label和Selector的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.容器生态

容器技术的生态系统自下而上分别覆盖了IaaS层和PaaS层所涉及的各类问题,包括资源调度编排部署监控配置管理、存储网络管理、安全、容器化应用支撑平台等。如下图,其中dockerk8sconsuletcd等都是此处需要关注的。

docker主要是轻量级容器引擎,起到容器(运行着服务)间隔离的作用,可以充分利用机器资源,自动化部署。

Kubernetes(k8s)主要用于管理容器集群,

1.1优势

  1. 持续部署与测试
  2. 跨云平台支持
  3. 环境标准化和版本控制

2.Docker使用

docker是虚拟化技术的升级,左图是一般的虚拟机,右图是docker,docker容器之间是共享底层操作系统的,自身不包含OS,这样就比传统虚拟机轻量级了很多,下图左是docker结构,右边是传统虚拟机。

Dockerfile描述镜像和容器,下图右侧显示了From指定的ubuntu基础镜像,基础镜像是只读的,最上层的容器层是读写层

2.1 三大核心概念

Image镜像 
Container容器轻量级虚拟机
Docker registry镜像仓库类似与github等代码仓库,官方仓库https://hub.docker.com/

2.2 关联关系

3者的关系如下图,可以通过docker命令进行交互。

2.2.1 dockerfile VS Image VS Container

常用流程就是1.编写dockerfile,2.build生成一个镜像,(将镜像push到仓库 ,拉取镜像),3.启动容器。

Dockerfile用于描述镜像,

指令解释上例释义
FROM

指定基础镜像,执行from时会依赖传递

指定python3.6的基础镜像
WORKDIR指定工作路径,类似于cd安装python的tornado包
RUN执行shell命令把当前路径下的py文件添加到容器根目录下
CMD启动服务,一个文件仅一个服务启动命令
FROM node:12-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "/app/src/index.js"]

Image VS registry

本地创建的镜像也可以push到远程,从仓库pull拉取一个镜像。下图例子中,

  1. 先创建镜像
  2. 推送镜像到registry
  3. 根据registry的镜像启动容器,其实分了两步,先从registy拉取pull镜像到本地,再启动本地镜像。

 

2.2.2 命令

参考

分类

命令

容器生命周期管理

run、start/stop/restart、kill、rm、pause/unpause、create、exec

容器操作

ps、inspect、top、attach、events、logs、wait、export、port

容器rootfs命令

commit、cp、diff

镜像仓库

login、pull、push、search

本地镜像管理

images、rmi、tag、build、history、save、load、import

docker环境

info、version

类别

常用子命令

样例&功能

环境

 

docker info

 

Docker环境信息

Containers

Images

...

docker version

 

Client\Server:

 Version:           18.06.1-ce

 API version:       1.38

 Go version:        go1.10.3

 Git commit:        e68fc7a

 Built:             Tue Aug 21 17:23:18 2018

 OS/Arch:           linux/amd64

 Experimental:      false

容器启动、关闭

docker run

 

基于特定的镜像创建一个容器,并依据选项来控制该容器运行

docker run --name=mysqltest -d -p 3306:3306 mysql/mysql-server:5.7

该命令从mysql-server:5.7镜像启动一个容器,并执行echo命令

--name指定容器名字

-d 后台执行

-p 容器服务端口到主机端口映射 hostPort:container-Port

docker container ls -a查看容器
docker exec
docker exec mysqltest bash -c "ls  /etc/mysql/"
容器中执行命令

docker start/stop/restart

对于已经存在的容器,可以通过dockerstart/stop/restart命令来启动、停止和重启

docker stop ebed2fd3e3c5

docker rm

删除容器

镜像仓库

 

 

docker pull

从Docker registry中拉取image或repository

docker pull docker.domain.com/username/ubuntu:18.04

docker pull mysql/mysql-server:5.7 从mysql仓库拉取tag是5.7的mysql-server镜像

docker push

将本地的image或repository推送到DockerHub的公共或私有镜像库

 

镜像管理

 

docker images

可以列出主机上的镜像

docker build

Dockerfile和docker build命令来完成一个新镜像的构建

docker build -t go/helloworld:1 -f Dockerfile.one .

还支持从 URL 构建,比如可以直接从 Git repo

docker build https://github.com/twang2218/gitlab-ce-zh.git#:11.1

docker commit

提交容器对镜像的修改

docker save

保存镜像

docker rmi

删除镜像

容器运维

docker ps

查看容器的相关信息,默认只显示正在运行的容器的信息

3.Kubernetes

为了鲁棒性和更高的性能,我们通常一个服务有很多的实例,部署这些实例如果只靠docker,需要很多的人工干预,登陆一个机器,clone下来,再run,如果挂了还需要人工登陆再重启,扩容、缩容都需要很多人工。

Kubernetes的出现自动化了这些过程,自动执行扩容,管理,更新和删除容器的过程,换句话说它是一个容器编排的平台。用户只需要通过它的api去访问这个容器集群就可以了。

3.1 集群架构

用户通过api发送指令给master,master发信号给Node,master和node的组件如下:

3.2 核心概念

3.2.1 集群组件相关

节点组件功能
masterAPI Server

对外服务接口

用户操作的接口

Scheduler

资源调度

预定的调度策略将Pod调度到相应的机器上(Model)

Controller manager

管理控制器

负责维护集群的状态,比如故障检测、自动扩展、滚动更新等

etcd

KV存储

用以保存了整个集群的状态

NodePod

部署、水平扩展和制作副本的最小单元。

可以有多个容器Container(Docker 容器)

Pod内的所有容器共享存储和网络,pod以外是node的OS、磁盘和IP

Kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理
kube-proxy

负责为服务Service提供cluster内部的服务发现和负载均衡

监听 API server 中 service 和 endpoint 的变化情况

3.2.2 服务相关

Service & label &selector

service即服务,同一个node上可以混布很多不同的服务,每个服务上可以打上很多标签label,选择器可以根据一个或多个标签从集群中众多pods过滤出对应的pod。

可以在yaml中指定label,如下图4个pod是同一个App,不同阶段,上面两个是生产阶段,下面两个是测试阶段,左边两个是FE前端服务,右边两个是后端服务。

3.2.3 存储&网络

在容器中管理数据主要有两种方式:

  • 数据卷(Data Volumes):一个可供一个或多个容器使用的特殊目录
  • 挂载主机目录 (Bind mounts)
docker volume create my-vol

docker run -d -P \
    --name web \
    # -v my-vol:/wepapp \
    --mount source=my-vol,target=/webapp \   #挂载到上面创建的数据卷
    training/webapp \
    python app.py


kubelet create volume

3.3 流程

3.3.1 定义pod by yaml

类似于通过dockerfile定义容器镜像,k8s的pod通过yaml文件定义,将yaml文件上传给master

k8s集群的master根据这样的yaml文件在集群的nodes中分配pod

样例1:启动一个pod,中运行两个容器

样例2:扩容成4个pod,每个pod两个web容器,分布是nginx,nginx转发my-app

3.3.2 定义service

Service

3.4 开放接口

#本地安装kubectl
#minikube
minikube start --driver=docker

lab

命令功能
kubectl create -f xxx.yaml创建资源对象
kubectl get nodes查看node
kubectl get pods -n <namespace> -o wide查看pods
kubectl describe描述资源,如node、pod
kubectl delete删除资源,如node、pod

kubectl exec <pod-name> date

kubectl exec -it <pod-name> -c <container-name> /bin/bash

执行pod第一个容器的date命令

执行指定pod、指定容器的bash命令

kubectl logs -f <pod-name> -c <container-name> 查看日志(相当于tail -f 命令)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值