关于Docker&kubernetes的一些问题

本文是我自己在学习docker以及kubernetes的过程中遇到的一些问题,以及同事在听过培训之后一些问题,事后我自己去网上找些资料以及问一些资深大牛,我在此做一个归纳总结,将这些问题的解答做一个分享:

1.     容器内的数据该保存在镜像里还是宿主机中?

一般来说,如果是运行时的动态数据,那么这部分数据文件不应该保存在镜像内。在运行时尽量保持容器基础文件不可变的特性,,而变化部分使用挂载宿主目录,或者数据卷来解决。建议看一下官网 docker volume 的文档:https://docs.docker.com/engine/tutorials/dockervolumes/

 

2.      如果一个docker容器有几百个端口要映射到宿主机,只能一个个-p映射吗?

Docker的-p是可以用范围的,例如:-p 80001-8010:90001-9010。

 

3.      怎么映射宿主机端口?Dockerfile中的expose和docker run –p 有啥却别?

Docker中有两个概念,一个叫做 EXPOSE ,一个叫做 PUBLISH

EXPOSE 是镜像/容器声明要暴露该端口,可以供其他容器使用。这种声明,在没有设定 --icc=false的时候,实际上只是一种标注,并不强制。也就是说,没有声明 EXPOSE 的端口,其它容器也可以访问。但是当强制 --icc=false 的时候,那么只有 EXPOSE 的端口,其它容器才可以访问。

PUBLISH 则是通过映射宿主端口,将容器的端口公开于外界,也就是说宿主之外的机器,可以通过访问宿主IP及对应的该映射端口,访问到容器对应端口,从而使用容器服务。

EXPOSE 的端口可以不PUBLISH,这样只有容器间可以访问,宿主之外无法访问。而 PUBLISH 的端口,可以不事先 EXPOSE,换句话说 PUBLISH 等于同时隐式定义了该端口要 EXPOSE。

docker run 命令中的 -p, -P 参数,以及 docker-compose.yml 中的  ports 部分,实际上均是指PUBLISH。小写 -p 是端口映射,格式为 [宿主IP:]<宿主端口>:<容器端口>,其中宿主端口和容器端口,既可以是一个数字,也可以是一个范围,比如:1000-2000:1000-2000。对于多宿主的机器,可以指定宿主IP,不指定宿主IP时,守护所有接口。大写 -P 则是自动映射,将所有定义 EXPOSE 的端口,随机映射到宿主的某个端口。

 

4.      通过docker images命令显示的镜像很大,每次都要下载这么大的镜像么?

其实这个显示的是计算后的大小,docker image是分层存储的,自docker的1.10以后,已有的层能够被共享,不会被重复下载,只需下载变化的层,所以实际下载的比这个数值要小。

 

5.      Docker的日志问题?

Dockerdaemon 的日志一般是交给了 Upstart(Ubuntu 14.04) 或者 systemd (CentOS 7,Ubuntu 16.04)。前者一般位于 /var/log/upstart/docker.log 下,后者一般通过 jounarlctl-u docker 来读取。不同系统的位置都不一样。Docker 容器的日志,均可以通过 docker logs 来访问,而且可以像 tail -f 一样,使用 docker logs -f 来实时查看。如果深究其日志位置,每个容器的日志默认都会以 json-file 的格式存储于 /var/lib/docker/containers/<容器id>/<容器id>-json.log下,不过并不建议去这里直接读取内容,因为Docker提供了更完善地日志收集方式。

关于日志收集,Docker内置了很多日志驱动,可以通过类似于 fluentd, syslog 这类服务收集日志。无论是 docker daemon,还是容器,都可以使用日志驱动。比如,如果打算用 fluentd 收集某个容器日志,可以这样启动容器:

$ docker run -d \

    --log-driver=fluentd \

    --log-opt fluentd-address=10.2.3.4:24224 \

    --log-opt tag="docker.{{.Name}}"\

    Nginx

其中 10.2.3.4:24224 是 fluentd 服务地址,实际环境中应该换成真实的地址

可以参考一下这篇文章:https://segmentfault.com/a/1190000000730444

 

6.      Dockercommit怎么用?何时用?

一般来说,不要用commit提交镜像,而是通过写Dockerfile的方式创建镜像。

使用 docker commit 制作的镜像被称为黑箱镜像,换句话说,就是里面进行的是黑箱操作,除本人外无人知晓。即使这个制作镜像的人,过一段时间后也不会完整的记起里面的操作。那么当有些东西需要改变时,或者因基础镜像更新而需要重新制作镜像时,会让一切变得异常困难,就如同重新安装调试配置服务器一样,失去了 Docker 的优势了。而使用Dockerfile来创建镜像,可以直接使用 Shell 命令,非常方便。而且,这样制作的镜像更加透明,也容易维护,在基础镜像升级后,可以简单地重新构建一下,就可以继承基础镜像的安全维护操作。

 

7.      如何查看自己私库上的镜像?

两种办法,一种是使用 Registry V2 API。可以列出所有镜像:

                  curl http://<私有registry地址>/v2/_catalog

         如果私有 Registry尚支持 V1 API(已经废弃),可以使用 docker search

docker search <私有registry地址>/<关键字>

 

8.      kubernetespod是否可以有多个镜像?

答案是肯定的,可以有多个镜像,因为Pod对应于由若干容器组成的一个容器组,同个组内的容器共享一个存储卷(volume)。Pod主要是在容器化环境中建立了一个面向应用的“逻辑主机”模型,它可以包含一个或多个相互间紧密联系的容器。当时同事提出这个问题时,我说的好像是不能有多个镜像,对此我表示,很(hao)报(gan)歉(ga),怪我学艺不精,我给大家找了一个官网的例子:

apiVersion: v1

kind: Pod

metadata:

  name: www

spec:

  containers:

  - name: nginx

    image: nginx

    volumeMounts:

    - mountPath: /srv/www

      name: www-data

      readOnly: true

  - name: git-monitor

    image: kubernetes/git-monitor

    env:

    - name: GIT_REPO

      value: http://github.com/some/repo.git

    volumeMounts:

    - mountPath: /data

      name: www-data

  volumes:

  - name: www-data

emptyDir: {}

一pod多容器容易出现一些问题,有兴趣的同学可以看看这篇文章:

http://www.mamicode.com/info-detail-1213739.html

 

9.      kubernetes的configMap的使用?

configMap的出现就是为了将应用代码和配置区分开来,用法很简单,在kubernetes的培训时候给大家演示过,在咱们的kubernetes管理平台,租户这个角色可以去创建一个个configMap,而用户在起应用的时候,可以选择你所需要的configMap,挂载到容器中相应的目录下面即可,关于kubernetes的configMap的详细解析,大家可以参考着三篇文章:

Kubernetes 1.2 新功能解析:ConfigMap (上):https://segmentfault.com/a/1190000004890223

Kubernetes 1.2 新功能解析:ConfigMap (中):http://www.tuicool.com/articles/uuu6Vry

Kubernetes 1.2 新功能解析:ConfigMap (下):https://segmentfault.com/a/1190000004940306

10.  问一句kubernetes为啥叫k8s?

强行凑十个问题,其实这个问题才是精髓,曾经一度困扰我,是因为发音相近么?呵呵,too young too simple,实话实说了吧,主要是因为懒,数数 k 和 s 中间多少个字母?8个吧,这个8 的意思就是省略8个字母,懒得敲了……其实这类用法很多,比如i18n (internationalization), l10n (localization) 等等,歪果仁也懒得打字啊。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
请特别注意本课程的最后更新时间与当前考试版本是否一致!!!!2021年3月最后更新,当前K8S考试版本为 v1.20 5天上机实操培训 + 1天考前辅导:模块课程内容Container与Kubernetes概述√    容器的概述√  容器与虚拟化的关系√  容器与Docker关系√  容器技术的发展历程√  容器编排技术概述√  Kubernetes概述√  Container和Kubernetes的关系Docker的安装和管理√  Docker安装√  Docker基础操作√  docker存储机制√  构建docker网络√  Namespace和Cgroup√  容器资源限制实战:√  为企业部署Docker√  秒级搭建HTTP服务√  实现容器的持久化存储Kubernetes架构介绍√  Kubernetes架构√  主要组件介绍√  基本概念与术语√  Kubernetes管理对象Kubernetes 安装和配置√  设计Kubernetes集群√  基于centos平台的安装配置√  安装Kubernetes   Masters和Nodes√  安装并使用kubeadm来安装,配置和管理Kubernetes集群√  选择网络解决方案√  部署后的测试实战:√  为企业构建Kubernetes集群Kubernetes API   及集群访问√  Yaml文件对API资源结构的定义√  使用Kubectl对API资源做访问√  NameSpaces介绍√  NameSpace管理实战:√  编写yaml文件√  构建Kubernetes的命名空间Pod管理与使用√  Pod介绍与原理讲解√  Pod创建与删除√  Pod生命周期管理√  Static Pods√  Init Containers实战:√  创建多容器的pod√  pod生命周期管理√  设置POD中容器的启动顺序Label与Label   Selector√  标签(Label)√  标签选择器(Label Selector)√  使用标签选择器来安排Pod√  使用标签选择器来管理Node实战:√  让Pod运行到指定的节点√  批量管理指定标签的PodKubernetes常用的控制器√  ReplicaSet√  Deployment√  DaemonSet√  Job√  CronJob√  Statefulset实战:√  在每一个节点部署nginx服务√  实现nginx服务的弹性伸缩√  快速实现企业nginx服务的滚动升级√  创建一次性和周期性任务Kubernetes网络及服务√  Kubernetes网络模型√  Pod网络实现方式√  Calico 网络插件及部署√  Service的作用√  通过服务发现的服务访问流程实战:√  实现POD与POD通信√  实现POD与NODE通信√  实现nginx和http服务外部访问Kubernetes 负载均衡√  IPTABLES模式实现原理√  IPVS模式实现原理√  Ingress的原理讲解和使用实战:√  实现HTTP的负载均衡√  创建IngressKubernetes存储√  EmptyDir√  hostPath√  NFS√  PV和PVC√  StorageClass√  ConfigMap介绍√  Secret介绍实战:√  实现POD间的共享存储√  向POD中分发机密信息√  创建使用StorageClassKubernetes资源调度√  Kubernetes资源管理√  Kubernetes调度器√  Kubernetes调度策略√  Kubernetes调度优先级和抢占机制√  Node策略和pod策略√  Taints和Toleration实战:√  为企业设置POD亲和性√  设置Kubernetes调度优先级√  将服务器设置为污点Kubernetes 安全√  访问API√  身份的验证与授权√  基于角色访问权限配置√  网络安全策略配置实战:√  为企业创建Kubernetes帐号√  设置帐号的权限√  验证权限√    配置Network Policy日志、监控、Troubleshooting和维护√  Kubernetes的日志方案√  Troubleshooting的方法论√  常见的场景排错√  维护模式(Cordon)√  疏散POD(Drain)实战:√  排查Kubernetes常见故障√  设置维护模式Helm包管理工具√  Helm简介√  使用Helm√  Chart简介√  Chart模板的使用实战:√  通过helm为企业部署Web√  通过helm构建WordPress博客平台√  使用Helm实现企业应用的升级与回滚 考前辅导:√  考试卷购买√  考试预约流程√  考试环境介绍√  考前辅导,真题讲解

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值