云原生系列(二)

简介: 云原生系列(二)

Docker的基础

①、k8s是Docker的分布式管理的基础设施

②、 Docker-Compose是单节点的Docker容器管理的组件或者是基础设施

③、 当然也可以用手工的方式进行Docker的容器的管理。

上面的三种不管是哪种都要掌握Docker容器的底层原理

docker相关的命令:

docker -v:查看docker版本的相关的命令

systemctl  start docker:启动docker容器

systemctl status docker:查看docker容器的状态

0c67e483d24ac08db37cc49aea0bd76b.png

docker  ps:验证docker是否可以使用

d3ad8c7264aa1df2e4b6519a185f36c4.png

容器相关的命令:

docker run centos:创建容器

e623872cec4df8cb5029a9b86373382c.png

docker ps -a:查看容器的状态

0d764e2940aaca919f0fdc98e2a1d968.png

docker stop id:停止容器

f813fcf682a93523c79c69ad29ef1829.png

docker rm id:删除容器

13100d58382b71108ffbc557b6ad55ae.png

docker top 容器名称:可以查看容器中正在运行的进程

5a85a0eacfbb49b1fb5dda81d7e2360c.png

docker ps --format "{{.Names}}":查找容器名称

074ff4cfa6968815f7511516f940bb5e.png

镜像相关的命令

docker image ls:docker镜像查看

32ea54e62c9d36948123568074e5fb79.png

常用的几种进入Docker容器的方法

①、使用docker attach

e8152ce0bd3a04c38ba039455363a9c1.png

使用该命令有一个问题:当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他的窗口也无法再进行操作,因为这个原因,所以dockerattach命令不太适合于生产环境,平时自己开发应用时可以使用该命令。

②、使用SSH

在生产环境中排除了使用docker attach命令进入容器之后,相信大家第一个想到的就是ssh。在镜像(或容器)中安装了ssh Server,这样就能保证多人进入。容器相互之间不受干扰了,相信大家在当前的生产环境中(没有使用Docker的情况)也是这样做的。但是使用了Docker容器之后不建议使用ssh进入到Docker容器内。

③、使用nsenter

1、什么是nsenter:

nsenter命令是一个可以在指定进程的命令空间下运行指定程序的命令。它位于util-linux包中。util-linux是一个开放源码的软件包,是一个对任何Linux系统的基本面工具套件,含有一些标准Unix工具,如Login。util-linux软件包包含许多工具,其中比较重要的是加载,卸载,格式化,分区和管理硬盘驱动器,打开tty端口和得到内核消息。

2、nsenter用途:

进入容器的网络命令空间,相当多的容器为了轻量级,是不包含较为基础的命令的,比如说ip address,ping,telnet,ss,tcpdump等等命令,这就给调试容器网络带来相当大的困扰。只能通过docker inspect ContainerID命令获取到容器IP,以及无法测试和其他网络的连通性。这时就可以使用nsenter命令仅进入该容器的网络命名空间,使用宿主机的命令调试容器网络。

3、nsenter的使用:

nsenter可以访问另一个进程的名称空间。所以为了连接到某个容器我们还需要获取该容器的第一个进程PID。可以使用docker inspect命令来拿到该进程的PID。

inspect命令可以分层级显示一个镜像或容器的信息。比如我们当前有一个正在运行的容器。可以使用docker inspect来查看该容器的详细信息

由于该信息非常多,此处只截取了其中一部分进行展示,如果要显示该容器的第一个进行的PID可以使用如下方式:

74a1583802c0a8dd53f93af6f3a75446.png

nsenter -target 上面查到的进程id  --mount --uts  --ipc --net --pid

解释下nsenter指令中进程id之后的参数的含义如下:

-mount:参数是进入到mount  namsespace中(文件系统)

-uts:参数是进入到uts namespace中(主机名与域名)

-ipc:参数是进入到 System V IPC namespace中(信号量,消息队列和共享内容)

-net:参数是进入到network namespace中(网络设备,网络线,端口)

-pid:参数是进入到pid namespace中(进程编号)

例如进入容器的network namespace中:这时看到ip变化了

22b0322cc2fd46f38bacb16e1b574816.png

nsenter查看docker的连接

由于使用Docker的时候,established连接不会出现在netstat中,在运行中的docker容器中列出打开的套接字的方法:

sudo docker inspect -f {{.State.Pid}}

查看连接:

ee88bd9c9ef8b667a5a96cfdc22a5eb3.png

④、使用exec

docker exec -it 容器id  /bin/bash

acddd9ac7b4f75f61fb1f3f936c823d8.png

在公司的实际开发当中。因为我们公司的网路是隔离的,所以进行镜像的导入和导出打Tag的操作。

Docker本地镜像载入与载出

两种办法:

①、保存镜像(保存镜像载入后获得跟原镜像id相同的镜像)

②、保存容器(保存容器载入后获得跟原镜像id不同的镜像)

拉取镜像

通过命令可以从镜像仓库中拉取镜像,默认从Docker Hub获取。

命令格式:docker image pull:

e986f2c7fb2e2c42c2aa7bfb9cfc4114.png

保存镜像:

docker save 镜像id -o /home/rancher-agent.tar

9022bab7271ab6cfa9e08471b9afdb98.png

载入镜像:

docker load -i /home/rancher-agent.tar

20b2b36ca64aef1f2cb1b79a4f9f9bdd.png

打个tag

1c0f2b31711bf1b76b1cdaddae7fcaa8.png

Docker,containerd,containerd-shim和runc之间的关系

a9dfe47583d006463b1f7a1b1606b22c.png

①、在上面的图里面都是进程:容器管理进程Docker Engine,和容器的进程runc

简单的理解每启动一个容器:会对应一组容器进程;

②、容器进程是由管理容器进程Docker Engine和containerd来管理的:为了不同

的容器厂商能够进行互操作,进行了剥离:把后台进程一分为二

Docker Engine负责接收客户端的命令解析客户端的命令;

③、containerd负责真正的容器管理进程:新的守护进程,符合标准的容器管理

OCI。dockerd和containerd两个后台进程通过标准化的协议grpc来进行通讯的,其

他的守护进程也可以使用,grpc和容器管理进程containerd进行通讯。可以做到不

同厂商的复用。

④、每个容器进程有两个进程:守护进程,很多时候我们的容器是在后端进行的,

所以有守护进程守护进程叫做:containerd-shim进程:为什么还要解耦出个进程,

因为要遵守OCI标准规范

⑤、runc:容器的启动进程,这个进程可以替换的,是完全遵守OCI的,而且在启动

的时候,这个代码是完全可以替换的。相当于containerd-shim是docker官方的,私

人的。容器启动进程和私有的通过shim做一个包装或者叫做隔离实现容器启动的兼

容性和替换性。

⑥、这两个进程负责容器的生命周期管理;runc这个进程创建完了容器之后,启动

完成之后就结束了所以看容器进程的时候是看不到runc,只能看到containerd-shim

进程。

⑦、容器的后台进程每个容器都有一个:容器进程树的父根,父进程;containerd-

shim

总体的架构:

eb70c1c436800ecc1f5737ee5425fc6f.png

docker-ctl:客户端命令 ->dockerd:后台守护进程解析 >containerd:容器的管理

--------exec ---->docker-shim ----exec----->runc:标准化的容器启动进程。

相关文章
|
运维 Cloud Native 持续交付
云原生应用
云原生应用
|
Kubernetes Cloud Native Serverless
什么是云原生?聊聊云原生的前世今生
什么是云原生,云原生是在一个怎么样的背景下被提出来的,云原生和传统所说的云计算概念有什么不同?聊聊云原生的前世今生那些事。
2485 0
|
3月前
|
Kubernetes Cloud Native 安全
云原生系列(四)
云原生系列(四)
|
3月前
|
Kubernetes Cloud Native 调度
云原生系列(八)
云原生系列(八)
|
3月前
|
Cloud Native 调度 数据库
云原生系列(九)
云原生系列(九)
|
3月前
|
Kubernetes Cloud Native API
云原生系列(七)
云原生系列(七)
|
3月前
|
Cloud Native 持续交付 Docker
云原生系列(一)
云原生系列(一)
|
3月前
|
Kubernetes Cloud Native API
云原生系列(十)
云原生系列(十)
|
监控 Cloud Native Devops
云原生应用在那些场景应用广泛
云原生应用在那些场景应用广泛
|
运维 Cloud Native Devops
云原生应用的特点
云原生应用的特点