本文是我自己在学习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. phantomjs和selenium模拟登陆qq空间

    # -*- coding: utf-8 -*- from selenium import webdriver import time driver =webdriver.PhantomJS() dri ...

  2. Oracle 根据逗号分隔字符串 同时记录一波坑

    报表需要过滤掉不需要的数据,由于报表是根据零件编号来统计,需要过滤掉不合格品,只能根据关联的物料编码(零件编号)来过滤,只能通过not in来过滤,但是天真的我却用下面代码来当子查询: b.part_ ...

  3. HDU5037 Frog

    Once upon a time, there is a little frog called Matt. One day, he came to a river. The river could b ...

  4. 洛谷P3144 [USACO16OPEN]关闭农场Closing the Farm

    农夫约翰和他的奶牛准备去旅行,所以约翰想要把他的农场临时关闭. 农场有N个牛棚(牛棚从1到N编号),有M条路连接这些牛棚(1≤N,M≤3000). 约翰打算挨个关闭牛棚,在关牛棚的时候, 他突然想起一 ...

  5. 多目录,多可执行文件的Makfile的编写

    1.前言 在目前的工作中,我遇到这样的一个工作情景,可以认为我要开发一个库,这个库的有多个模块,每个模块的.c放到src中,.h放到include中,这应该是个标准做法. drwxr-xr-x. ro ...

  6. [MySQL] 锁/死锁问题一例

    MySQL锁/死锁问题 在MySQL中, 不同事务隔离级别下, 锁的情况表现是不同的, 另外表的设计上有无索引也是一个因素. 做一个小的实验测试InnoDB锁表现 -:) 说明 事务隔离级别 READ ...

  7. 浅谈密码加SALT原理(转载)

    原文出处:http://www.2cto.com/Article/201201/117051.html 我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例 ...

  8. windows 中使用hbase 异常:java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.

    平时一般是在windows环境下进行开发,在windows 环境下操作hbase可能会出现异常(java.io.IOException: Could not locate executable nul ...

  9. PE文件从文件加载到内存,再从内存读取,然后存盘到文件

    // mem.cpp : 定义控制台应用程序的入口点. //PE文件从文件加载到内存,再从内存读取,然后存盘到文件 #include "stdafx.h" #include < ...

  10. mysql故障(主从复制sql线程不运行)

    故障现象: 进入slave服务器,运行: mysql> show slave status\G ....... Relay_Log_File: localhost Relay_Log_Pos: ...