(三)Docker、k8s使用初体验及Dashboard避坑指南!!!

简介: (三)Docker、k8s使用初体验及Dashboard避坑指南!!!

哈喽,各位小伙伴大家好,前两节我们分别介绍了Docker和Kubernetes以及其安装,那么,如何来检验安装是否成功呢?当然,最行之有效的方法就是使用一下啦,那么,本节,我们就一起来体验一下Docker和Kubernetes的初步使用吧。

特别声明,本节的代码中,形如> docker --version的是命令,以下的都是执行结果,而且//是我自输入的注释,请不要混淆!

 

Docker初体验

上节课,我们在安装完docker后,通过About查看了docker的基本信息,那么本节,我们将学习用命令行来操作docker。

要注意,在进行操作前,一定要先运行Docker,就好比我们要开车一定要先让车启动,要不然,即使能看到一些参数,但也不能实际的上路行驶。这里也是一样的道理。(因此,假设以下都是正常情况)

 

查看版本

第一个就先查看版本吧,查看版本其实有2个相似的命令,但是查看的东西是不一样的,因此需要注意一下,如下

查看docker引擎的版本(即docker的版本)

>docker --version
Docker version 19.03.8, build afacb8b

查看全部版本,可用于验证是否开启实验功能(experimental CLI)

>docker version
Client: Docker Engine - Community  //client 相关信息
 Version:           19.03.8
 API version:       1.40
 Go version:        go1.12.17
 Git commit:        afacb8b
 Built:             Wed Mar 11 01:23:10 2020
 OS/Arch:           windows/amd64
 Experimental:      false
Server: Docker Engine - Community    //server相关信息
 Engine:
  Version:          19.03.8
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       afacb8b
  Built:            Wed Mar 11 01:29:16 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

启动实例

就像是我们学习一门新的语言时,总是习惯先写HelloWorld一样,我们也可以用Docker来打印我们的HelloWorld,不同的是,docker已经为我们写好了这个镜像,而不需要我们手动编写,我们只需输入

>docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world//拉取镜像
0e03bdcc26d7: Pull complete                                                                                             
Digest: sha256:8e3114318a995a1ee497790535e7b88365222a21771ae7e53687ad76563e8e76
Status: Downloaded newer image for hello-world:latest
Hello from Docker!//执行结果
This message shows that your installation appears to be working correctly.//表明安装成功

接下来,我们在来试着拉取一个名为webserver的nginx web server镜像

> docker run --detach --publish 80:80 --name webserver nginx
 Unable to find image 'nginx:latest' locally
 latest: Pulling from library/nginx
 fdd5d7827f33: Pull complete
 a3ed95caeb02: Pull complete
 716f7a5f3082: Pull complete
 7b10f03a0309: Pull complete
 Digest: sha256:f6a001272d5d324c4c9f3f183e1b69e9e0ff12debeb7a092730d638c33e0de3e
 Status: Downloaded newer image for nginx:latest
 dfe13c68b3b86f01951af617df02be4897184cbf7a8b4d5caf1c3c5bd3fc267f

启动后,在浏览器中直接输入http://localhost即可展示该nginx的起始页

到这里,我们已经拉取了2个镜像,并成功运行了,那如何查看已有镜像以及其状态呢?

 

查看镜像列表

显示从DockerHub下载的镜像

>docker image ls
REPOSITORY                                                       TAG                 IMAGE ID            CREATED             SIZE
nginx                                                            latest              602e111c06b6        3 hours ago         127MB
docker/desktop-storage-provisioner                               v1.0                605a0f683b7b        7 weeks ago         33.1MB
hello-world                                                      latest              bf756fb1ae65        3 months ago        13.3kB
k8s.gcr.io/kube-proxy                                            v1.15.5             cbd7f21fec99        6 months ago        82.4MB
k8s.gcr.io/kube-controller-manager                               v1.15.5             1399a72fa1a9        6 months ago        159MB
k8s.gcr.io/kube-apiserver                                        v1.15.5             e534b1952a0d        6 months ago        207MB
k8s.gcr.io/kube-scheduler                                        v1.15.5             fab2dded59dd        6 months ago        81.1MB
quay.io/kubernetes-ingress-controller/nginx-ingress-controller   0.26.1              29024c9c6e70        6 months ago        483MB
docker/kube-compose-controller                                   v0.4.23             a8c3d87a58e7        10 months ago       35.3MB
docker/kube-compose-api-server                                   v0.4.23             f3591b2cb223        10 months ago       49.9MB
k8s.gcr.io/coredns                                               1.3.1               eb516548c180        15 months ago       40.3MB
k8s.gcr.io/kubernetes-dashboard-amd64                            v1.10.1             f9aed6605b81        16 months ago       122MB
k8s.gcr.io/etcd                                                  3.3.10              2c4adeb21b4f        16 months ago       258MB
k8s.gcr.io/pause                                                 3.1                 da86e6ba6ca1        2 years ago         742kB

上述步骤中,镜像拉取后成功运行,证明已经创建了容器实例,那如何查看容器实例呢?

 

容器实例查看

查看当前运行的容器实例

>docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
afb71d7f2857        nginx               "nginx -g 'daemon of…"   16 minutes ago      Up 16 minutes       0.0.0.0:80->80/tcp   webserver

查看创建的全部容器实例,除了当前运行的,包括已退出的

>docker container ls --all
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                NAMES
e9af44f55863        hello-world         "/hello"                 28 seconds ago      Exited (0) 27 seconds ago                        bold_wilson
afb71d7f2857        nginx               "nginx -g 'daemon of…"   15 minutes ago      Up 15 minutes               0.0.0.0:80->80/tcp   webserver
939c9e97eba4        hello-world         "/hello"                 23 minutes ago      Exited (0) 23 minutes ago                        xenodochial_spence

 

停止正在运行的容器

>docker container stop webserver
webserver

移除已创建的容器

>docker container rm webserver bold_wilson xenodochial_spence
//这里移除的容器名称根据自己的事件情况而定,中间用空格隔开即可
webserver
bold_wilson
xenodochial_spence

这里需要注意的是,若要移除容器,则当前容器必须是退出状态,正在运行的容器是不会被移除的。

 

Docker帮助

其实,对于docker的命令无需死记,一方面,我们可以根据推理,比如镜像是docker image...,容器是docker container...,

另外,等不确定或者遇到不认识的命令的时候,这时候我们就可以通过--help命令来查看/查找具体定义,如

> docker --help
> docker container --help
> docker container ls --help
> docker run --help
//由于结果太长,这里就只给出命令

 

Kubernetes初体验

对于Kubernetes的管理,我们一般会通过启用Dashboard,这是一个可视化的网页,你可以理解成Kubernetes WebUI,下面,我们就来看一下如何启用Dashboard吧。

Dashboard配置

Dashboard需要用到k8s.gcr.io/kubernetes-dashboard的镜像,网络上多半给出的地址是官方地址

https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml

但还是那个坑爹的原因,这里导致这个源并不可用,以下是本人亲测可用的地址,我们只需要直接在命令行执行以下命令即可

kubectl apply -f http://mirror.faasx.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
//结果
secret/kubernetes-dashboard-certs created
serviceaccount/kubernetes-dashboard created
role.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created
deployment.apps/kubernetes-dashboard created
service/kubernetes-dashboard created

之后,我们可以通过命令kubectl get pods --all-namespaces检测dashboard是否安装成功

此时,我们可以通过启动代理,然后我们即可通过本地访问dashboard,

>kubectl proxy
Starting to serve on 127.0.0.1:8001

启动后,我们即可通过以下地址来进行浏览器访问

http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

 

授权配置

从上图可以看出,授权有2种方式,一种是通过Kubeconfig文件,另一种是Token,这里我们分别讲解一下吧。


Token

1.生成default Token

在powerShell里输入,注意是powerShell,不是命令行里

$TOKEN=((kubectl -n kube-system describe secret default | Select-String "token:") -split " +")[1]
kubectl config set-credentials docker-desktop --token="${TOKEN}"
echo $TOKEN

结果如下,框中的即为生成的Token

复制上图中的Token,输入到刚刚的授权页面,则会进入到管理界面

2.自定义用户生成Token

除了使用docker默认的配置生成token外,我们还可以通过自定义的方式来生成。具体操作如下:

特别提醒一下,以下创建的文件必须放在.kube同路径下,否则在执行之后的命令时需要指明文件路径

a.创建admin-user.yaml,用于创建服务账号,内容如下

# admin-user.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kube-system

执行kubectl create命令

>kubectl create -f admin-user.yaml
serviceaccount/admin-user created

b.创建admin-user-role-binding.yaml,用于绑定角色,内容如下

# admin-user-role-binding.yaml
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kube-system

执行kubectl create命令

>kubectl create -f admin-user-role-binding.yaml
clusterrolebinding.rbac.authorization.k8s.io/admin-user created

c.获取token

经过以上两步之后,我们可以开始获取token了,

仍然是在powershell中执行

$TOKEN=((kubectl -n kube-system describe secret admin-user | Select-String "token:") -split " +")[1]
kubectl config set-credentials admin-user --token="${TOKEN}"
echo $TOKEN

结果如下

PS C:\Users\29853> $TOKEN=((kubectl -n kube-system describe secret admin-user | Select-String "token:") -split " +")[1]
PS C:\Users\29853> kubectl config set-credentials admin-user --token="${TOKEN}"
User "admin-user" set.
PS C:\Users\29853> echo $TOKEN
eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLTg2MjhiIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJhMGI4NjI4OS04ZTA0LTRlNmItOTRlNi0zYTA4ODkyNGI2YTYiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.VexslypiDXxB2bCDhFlsZtQOKKBqpXUx93PgzrsCyaqh9-Y8Wg2Z-NqB8wvvD-QZlz9m7KijGGRTyoECWa-GkQ08ftSlDK0pUwjeDiMVMzdiJQBqB4ZkpkMzZySaUk6v8vR-YByGi7S7SBOt4_Gbk3iC1MvsRJVKjaMlKmwyPjKW_Fus8z_OEVkw7AV_gZR26T-Wn_91H_CBQPe17IotJmbejnxXiiYK_TNCUrhBTgtm-i0iPzkHrty-jK01oVgghS69dgEiKYPtcdObv72gOTDR6wkmydX4V0vdH2QdF5myjSLE4l9lQIrFU4xXAwTRo7JoQF1tKN8OxNqWXKJSDg

输入最后生成的token,仍然可以登录成功。而且,会在config文件下生成对应的token

 

Kubeconfig

该方式的话,其实就是直接选中.kube/config文件即可,如图

依旧可以成功登录。

 

好了,到此,您就完成了Docker和Kubernetes的初体验,其实,对于docker和Kubernetes涉及的东西是非常非常多的,到现在也只能说是配置好了可以进行学习的环境。对于Docker和Kubernetes一定要多练,最重要的是要明白其中的操作和原理,这样才能不用死记硬背也能流畅的操作。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
6月前
|
Kubernetes Docker 容器
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
202 25
|
9月前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
544 78
|
9月前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
376 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
8月前
|
Kubernetes Linux 虚拟化
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
2293 11
|
9月前
|
存储 Kubernetes Docker
Kubernetes(k8s)和Docker Compose本质区别
理解它们的区别和各自的优势,有助于选择合适的工具来满足特定的项目需求。
982 19
|
10月前
|
Kubernetes 开发者 Docker
Docker与Kubernetes的协同工作
Docker与Kubernetes的协同工作
|
Kubernetes 调度 Apache
Docker 编排工具比较:Kubernetes、Docker Swarm 和 Mesos,选择最适合你的容器编排方案
Docker 编排工具比较:Kubernetes、Docker Swarm 和 Mesos,选择最适合你的容器编排方案
470 0
|
存储 Kubernetes Linux
在Linux中,如何使用Docker和Kubernetes管理容器?
在Linux中,如何使用Docker和Kubernetes管理容器?
|
运维 Kubernetes 持续交付
Docker与Kubernetes:容器化技术的黄金搭档
【6月更文挑战第10天】Docker和Kubernetes是容器化技术的黄金组合,Docker提供轻量级、可移植的容器引擎,简化应用部署,而Kubernetes作为容器编排系统,实现自动化部署、扩展和管理,确保高可用性和可扩展性。两者的协作使得容器化应用更高效、可靠,共同推动软件开发和运维的创新。