Docker及K8S常用命令使用总结
目录
一、Docker常用命令总结
一、Docker常用命令总结
1、Docker容器常用操作
(1)镜像的查看与删除
查看镜像:docker images 或 docke image ls
删除容器:docker rm 容器ID //注意删除容器前先停止容器
删除镜像:docker rmi 镜像名 //注意删除镜像前先删除容器
(2)容器的启动与进入
运行容器:docker run -it 镜像名 /bin/bash
退出容器:exit 或者 Ctrl+P+Q
查看容器:docker ps -a
查看运行的容器:docker ps
容器停止:docker stop 容器ID
启动容器:docker start 容器ID
重启容器:docker restart 容器ID
重启容器后进入交互式:docker start -i 5c6ce895b979
进入容器:docker attach 容器ID docker exec -it 容器ID /bin/bash
举例:将nginx镜像运行为一个容器:docker run -d -p 81:80 -it nginx /bin/bash //其中-d是保持后台运行,-p 是端口映射,将内部的端口80向外部的端口81映射,/bin/bash就表示启动容器后启动bash。
(3)通过容器提交镜像
提交镜像:docker commit 容器ID 镜像名[:tag] 举例:docker commit f7507396068a vehicle_detect:v1
(4)镜像的保存与加载
保存镜像:docker save m2>m2.tar //保存m2镜像到m2.tar文件
docker save m2 -o /home/m2.tar
镜像加载:docker load<m2.tar
docker load -i m2.tar
(5)容器与主机之间进行数据拷贝
主机目录拷贝到容器目录:docker cp /data/test 96f7f14e99ab:/data/ # 将主机/data/test目录拷贝到容器96f7f14e99ab的/data目录下
主机目录拷贝到容器目录,目录重命名:docker cp /data/test 96f7f14e99ab:/data # 将主机/data/test目录拷贝到容器96f7f14e99ab中,目录重命名为data
容器目录拷贝到主机目录:docker cp 96f7f14e99ab:/data /tmp/ # 将容器96f7f14e99ab的/data目录拷贝到主机的/tmp目录中
(6)镜像重命名
重命名镜像:docker tag ubuntu:15.10 asialee/ubuntu:v3 #将镜像ubuntu:15.10标记为 asialee/ubuntu:v3 镜像
(7)使用GPU运行容器
容器使用所有GPU:docker run -it --gpus all vehicle_detect:v1 /bin/bash
容器使用两个GPU:docker run -it --gpus 2 vehicle_detect:v1 /bin/bash
容器指定GPU运行:docker run -it --gpus ' "device=1,2" ' vehicle_detect:v1 /bin/bash
docker run -it --gpus ' "device=UUID-ABCDEF,1" ' vehicle_detect:v1 /bin/bash
(8)容器的保存与导入
将容器保存为tar文件:docker export -o m2.tar 容器ID
举例:将id为a404c6c174a2的容器按日期保存为m2-20201016.tar文件
docker export -o m2-`date +%Y%m%d`.tar a404c6c174a2
从归档文件中创建镜像:docker import m2.tar m3:v1
举例:从镜像归档文件m2.tar创建镜像,命名为asialee/m3:v1
docker import m2.tar asialee/m3:v1
区别:
- docker save 保存的是镜像(image),docker export 保存的是容器(container);
- docker load 用来载入镜像包,docker import 用来载入容器包,但两者都会恢复为镜像;
- docker load 不能对载入的镜像重命名,而 docker import 可以为镜像指定新名称。
(9)镜像的拉取与上传
从镜像仓库中拉取或者更新指定镜像:docker pull
举例:从Docker Hub下载ubuntu最新版镜像:docker pull ubuntu
从Docker Hub下载REPOSITORY为ubuntu的所有镜像:docker pull -a ubuntu
将本地的镜像上传到镜像仓库:docker push #要先登陆到镜像仓库
举例:上传本地镜像m2:v1到镜像仓库中:docker push m2:v1
登录镜像仓库:docker login local.harbor.com 用户名/密码
docker login -u asialee -p root12345 local.harbor.com
镜像上传:docker push local.harbor.com/library/ai-detect
(10)查看docker容器内的IP
进入容器后,查看docker容器内的IP:cat /etc/hosts
2、注意事项
镜像转文件的命令是: docker save image > /root/image.tar
文件转镜像的命令是: docker load < /root/image.tar 或者 docker load -i /root/image.tar
错误 1 是: requested load from stdin, but stdin is empty
结论 : docker load 的时候, < 误写成 >, 会出现这个错误,并且原 tar 包会被修改,修改后就不可用了
错误 2 是: open /var/lib/docker/tmp/docker-import-054903443/repositories: no such file or directory
结论 : 如果你使用过错误1 中的命令,那么即使之后的命令都是正确的,也会遇到上述错误,避免的办法是不要输错命令。倘若已经输错了,那么唯一可用的方法是删除当前的 tar 包,并且重新获取 tar 包。
二、k8s常用命令总结
kubectl是Kubernetes的命令行工具,可以让用户通过命令行的方式对Kubernetes集群进行操作,通过它与Kubernetes进行交互。通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。
1、kubectl用法概述
(1)kubectl命令行的语法如下
$ kubectl [command] [TYPE] [NAME] [flags]
command:子命令,用于操作Kubernetes集群资源对象的命令,例如create、delete、describe、get、apply等。
TYPE:资源对象的类型,区分大小写,能以单数形式、复数形式或者简写形式表示。例如以下3种TYPE是等价的 (1) kubectl get pod pod1 ,(2)kubectl get pods pod1,(3)kubectl get po pod1。
NAME:资源对象的名称,区分大小写。如果不指定名称,则系统将返回属于TYPE的全部对象的列表,例如$ kubectl get pods将返回所有Pod的列表。
flags:kubectl子命令的可选参数,例如使用“-s”指定apiserver的URL地址而不用默认值。
kubectl可操作的资源对象类型如下所示:
资源对象的名称 缩写
(2)同时对多个资源对象进行操作
在一个命令行中也可以同时对多个资源对象进行操作,以多个TYPE和NAME的组合表示,示例如下。
获取多个Pod的信息:kubectl get pods pod1 pod2
同时应用多个yaml文件,以多个-f file参数表示:kubectl create -f pod1.yaml -f rc1.yaml -f service1.yaml
2、kubectl输出格式
kubectl 命令可以用多种格式对结果进行显示,输出的格式通过-o参数指定:
$ kubectl [command] [TYPE] [NAME] -o=<output_format>
根据不同子命令的输出结果,可选的输出格式如下:
常用的输出格式示例如下:
显示Pod的更多信息:kubectl get pod <pod-name> -o wide
以yaml格式显示Pod的详细信息:kubectl get pod <pod-name> -o yaml
以JSON格式显示Pod的详细信息:kubectl get pod <pod-name> -o json
以自定义列名显示Pod的信息:kubectl get pod <pod-name> -o=custom-columns=NAME:.metadata.name,RSRC:.metadata.resourceVersion
3、kubectl常用操作
(1)创建资源对象
根据yaml配置文件创建资源对象:kubectl create -f ***.yaml
(2)查看资源对象
查看资源版本标签:kubectl api-versions
查看集群状态:kubectl get cs
查看集群节点信息:kubectl get nodes
查看所有Pod列表:kubectl get pods
查看deployment:kubectl get deploy
查看端口映射:kubectl get svc
查看指定命名空间的ns服务:kubectl get svc -n kubectl-system
显示运行中的Pod、Service、Deployment以及ReplicaSet的关键信息:kubectl get all
查看所有的命名空间:kubectl get all --all-namespace
获取获取 Persistent Volume Claim: kubectl get storageclass
滚动重启一个deployment: kubectl rollout restart deployment platforms-depl
接下来是使用kubectl set命令进行替换镜像 nginx镜像
[root@abcdocker ~]# kubectl set image deployment/nginx-deployment nginx=nginx:1.10.1
deployment.extensions/nginx-deployment image updated
暂停升级: $ kubectl rollout pause deployment <deployment>
继续升级: $ kubectl rollout resume deployment <deployment>
kubectl rollout history deployment nginx-deployment # 查看历史
kubectl rollout undo deployment nginx-deployment --to-revision=1 # 如果不加--to-revision=版本号,默认回退到上一个版本
设置滚动刚更新的策略和保留pod数量 https://www.jianshu.com/p/7411d15215b5
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deploy labels: k8s-app: nginx-demo spec: minReadySeconds: 5 #Kubernetes在等待设置的时间后才进行升级 如果没有设置该值,Kubernetes会假设该容器启动起来后就提供服务了 strategy: # indicate which strategy we want for rolling update type: RollingUpdate rollingUpdate: maxSurge: 1 #升级过程中最多可以比原先设置多出的POD数量 maxUnavailable: 1 #升级过程中最多有多少个POD处于无法提供服务的状态 selector: matchLabels: app: nginx replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80
(3)描述资源对象
显示Node的详细信息:kubectl describe nodes <node-name>
显示Pod的详细信息:kubectl describe pods <pod-name>
显示由RC管理的Pod的信息:kubectl describe pods <rc-name>
(4)删除资源对象
基于pod.yaml定义的名称删除Pod:kubectl delete -f pod.yaml
删除所有Pod:kubectl delete pods --all
于删除名称为my_pod的Pod:kubectl delete pod my_pod
(5)执行容器命令
执行Pod的date命令:kubectl exec <pod-name> date
指定Pod中某个容器执行date命令:kubectl exec <pod-name> -c <container-name> date
通过bash进入容器:kubectl exec -it <pod-name> -c <container-name> /bin/bash
kubectl exec -it container-name /bin/bash
(6)查看容器日志
查看容器输出到stdout的日志:kubectl logs <pod-name>
跟踪查看容器的日志,相当于tail -f命令的结果:kubectl logs -f <pod-name> -c <container-name>
查看同一个deployment下的pod日志
kubectl logs -f deployment/<name-of-deployment>
查看同一组标签下的pod日志
kubectl describe pod XXX 拿到对应lable
lable是每个pod的唯一标识符,所以以下命令: kubectl logs -f -l app=api
(7)查看集群信息
查看集群状态信息:kubectl cluster-info
三、nvidia-smi常用命令总结
nvidia-smi提供监控GPU使用情况和更改GPU状态的功能,是一个跨平台工具,它支持所有标准的NVIDIA驱动程序。
1、显示所有GPU的当前信息状态
命令:nvidia-smi
Fan:风扇转速,从0到100%之间变动,N/A表示没有风扇
Temp: GPU温度,单位摄氏度(GPU温度过高会导致GPU频率下降)
Perf:性能状态,从P0到P12,P0表示最大性能,P12表示状态最小性能
Pwr: GPU功耗,上方的Persistence-M:是持续模式的状态,持续模式虽然耗能大,但是在新的GPU应用启动时,花费的时间更少,这里显示的是off的状态。
Bus-Id:GPU总线,domain:bus:device.function
Disp.A:Display Active,表示GPU的显示是否初始化
Memory-Usage:显存使用率
Volatile GPU-Util:GPU使用率
ECC:是否开启错误检查和纠正技术,0/DISABLED, 1/ENABLED
Compute M.:计算模式,0/DEFAULT,1/EXCLUSIVE_PROCESS,2/PROHIBITED
2、实时查看GPU使用情况
实时刷新GPU使用状态并高亮显示:watch -n 0.1 -d nvidia-smi
设置每 0.2s 刷新一次:watch -n 0.2 nvidia-smi