本文是我自己在学习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) 等等,歪果仁也懒得打字啊。

关于Docker&kubernetes的一些问题的更多相关文章

  1. GitLab + Jenkins + Docker + Kubernetes。

    目前方案是GitLab + Jenkins + Docker + Kubernetes. 方案的工作流程如下:首先,开发人员提交代码代码提交:随后,GitLab 会自动触发Jenkins job,Je ...

  2. Docker&Kubernetes沙龙干货集锦:容器集群管理利器kubernetes详谈-CSDN.NET

    Docker&Kubernetes沙龙干货集锦:容器集群管理利器kubernetes详谈-CSDN.NET undefined Package - crawler undefined 科学网- ...

  3. 7月19日Docker&Kubernetes技术沙龙总结 - DockOne.io

    7月19日Docker&Kubernetes技术沙龙总结 - DockOne.io undefined

  4. Docker Kubernetes 项目

    Kubernetes 是 Google 团队发起并维护的基于Docker的开源容器集群管理系统,它不仅支持常见的云平台,而且支持内部数据中心. 建于Docker之上的Kubernetes可以构建一个容 ...

  5. Docker Kubernetes 环境搭建

    Docker Kubernetes 环境搭建 节点规划 版本 系统:Centos 7.4 x64 Docker版本:18.09.0 Kubernetes版本:v1.8 etcd存储版本:etcd-3. ...

  6. Docker Kubernetes 常用命令

    Docker Kubernetes 常用命令 增 # 通过文件名或标准输入创建资源. kubectl create # 读取指定文件内容,进行创建.(配置文件可指定json,yaml文件). kube ...

  7. Docker Kubernetes 查询字段说明

    Docker Kubernetes  查询字段说明 # 打印受支持的API版本 kubectl api-versions # 扩展 apiextensions.k8s.io/v1beta1 # 注册 ...

  8. Docker Kubernetes 命令行创建容器

    Docker Kubernetes 命令行创建容器 环境: 系统:Centos 7.4 x64 Docker版本:18.09.0 Kubernetes版本:v1.8 管理节点:192.168.1.79 ...

  9. Docker Kubernetes 创建管理 Pod

    Docker Kubernetes 容器扩容与缩容 环境: 系统:Centos 7.4 x64 Docker版本:18.09.0 Kubernetes版本:v1.8 管理节点:192.168.1.79 ...

  10. Docker Kubernetes 创建管理 Deployment

    Docker Kubernetes YAML文件创建容器 通过创建Deployment来管理pods从而创建容器.它会同时创建容器.pod.以及Deployment ! 环境: 系统:Centos 7 ...

随机推荐

  1. SICAU-OJ: 数字游戏

    数字游戏 题意:给出一个长度为n的数字,然后抹去k个数,使得剩下的数最大. 题解: 贪心的思想:让答案串中每一位尽可能大. 我们肯定要用完这k次的,假设有一个答案字符串ans,我们现在遍历给出的串,假 ...

  2. linux -特殊符号

    在shell中常用的特殊符号罗列如下: # ;   ;; . , / \\ 'string'| !   $   ${}   $? $$   $* \"string\"* **   ...

  3. 当表名存在 点 的时候,EntityFramework的写法

    原文发布时间为:2011-05-17 -- 来源于本人的百度文章 [由搬家工具导入] 需要在 Context 中,重写 DbContext 中的 OnModelCreating 方法 进行 mappi ...

  4. python requests高级耍法

    昨天,我们更多的讨论了request的基础API,让我们对它有了基础的认知.学会上一课程,我们已经能写点基本的爬虫了.但是还不够,因为,很多站点是需要登录的,在站点的各个请求之间,是需要保持回话状态的 ...

  5. 获取Json对象的长度以及判断json对象是否为空

    (如有错敬请指点,以下是我工作中遇到并且解决的问题) = = = = = = = = = = = = = = = =  获取Json对象的长度  = = = = = = = = = = = = = = ...

  6. python实现并发获取html的几种方式

    1.线程池 from concurrent.futures import ThreadPoolExecutor import requests from fake_useragent import U ...

  7. WCF使用小例子

    using System.Runtime.Serialization; using System.ServiceModel; using MySpace; using System.ServiceMo ...

  8. linux题目整理(一)

    1.Linux如何挂载windows下的共享目录? mount.cifs /IP地址/server/ /mnt/server -O user=administrator password=yourpa ...

  9. 程序员面试京东前端,现场JavaScript代码写出魔方特效

    程序员面试京东前端,现场JS代码写出魔方特效,成功搞定20K月薪 今天小编我逛论坛,看到了一位程序员小伙子,因为是有了两年工作经验,然后去京东面试前端岗,一面二面轻松就过了,到了技术面这一块,小伙干脆 ...

  10. PostgreSQL(EXCEPT,INTERSECT)

    except 可以查看表一对表二不一样的数据,有点像是对表一进行表一表二交集的反集的交集,好绕: intersect 可以查看表一和表二一样的数据,求交集: select t1.name,t1.age ...