扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
本篇文章为大家展示了k8s Kubernetes v1.10.0 集群安装以及踩坑过程,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、成都小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了壶关免费建站欢迎大家使用!
因工作需求,最近开始研究docker及k8s相关的资料,本文主要记录 kubernetes 安装过程及踩过的坑。坑是挺多,过来就好了!如有错漏,望予指正。
CentOS 7.4
IP地址 | 机器名称 | 角色 |
10.8.51.76 | server | 主节点 |
10.8.51.77 | node-1 | 从节点 |
10.8.51.78 | node-2 | 从节点 |
初始化环境之后,建议重新启动机器
修改主机名,建议统一
hostnamectl set-hostname server hostnamectl set-hostname node-1 hostnamectl set-hostname node-2
修改/etc/hosts 文件增加主机映射
#node-2 为当前节点的主机名称 127.0.0.1 localhost node-2 localhost4 localhost4.localdomain4 ::1 localhost node-2 localhost6 localhost6.localdomain6 10.8.51.76 server 10.8.51.77 node-1 10.8.51.78 node-2
免身份认证(建议弄上,主要是方便)
ssh-keygen #一路回车即可 ssh-copy-id server ssh-copy-id node-1 ssh-copy-id node-2
关闭防火墙、关闭Swap、关闭Selinux
#关闭防火墙 systemctl stop firewalld systemctl disable firewalld #关闭交换内存,必须关闭.不关容易出错 swapoff -a sed -i 's/.*swap.*/#&/' /etc/fstab #关闭selinux setenforce 0 sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/sysconfig/selinux sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config sed -i "s/^SELINUX=permissive/SELINUX=disabled/g" /etc/sysconfig/selinux sed -i "s/^SELINUX=permissive/SELINUX=disabled/g" /etc/selinux/config #更改文件最大打开数 echo "* soft nofile 65536" >> /etc/security/limits.conf echo "* hard nofile 65536" >> /etc/security/limits.conf echo "* soft nproc 65536" >> /etc/security/limits.conf echo "* hard nproc 65536" >> /etc/security/limits.conf echo "* soft memlock unlimited" >> /etc/security/limits.conf echo "* hard memlock unlimited" >> /etc/security/limits.conf #配置IP转发,充许 编辑 /etc/sysctl.d/k8s.conf 文件,增加 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 #完成后使其生效 sysctl -p /etc/sysctl.d/k8s.conf
Kubernetes 1.10.0 与期相附的docker版本,不指定版本会导致docker版本过高,k8s无法正常启动
#下载指定版本docker wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm #安装 rpm -ivh docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm rpm -ivh docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm #设置开机自启 systemctl enable docker #启动docker systemctl start docker #查看状态 docker info #查看版本 docker version
此处可配置一下国内镜像加速
使用阿里云镜像加速器:阿里云容器hub https://dev.aliyun.com/search.html;登录之后,进入管理中心-->镜像加速器-->操作文档,根据提示进行设置即可。 如下图:
这里要是不修改,容器无法透过自身的防火墙
开启iptables filter表的FORWARD链
编辑/lib/systemd/system/docker.service,在ExecStart=..上面加入如下内容:
ExecStartPost=/usr/sbin/iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT ExecStart=/usr/bin/dockerd
拉取镜像,由于国内无法连上google(k8s.gcr.io)相关服务,需要事先将所需镜像拉取过来。此处要是可以翻墙的话,可以省略以下步骤
server节点 #拉取镜像 docker pull keveon/kube-apiserver-amd64:v1.10.0 docker pull keveon/kube-scheduler-amd64:v1.10.0 docker pull keveon/kube-controller-manager-amd64:v1.10.0 docker pull keveon/kube-proxy-amd64:v1.10.0 docker pull keveon/k8s-DNS-kube-dns-amd64:1.14.8 docker pull keveon/k8s-dns-dnsmasq-nanny-amd64:1.14.8 docker pull keveon/k8s-dns-sidecar-amd64:1.14.8 docker pull keveon/etcd-amd64:3.1.12 docker pull keveon/flannel:v0.10.0-amd64 docker pull keveon/pause-amd64:3.1 #修改镜像名称,与k8s原服务需求镜像保持一致 docker tag keveon/kube-apiserver-amd64:v1.10.0 k8s.gcr.io/kube-apiserver-amd64:v1.10.0 docker tag keveon/kube-scheduler-amd64:v1.10.0 k8s.gcr.io/kube-scheduler-amd64:v1.10.0 docker tag keveon/kube-controller-manager-amd64:v1.10.0 k8s.gcr.io/kube-controller-manager-amd64:v1.10.0 docker tag keveon/kube-proxy-amd64:v1.10.0 k8s.gcr.io/kube-proxy-amd64:v1.10.0 docker tag keveon/k8s-dns-kube-dns-amd64:1.14.8 k8s.gcr.io/k8s-dns-kube-dns-amd64:1.14.8 docker tag keveon/k8s-dns-dnsmasq-nanny-amd64:1.14.8 k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64:1.14.8 docker tag keveon/k8s-dns-sidecar-amd64:1.14.8 k8s.gcr.io/k8s-dns-sidecar-amd64:1.14.8 docker tag keveon/etcd-amd64:3.1.12 k8s.gcr.io/etcd-amd64:3.1.12 docker tag keveon/flannel:v0.10.0-amd64 quay.io/coreos/flannel:v0.10.0-amd64 docker tag keveon/pause-amd64:3.1 k8s.gcr.io/pause-amd64:3.1 #删除原镜像 docker rmi keveon/kube-apiserver-amd64:v1.10.0 docker rmi keveon/kube-scheduler-amd64:v1.10.0 docker rmi keveon/kube-controller-manager-amd64:v1.10.0 docker rmi keveon/kube-proxy-amd64:v1.10.0 docker rmi keveon/k8s-dns-kube-dns-amd64:1.14.8 docker rmi keveon/k8s-dns-dnsmasq-nanny-amd64:1.14.8 docker rmi keveon/k8s-dns-sidecar-amd64:1.14.8 docker rmi keveon/etcd-amd64:3.1.12 docker rmi keveon/flannel:v0.10.0-amd64 docker rmi keveon/pause-amd64:3.1
node节点,拉取镜像,其中 dashboard以及heapster也可放到主节点上
node 节点 #拉取镜像 docker pull keveon/kube-proxy-amd64:v1.10.0 docker pull keveon/flannel:v0.10.0-amd64 docker pull keveon/pause-amd64:3.1 docker pull keveon/kubernetes-dashboard-amd64:v1.8.3 docker pull keveon/heapster-influxdb-amd64:v1.3.3 docker pull keveon/heapster-grafana-amd64:v4.4.3 docker pull keveon/heapster-amd64:v1.4.2 #修改镜像名称 docker tag keveon/flannel:v0.10.0-amd64 quay.io/coreos/flannel:v0.10.0-amd64 docker tag keveon/pause-amd64:3.1 k8s.gcr.io/pause-amd64:3.1 docker tag keveon/kube-proxy-amd64:v1.10.0 k8s.gcr.io/kube-proxy-amd64:v1.10.0 docker tag keveon/kubernetes-dashboard-amd64:v1.8.3 k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.3 docker tag keveon/heapster-influxdb-amd64:v1.3.3 k8s.gcr.io/heapster-influxdb-amd64:v1.3.3 docker tag keveon/heapster-grafana-amd64:v4.4.3 k8s.gcr.io/heapster-grafana-amd64:v4.4.3 docker tag keveon/heapster-amd64:v1.4.2 k8s.gcr.io/heapster-amd64:v1.4.2 #删除原镜像 docker rmi keveon/kube-proxy-amd64:v1.10.0 docker rmi keveon/flannel:v0.10.0-amd64 docker rmi keveon/pause-amd64:3.1 docker rmi keveon/kubernetes-dashboard-amd64:v1.8.3 docker rmi keveon/heapster-influxdb-amd64:v1.3.3 docker rmi keveon/heapster-grafana-amd64:v4.4.3 docker rmi keveon/heapster-amd64:v1.4.2
每个节点均需要执行
cat > /etc/yum.repos.d/kubernetes.repo <安装kubeadm
最新版使用 yum install -y kubeadm安装,我们需要安装指定版本,执行
#查看有那些版本可以安装 yum list kubeadm --showduplicates #安装指定版本 yum install kubeadm-1.10.0 kubectl-1.10.0-0 kubelet-1.10.0-0 #开机启动 systemctl enable kubelet #启动 systemctl start kubelet 这时系统启动时,会报错,先不用管他。因为还没有初始化。初始化后就没事了。修改kubeadm 配置文件
#这里的坑不少,一定要注意文件编码格式,行的未尾有没有其它不可见字符.要不初始化的时候过不去 vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf #修改这一行,此处cgroupfs 要与docker info 中的一致 Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=cgroupfs" #添加这一行 Environment="KUBELET_EXTRA_ARGS=--v=2 --fail-swap-on=false --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/k8sth/pause-amd64:3.0" #完整版如下 [Service] Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf" Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true" Environment="KUBELET_NETWORK_ARGS=--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin" Environment="KUBELET_DNS_ARGS=--cluster-dns=10.96.0.10 --cluster-domain=cluster.local" Environment="KUBELET_AUTHZ_ARGS=--authorization-mode=Webhook --client-ca-file=/etc/kubernetes/pki/ca.crt" Environment="KUBELET_CADVISOR_ARGS=--cadvisor-port=0" Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=cgroupfs" Environment="KUBELET_CERTIFICATE_ARGS=--rotate-certificates=true --cert-dir=/var/lib/kubelet/pki" Environment="KUBELET_EXTRA_ARGS=--v=2 --fail-swap-on=false --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/k8sth/pause-amd64:3.0" ExecStart= ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_SYSTEM_PODS_ARGS $KUBELET_NETWORK_ARGS $KUBELET_DNS_ARGS $KUBELET_AUTHZ_ARGS $KUBELET_CADVISOR_ARGS $KUBELET_CGROUP_ARGS $KUBELET_CERTIFICATE_ARGS $KUBELET_EXTRA_ARGS $KUBELET_EXTRA_ARG 配置好后可使用 scp /etc/systemd/system/kubelet.service.d/10-kubeadm.conf root@node-1:/etc/systemd/system/kubelet.service.d/10-kubeadm.conf 命令将文件传输至子节点重新加载配置
#重新载入配置 systemctl daemon-reload #重启kubelet服务 systemctl restart kubelet初始化集群
#初始化集群时,增加自己本机IP地址,我们前的服务器为多网卡,指定其中主IP即可 kubeadm init --apiserver-advertise-address 10.8.51.76 --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.10.0 #初始化失败时重置命令 kubeadm reset这里很关键,我有好几次都是死在了这个地方。出错不要担心,避免如下几点可大大增加成功机率
1.配置文件中/etc/systemd/system/kubelet.service.d/10-kubeadm.conf cgroupfs的设置与docker info的一致 2.编辑配置文件时,注意行尾的不可见字符*******特别是ctrl +c ctrl + v 的朋友 3.拉取镜像后的名称不要忘记修改 4.查看出错日志 /var/log/messages成功后的效果图如下:(自己的忘记截了,这是网上找的)
将上图信息中的
#这个的意思是就是将k8s配置到环境变量中,在那个目录都可以任使用k8s命令,也可将此文件考备到其他节点,在子节点上也可执行集群的命令了 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config #这个要记好,子节点加入主节点需要执行的命令,将下边的命令在node-1,node-2中执行,就可以将 node-1,和 node-2加入集群中 kubeadm join 10.8.51.76:6443 --token tncyyh.jycputhrslcs6f6d --discovery-token-ca-cert-hash sha256:099ebf2e5b7d07f35e**********fb7b20cdf923**********9fa70734f6acc73a48查看集群状态
kubectl get cs NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-0 Healthy {"health": "true"}安装网络插件 flannel
#只要server端安装即可 wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml kubectl apply -f kube-flannel.yml clusterrole.rbac.authorization.k8s.io "flannel" created clusterrolebinding.rbac.authorization.k8s.io "flannel" created serviceaccount "flannel" created configmap "kube-flannel-cfg" created daemonset.extensions "kube-flannel-ds" created安装完成后,可使用kubectl get pod --all-namespaces 查看
kubectl get pod --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-system etcd-server 1/1 Running 0 4h kube-system heapster-676cc864c6-g4jfj 1/1 Running 0 4h kube-system kube-apiserver-server 1/1 Running 0 4h kube-system kube-controller-manager-server 1/1 Running 0 4h kube-system kube-dns-86f4d74b45-pm8z2 3/3 Running 0 4h kube-system kube-flannel-ds-amd64-6xlzz 1/1 Running 0 4h kube-system kube-flannel-ds-amd64-78clr 1/1 Running 0 4h kube-system kube-flannel-ds-amd64-qgjp2 1/1 Running 0 3h kube-system kube-proxy-5pqsw 1/1 Running 0 4h kube-system kube-proxy-85m2p 1/1 Running 0 3h kube-system kube-proxy-zgns8 1/1 Running 0 4h kube-system kube-scheduler-server 1/1 Running 0 4h kube-system kubernetes-dashboard-7d5dcdb6d9-bv8l2 1/1 Running 0 3h kube-system monitoring-grafana-69df66f668-ndcwk 1/1 Running 0 4h kube-system monitoring-influxdb-78d4c6f5b6-pgb89 1/1 Running 0 4h让server 参与负载
kubectl taint nodes server node-role.kubernetes.io/master-向集群中加入 node
#这个是初始化后显示出来的 kubeadm join 10.8.51.76:6443 --token tncyyh.jycputhrslcs6f6d --discovery-token-ca-cert-hash sha256:099ebf2e5b7d07f35e3ace5809f********3c2f758ab9f*******73a48查看集群节点
kubectl get nodes NAME STATUS ROLES AGE VERSION node-1 Ready4h v1.10.0 node-2 Ready 3h v1.10.0 server Ready master 4h v1.10.0 --命令自动补全
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
查看api服务
#浏览器执行 https://10.8.51.76:6443这是没受限了,此时可以配置一个代理,使用非https访问即可
nohup kubectl proxy --port=8081 --address=10.8.51.76 --accept-hosts=^*$ &#浏览器执行 http://10.8.51.76:8081妥了..要是能坚持 到这里,就说明k8s集群,已经搭建成功了.下边内容可以选看了
安装Dashboard插件
#下载kubernetes配置文件 wget https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml #编辑kubernetes-dashboard.yaml 文件,指定端口由于 K8S在1.6版本以后kube-apiserver 启用了 RBAC 授权,而官方源码目录的 dashboard-controller.yaml 没有定义授权的 ServiceAccount,所以后续访问 API server 的 API 时会被拒绝
创建一个kubernetes-dashboard-admin的ServiceAccount并授予集群admin的权限,创建kubernetes-dashboard-admin.rbac.yaml
--- apiVersion: v1 kind: ServiceAccount metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard-admin namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: kubernetes-dashboard-admin labels: k8s-app: kubernetes-dashboard roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: kubernetes-dashboard-admin namespace: kube-system#执行命令 kubectl create -f kubernetes-dashboard.yaml kubectl create -f kubernetes-dashboard-admin.rbac.yaml安装heapster插件
mkdir heapster wget https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/influxdb/grafana.yaml wget https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/rbac/heapster-rbac.yaml wget https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/influxdb/heapster.yaml wget https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/influxdb/influxdb.yaml #查看以上下载配置谁的中的镜像版本是否与下载时的一致,不一致时修改成本地镜像版本 kubectl create -f ./查看token
kubectl get secret -n kube-system | grep dashboard-admin kubectl describe -n kube-system secret/kubernetes-dashboard-admin-token-4lk94访问dashboard
#浏览器输入,这个30000端是我们刚才自己指定的 https://10.8.51.76:30000此处选择令牌输入刚才查看的token,点击登录
好了.这回是完事了.
要是你的浏览器不能访问https,可参考,我用的浏览器chrmoe 各种方式都试了,都不行,最后使用下边连接的方式成功了.可以看到了.
Dashboard使用自定义证书
https://blog.csdn.net/chenleiking/article/details/81488028
本文参考综合了网上的一些成功案例.
参考来源:
https://www.jianshu.com/p/42772740f09a
https://www.kubernetes.org.cn/3808.html
JAVA版API使用
我用的这个,实现了通过ymal文件对pod的增、删、改、查等一些基本操作
https://github.com/fabric8io/kubernetes-client
YMAL格式说明
#################################################################### apiVersion: v1 //版本 kind: pod //类型,pod metadata: //元数据 name: String //元数据,pod的名字 namespace: String //元数据,pod的命名空间 labels: //元数据,标签列表 - name: String //元数据,标签的名字 annotations: //元数据,自定义注解列表 - name: String //元数据,自定义注解名字 spec: //pod中容器的详细定义 containers: //pod中的容器列表,可以有多个容器 - name: String //容器的名称 image: String //容器中的镜像 imagesPullPolicy: [Always|Never|IfNotPresent]//获取镜像的策略,默认值为Always,每次都尝试重新下载镜像 command: [String] //容器的启动命令列表(不配置的话使用镜像内部的命令) args: [String] //启动参数列表 workingDir: String //容器的工作目录 volumeMounts: //挂载到到容器内部的存储卷设置 - name: String mountPath: String //存储卷在容器内部Mount的绝对路径 readOnly: boolean //默认值为读写 ports: //容器需要暴露的端口号列表 - name: String containerPort: int //容器要暴露的端口 hostPort: int //容器所在主机监听的端口(容器暴露端口映射到宿主机的端口,设置hostPort时同一台宿主机将不能再启动该容器的第2份副本) protocol: String //TCP和UDP,默认值为TCP env: //容器运行前要设置的环境列表 - name: String value: String resources: limits: //资源限制,容器的最大可用资源数量 cpu: Srting memory: String requeste: //资源限制,容器启动的初始可用资源数量 cpu: String memory: String livenessProbe: //pod内容器健康检查的设置 exec: command: [String] //exec方式需要指定的命令或脚本 httpGet: //通过httpget检查健康 path: String port: number host: String scheme: Srtring httpHeaders: - name: Stirng value: String tcpSocket: //通过tcpSocket检查健康 port: number initialDelaySeconds: 0//首次检查时间 timeoutSeconds: 0 //检查超时时间 periodSeconds: 0 //检查间隔时间 successThreshold: 0 failureThreshold: 0 securityContext: //安全配置 privileged: falae restartPolicy: [Always|Never|OnFailure]//重启策略,默认值为Always nodeSelector: object //节点选择,表示将该Pod调度到包含这些label的Node上,以key:value格式指定 imagePullSecrets: - name: String hostNetwork: false //是否使用主机网络模式,弃用Docker网桥,默认否 volumes: //在该pod上定义共享存储卷列表 - name: String emptyDir: {} //是一种与Pod同生命周期的存储卷,是一个临时目录,内容为空 hostPath: //Pod所在主机上的目录,将被用于容器中mount的目录 path: string secret: //类型为secret的存储卷 secretName: String item: - key: String path: String configMap: //类型为configMap的存储卷 name: String items: - key: String path: Stringkubernetes目录挂载
Docker本身有自己的目录挂载, 但功能太单一, 一般也只能挂载本地目录, K8S作为Docker容器的管理服务, 除了能够挂载本地的还能在线文件存储目录, 比如说nfs
1. 本地目录挂载
yml文件中配置如下
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: goserver spec: replicas: 2 template: metadata: labels: run: goserver spec: containers: - name: goserver image: registry.cn-hangzhou.aliyuncs.com/magina-centos7/goserver:1.0 ports: - containerPort: 4040 volumeMounts: - mountPath: /mnt/logs name: go-logs volumes: - name: go-logs hostPath: path: /mnt/logs/kubernetes/goserver最后的volumes指定挂载目录的名称和路径, 这个目录是本地的, 也就是说pod只会挂载当前宿主机的目录, 但当我们有多个节点, 而这些节点上又有运行着相同的项目, 而我们需要收集这些项目的日志, 用本地挂载的方式显得很麻烦, 当然, 我们可以用分布式日志工具去处理, 这里介绍另外一种方式, 网络文件系统nfs
2. 网络文件系统nfs
yml文件中配置如下
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: goserver spec: replicas: 2 template: metadata: labels: run: goserver spec: containers: - name: goserver image: registry.cn-hangzhou.aliyuncs.com/magina-centos7/goserver:1.0 ports: - containerPort: 4040 volumeMounts: - mountPath: /mnt/logs name: go-logs volumes: - name: go-log nfs: server: nfs4.yinnote.com path: /prod/logs/goserver这里使用了nfs标签, 也就是将当前目录挂载到了远程文件系统, 这里的server指的是远程文件系统路径, 需要自己去配置, 或者直接买其他云服务厂商的文件系统, 这样做的好处是, 不管哪个节点, 哪个pod, 都可以将日志打到统一的地方
另外, 如果我们使用了nfs文件系统, 必须要在每台节点上面安装nfs-utils工具包, 否则pod会无法启动
yum install nfs-utils
导入导出镜像容 器
pull不下来镜像。
可以通过 docker 提供把镜像导出export(保存save)为文件的机制,这样就可以把镜像copy到任意地方了。
1. 导出 export - 导入 import
格式:docker export CONTAINER(容器)
使用 docker ps -a 查看本机已有的容器,如:
[root@docker1 LAMP]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES dd43b6de6b33 weblogic:jdk1.6 "/run.sh" 3 days ago Up 3 days 0.0.0.0:32771->22/tcp, 0.0.0.0:32770->7001/tcp peaceful_saha aca388afeddf sshd:centos "/run.sh" 4 days ago Up 4 days 0.0.0.0:32769->22/tcp grave_turing ...... [root@docker1 LAMP]# docker export dd43b6de6b33 >/home/weblogic:jdk1.6.tar [root@docker1 LAMP]# cd /home [root@docker1 home]# ls weblogic:jdk1.6.tar导出完成后,就可以使用 import 导入了
[root@docker1 home]# docker import - /home/weblogic:jdk1.6.tar2.保存save - 加载 load
格式:docker save IMAGE(镜像)
使用 docker images 查看本机已有的镜像(也可以使用 docker commit
命令把一个正在运行的容器保存为镜像),如: [root@docker1 LAMP]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ...... docker.io/tutum/lamp latest 3d49e175ec00 22 months ago 426.9 MB ...... [root@docker1 LAMP]# docker save 3d49e175ec00 >lamp.tar [root@docker1 LAMP]# ls Dockerfile lamp.tar [root@docker1 LAMP]# sz lamp.tar rz Starting zmodem transfer. Press Ctrl+C to cancel. Transferring lamp.tar... 100% 430366 KB 14345 KB/sec 00:00:30 0 Errors有点慢,稍微等待一下,没有任何warn信息就表示保存OK。3d49e175ec00 是镜像ID
现在就可以在任何装 docker 的地方加载 刚保存的镜像了
[root@docker1 home]# docker load < /lamp/lamp.tar3.导出 export 与 保存 save 的区别
(1).export导出的镜像文件大小 小于 save保存的镜像
(2).export 导出(import导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史,所以无法进行回滚操作(docker tag
);而save保存(load加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。(查看方式:docker images --tree) 注:导入加载进来觉得不合适可以使用 docker rm 容器ID 、 docker rmi 镜像ID 来删掉。
移除所有的容器和镜像(大扫除):
代码如下:
docker kill $(docker ps -q) ; docker rm $(docker ps -a -q) ; docker rmi $(docker images -q -a)上述内容就是k8s Kubernetes v1.10.0 集群安装以及踩坑过程,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注创新互联行业资讯频道。
当前名称:k8sKubernetesv1.10.0集群安装以及踩坑过程
文章源于:http://kswjz.com/article/ihhcei.html
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流