容器相关

8/5/2021 DockerDockerfileDocker-composeDocker SwarmKubernetesk3scrictlctr

# Docker容器相关

# Docker

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情

# Dockerfile

Dockerfile 是拿来构建自定义镜像的,并没有直接生成容器。只是可以在运行镜像时运行容器而已,若是想使用这个镜像的话还需要使用docker run命令来运行这个镜像,从而生成运行一个容器

# Docker Compose

docker-compose.yml是用来编排项目的,里面包含使用各种镜像创建的容器服务,使用的镜像可以是网络上的,也可以是根据使用Dockerfile文件来build生成的镜像,相当于是把上一步的这个工作给做了

docker-compose可以在单个服务器上创建多个容器,多个副本

# Docker Swarm

Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机

docker swarm可以在多个服务器创建多个容器,多个副本,实现集群,负载均衡, 不过现在主要被Kubernetes替代

# Kubernetes

google基于自己的borg开发的容器编排工具,目前主流,能实现docker swarm能实现的功能,且其他功能更加强大

# Docker容器和传统虚拟机的区别

容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现

容器

docker-containerized-and-vm-transparent-bg

# containerd

# docker 和 contraierd 简单说明

docker 由 docker-client, dockerd, containerd, docker-shim, runc组成,所以containerd是docker的基础组件之一

从k8s的角度看,可以选择 containerd 或 docker 作为运行时组件:其中 containerd 调用链更短,组件更少,更稳定,占用节点资源更少。所以k8s后来的版本开始默认使用 containerd

containerd 相比于docker , 多了 namespace 概念,每个 image 和 container 都会在各自的namespace下可见。

docker 作为 k8s 容器运行时,调用关系为:kubelet --> dockershim (在 kubelet 进程中) --> dockerd --> containerd

containerd 作为 k8s 容器运行时,调用关系为:kubelet --> cri plugin(在 containerd 进程中) --> containerd

containerd 相比 docker, 多了 namespace 概念,每个image 和 container 都会在对应的 namespace 下可见,k8s 会使用 k8a.io 作为命名空间,crictl images list -n k8s.io

# 相关执行说明

  • ctr 是 containerd 的一个客户端工具。

  • crictl 是 CRI 兼容的容器运行时命令行接口,可以使用它来检查和调试 k8s 节点上的容器运行时和应用程序。

  • ctr -v 输出的是 containerd 的版本,crictl -v 输出的是当前 k8s 的版本

# 常用命令

命令 docker ctr(containerd) crictl(kubernetes)
命令 docker ctr(containerd) crictl(kubernetes)
查看运行的容器 docker ps ctr task ls/ctr container ls crictl ps
查看镜像 docker images ctr image ls crictl images
查看容器日志 docker logs crictl logs
查看容器数据信息 docker inspect ctr container info crictl inspect
查看容器资源 docker stats crictl stats
启动/关闭已有的容器 docker start/stop ctr task start/kill crictl start/stop
运行一个新的容器 docker run ctr run 无(最小单元为pod)
修改镜像标签 docker tag ctr image tag
创建一个新的容器 docker create ctr container create crictl create
导入镜像 docker load ctr image import
导出镜像 docker save ctr image export
删除容器 docker rm ctr container rm crictl rm
删除镜像 docker rmi ctr image rm crictl rmi
拉取镜像 docker pull ctr image pull ctictl pull
推送镜像 docker push ctr image push
在容器内部执行命令 docker exec crictl exec

# K8s 相关

  • 获取 apiserver 地址

cat ~/.kube/config | grep server: | awk '{print $2}'

  • 获取 token

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep kubepi-user | awk '{print $1}') | grep token: | awk '{print $2}'

  • 获取 config :默认路径 ~/.kube/config

# 工具推荐:

dive

A tool for exploring a docker image, layer contents, and discovering ways to shrink the size of your Docker/OCI image. https://github.com/wagoodman/dive

ctop

容器监控工具 https://github.com/bcicen/ctop

lazydocker

A simple terminal UI for both docker and docker-compose, written in Go with the gocui library. https://github.com/jesseduffield/lazydocker