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
命令
评论区