目 录CONTENT

文章目录

docker/k8s命令大全

FatFish1
2024-12-17 / 0 评论 / 0 点赞 / 84 阅读 / 0 字 / 正在检测是否收录...

docker命令图解

补图https://blog.51cto.com/u_15060549/3433608

docker命令

tar包 <-> 镜像

docker load - 加载tar包成镜像

在终端中,运行以下命令来加载 tar 包为 Docker 镜像:

docker load -i /path/xx/docker.tar

其中,/path/xx/docker.tar 是 tar 包文件的路径。加载成功后,可以会在终端中看到镜像的加载信息,包括镜像的名称、标签和摘要等。

docker save - 把镜像封装成tar包

使用docker save可以把想要的镜像封成tar包,从而实现移动的目的

docker save -o my-image.tar my-image:latest

镜像 <-> 容器

docker run - 镜像生成容器

docker run <options> image <command> <args……>

镜像版本

使用image:version可以指定启动容器的镜像版本,或image:latest指定最新版本

常用可选参数

  • -i:交互模式,始终保持输入流开放

  • -t:分配伪终端,一般结合-i使用,-it即可在容器中利用伪终端进行交互

  • --name:可指定启动的容器名,不指定随即分配

  • -p:暴露容器端口给宿主机,常用格式为outside-Port:container-Port

  • -c:用于分配给容器所有进程的CPU的shares值,这是一个相对权重,实际情况还是得看宿主机

  • -m:限制容器所有进程的内存总量,以B、K、M、G为单位

  • -v:用于挂载volume,可以用多个-v挂载多个volume

  • --link:使容器间进行安全通信,--link name:alias,使用前需保证通信的容器已经启动,一个run语句可以重复使用多个--link

docker commit - 容器固化镜像

前面了解过,镜像相当于一个容器在一个时间点的切面,保留了容器的所有状态

将一个容器固化为一个镜像,包括固化其容器配置,使其不会因容器停止而丢失

docker commit <options> container <repository:tag>

只能对正在运行的容器进行固化

容器 <-> 容器

docker start containerId
docker stop containerId
docker restart containerId
docker rm containerId

常用可选参数

  • -i:开启交互模式

  • -a:附加标准输入、输出、错误输出

  • -t:stop、restart可用,设定容器停止前等待时间

仓库 <-> 镜像

docker pull - 拉取远端镜像到本地仓库

用于拉取image或repository,格式如下:

docker pull <options> name<:tag @DIGEST>

// 拉取ubuntu
docker pull ubuntu:ubuntu12.04
// 从特定仓库拉取
docker pull SEL/ubuntu
// 从其他服务器拉取
docker pull 10.10.103.215:5000/sshd

docker push - 推送本地镜像到远端仓库

用于推送image或repository到Docker Hub公共或私有仓库,格式如下:

docker push <options> name<:TAG>

// 推送到指定仓库
docker push SEL/ubuntu

docker image - 查看本地仓库的镜像

列出主机上的镜像,格式如下:

docker images <options> <repository:tag>

-a:列出全部,否则默认列出最顶层的

docker rmi - 删除本地仓库的镜像

rmi用于删除镜像,效果等同于docker image rm,格式:

docker rmi <options> image <image … >

当基于镜像启动的容器存在,无法直接删除

docker容器运维命令

docker inspect - 查看详细信息

查看镜像和容器配置的详细信息,可以通过--format指定格式

docker inspect <options> container|image <container|image …>

// 查看容器内部ip
docker inspect --format=’{{.NetworkSettings.IPAddress}}’ ee36

// 查看挂载目录
docker inspect --format “{{.Config.Volumes}}” container

>> map[/data:{}]  说明挂载到了/data目录

docker ps - 列出容器

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

docker ps <options>

最常用的选项包括:

  • -a:查看所有容器,包括停止的

  • -l:查看最新创建的容器,包括不在运行中的

docker exec - 进入容器

docker exec -it containerid bash -n mynamespace

docker attach也可以进入容器,但是退出时会让容器自己也Exit

推荐改用docker exec -it命令

可以加-n指定命名空间

events、history、log - 查看日志和事件

用于日志查看,events会打印出实时的系统事件,history打印出指定镜像的历史版本信息,logs打印容器的运行日志

docker event <options>
docker history <options> image
docker logs <options> container

k8s常用命令

# 查看所有指定pod
kubectl -n mynamespace get pods -a | grep name

# 查看某个pod信息
kubectl -n mynamespace describe pods <podname>

# 进入某个pod
kubectl -n mynamespace exec -it <podname> bash

# 查找service的逻辑分组,通常是1个或多个pod组成的一个组,通过一个公共的端口提供对外服务,如果有很多pod不提供对外服务,也可以通过一个公共的edge转发服务作为service提供对外服务,由edge服务负责转发
kubectl -n mynamespace get svc | grep name

docker+k8s+linux实战

查看docker容器的命名空间和cgroup信息

先找容器的containerId,使用以下命令:

kubectl describe pods xxxx | grep -i container

>>
Containers
  Container ID: dockers://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

拿到前12位,就可以在对应的节点中执行:

docker ps -a | grep xxxx

这时就可以看到pod在node上面运行的信息,执行以下命令:

docker inspect --format(-f也行) '{{ .State.Pid }}' xxxx

xxxx处替换containerId,可以得到对应的Pid

查看namespace信息

拿到Pid后,进入/proc/<pid>/ns目录执行ll命令可以看到容器对应的命名空间。

根据ps -ef | grep <pid>可以查到这个容器进程的子进程,例如:

root  2681  2661  bin/bash
root  2921  2681  redis-server:6379

在这个场景中,pod是通过bin/bash启动的,即1号进程,子进程是实际的redis-server进程,即2681

有两个关键点:

  • 两个进程在宿主机的PID是2681和2921,进入container里面查,就不是这个了,这就是因为PID namespace父子进程之间的隔离

  • 进入/proc/<pid>/ns执行ll操作查看两个进程的namespace,可以看到id是一致的,说明这个pod里面的进程属于同一个namespace,而其他container按这个逻辑查,明显和他俩不一样,说明不同的container是不同的namespace

查看cgroup信息

cat /proc/${pid}/cgroup

这里面获取到的都是对应线程id所对应的cgroup的一些基础数据路径,拿到路径后拼接以下路径:

# 拼接这个路径,可以拿到一些cgroup的基础信息
/sys/fs/cgroup/systemd/xxx
# 拼接这个路径可以查看cpu相关详细cgroup信息
/sys/fs/cgroup/cpu/xxxx
# 拼接memory路径可以看内存设置
/sys/fs/cgroup/memory/xxxx
# 拼接blkio路径可以看blkio相关设置
/sys/fs/cgroup/blkio/xxx

可以看出来核心路径就是/sys/fs/cgroup,根据Pid找到路径从而找到对应cgroup的一些信息

其中memory cgourp的一些核心参数包括:

  • memory.limit_in_bytes:一个cgroup中所有进程可使用内存的最大值

  • memory.oom_control:当前cgroup内存触顶时,是否触发OOM_Killer,默认触发

  • memory.useage_in_bytes:只读参数,控制组所有进程实际使用的内存总和。数值越接近参数1,OOM的风险越高

查看kubectl kill日志

/var/log中有一批message日志,可以根据

grep oom message

查询到kubectl kill日志

这里也可以使用dmesg命令

0

评论区