戳蓝字“CSDN云计算”关注我们哦!

容器技术是这两年热门的话题,因为容器技术给我们带来了很多方便的地方,节约了不少成本,不管是在运维还是开发上。今天,就让我们来看看关于容器更加有深度的问题吧。

1

Q:宿主如果和容器系统不同的话,那不是和虚拟机一样,一层层的调用,那么Docker和虚拟机还有什么差别?

A:要把Windows和Linux分清楚,更要把内核(kernel)和用户空间(userland)分清楚。容器内的进程是直接运行于宿主内核的,这点和宿主进程一致,只是容器的userland不同,容器的 userland由容器镜像提供,也就是说镜像提供了rootfs。假设宿主是Ubuntu,容器是CentOS。CentOS 容器中的进程会直接向Ubuntu宿主内核发送syscall,而不会直接或间接的使用任何 Ubuntu 的 userland 的库。

这点和虚拟机有本质的不同,虚拟机是虚拟环境,在现有系统上虚拟一套物理设备,然后在虚拟环境内运行一个虚拟环境的操作系统内核,在内核之上再跑完整系统,并在里面调用进程。

还以上面的例子去考虑,虚拟机中,CentOS的进程发送syscall内核调用,该请求会被虚拟机内的CentOS的内核接到,然后CentOS内核访问虚拟硬件时,由虚拟机的服务软件截获,并使用宿主系统,也就是Ubuntu的内核及userland的库去执行。

而且,Linux和Windows在这点上非常不同。Linux的进程是直接发syscall的,而Windows则把 syscall隐藏于一层层的DLL服务之后,因此Windows的任何一个进程如果要执行,不仅仅需要 Windows内核,还需要一群服务来支撑,所以如果Windows要实现类似的机制,容器内将不会像Linux这样轻量级,而是非常臃肿。看一下微软移植的Docker就非常清楚了。

所以不要把Docker和虚拟机弄混,Docker容器只是一个进程而已,只不过利用镜像提供的 rootfs提供了调用所需的userland库支持,使得进程可以在受控环境下运行而已,它并没有虚拟出一个机器出来。

2

Q:如果 Docker 升级或者重启的话,那容器是不是都会被停掉然后重启啊?

      A:在 1.12 以前的版本确实如此,但是从 1.12 开始,Docker 引擎加入了 --live-restore 参数,使用该参数可以避免引擎升级、重启导致容器停止服务的情况。

默认情况该功能不会被启动,如需启动,需要配置 docker 服务配置文件。比如 Ubuntu 16.04 这类 systemd 的系统,可以修改 /etc/systemd/system/multi-user.target.wants/docker.service 文件,在 ExecStart= 后面配置上 --live-restore:


ExecStart=/usr/bin/dockerd \--registry-mirror=https://registry.docker-cn.com \--live-restore


上面的格式中使用了行尾 \ 的换行形式,这点和 bash 脚本一样,systemd 支持这种换行形式,如对此不了解可以先去学习 bash 程序设计。

需要注意的是,--live-restore 和 Swarm Mode 不兼容,所以在集群环境中不要使用。实际上集群环境也不用担心某个服务器重启的问题,因为其上的服务都会被调度到别的节点上,因此服务并不会被中断。

3

      Q:怎么固定容器 IP 地址?每次重启容器都要变化 IP 地址怎么办?

      A:一般情况是不需要指定容器 IP 地址的。这不是虚拟主机,而是容器。其地址是供容器间通讯的,容器间则不用 IP 直接通讯,而使用容器名、服务名、网络别名。

为了保持向后兼容,docker run 在不指定 --network 时,所在的网络是 default bridge,在这个网络下,需要使用 --link 参数才可以让两个容器找到对方。

但这是有局限性的,因为这个时候使用的是 /etc/hosts 静态文件来进行的解析,比如一个主机挂了后,重新启动IP可能会改变。虽然说这种改变Docker是可能更新/etc/hosts文件,但是这有诸多问题,可能会因为竞争冒险导致 /etc/hosts 文件损毁,也可能还在运行的容器在取得 /etc/hosts 的解析结果后,不再去监视该文件是否变动。种种原因都可能会导致旧的主机无法通过容器名访问到新的主机。

如果可能不要使用这种过时的方式,而是用下面说的自定义网络的方式。而对于新的环境(Docker 1.10以上),应该给容器建立自定义网络,同一个自定义网络中,可以使用对方容器的容器名、服务名、网络别名来找到对方。这个时候帮助进行服务发现的是Docker 内置的DNS。所以,无论容器是否重启、更换IP,内置的DNS都能正确指定到对方的位置。

4

Q:如何修改容器的 /etc/hosts 文件?

A:容器内的 /etc/hosts 文件不应该被随意修改,如果必须添加主机名和 IP 地址映射关系,应该在 docker run 时使用 --add-host 参数,或者在 docker-compose.yml 中添加 extra_hosts 项。不过在用之前,应该再考虑一下真的需要修改 /etc/hosts 么?如果只是为了容器间互相访问,应该建立自定义网络,并使用 Docker 内置的 DNS 服务。

5

Q:怎么映射宿主端口?Dockerfile 中的EXPOSE和 docker run -p 有什么区别?

    A: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 的端口,随机映射到宿主的某个端口。

小伙伴们冲鸭,后台留言区等着你!

关于容器,今天你学到了什么?还有哪些不懂的?除此还对哪些话题感兴趣?快来留言区打卡啦!留言方式:打开第XX天,答:……

同时欢迎大家搜集更多问题,投稿给我们!风里雨里留言区里等你~

----------------    --------------

1.微信群:

添加小编微信:color_ld,备注“进群+姓名+公司职位”即可,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!

2.征稿:

投稿邮箱:liudan@csdn.net;微信号:color_ld。请备注投稿+姓名+公司职位。

推荐阅读

  • Kafka学习笔记

  • “拼多多”惊爆重大 Bug!程序员的眼泪,羊毛党的狂欢

  • “黄鳝门”视频女主播一审宣判!

  • 12306能扛住明星出轨这种流量冲击吗?

  • V神说,解释以太坊2.0最好的文章就是这篇了

  • 以太坊升级的拖油瓶,竟只是这几行代码

  • 程序员有话说 | 程序猿在乘地铁的时候都在想什么?  推 荐 

点击“阅读原文”,打开 CSDN App 阅读更贴心!

喜欢就点击“好看”吧!

容器精华问答 | Docker和虚拟机有什么差别?相关推荐

  1. 容器精华问答 | 虚拟机和容器的区别是什么?

    戳蓝字"CSDN云计算"关注我们哦! 云计算的发展日新月异,新技术层出不穷,尤其容器技术自2013年Docker容器问世以来一路高歌猛进红遍大江南北,与虚拟机相比,容器更显优势,有 ...

  2. 容器精华问答 | 如何进行跨机器的Container做Link ?

    戳蓝字"CSDN云计算"关注我们哦! 云计算的发展日新月异,新技术层出不穷,尤其容器技术自2013年Docker容器问世以来一路高歌猛进红遍大江南北,与虚拟机相比,容器更显优势,有 ...

  3. Docker精华问答 | Docker vs VM

    在计算机技术日新月异的今天, Docker 在国内发展的如火如荼.特别是在一线互联网公司 Docker 的使用是十分普遍的,甚至成为了一些企业面试的加分项,那么今天我们继续关于Docker 的精华问答 ...

  4. 有问有答 | 容器精华问答,如何玩转容器服务?

    戳蓝字"CSDN云计算"关注我们哦! 容器这个词,当你第一眼看它或许脑子里是这东西:瓶瓶罐罐.装水.装其他东西的玩意.不管是什么,总的来说,容器给人第一印象就是--"装& ...

  5. 虚拟化精华问答 | 如何为虚拟机分配任务?

    虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机.今天就让我们来看看关于虚拟化的精华问答吧. 1 Q:在一台特定的服务器上,每一个虚拟机是否可以运行任何版本的Windows? A:服务器虚拟 ...

  6. Docker精华问答 | Docker镜像和Docker容器的关系?

    毫无疑问,Docker成了近些年来最火热,甚至最具颠覆性的技术之一.国际上,所有泛云计算相关的公司,几乎都在某种程度上宣布支持并集成Docker.在2014年6月的DockerCon中,很多公司都分享 ...

  7. dockerfile如何运行镜像内的脚本_Docker精华问答 | Docker commit如何用?

    Docker 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本!使用 Docker,可以让应用的部署.测试和分发都变得前所未有的高效和轻松! 1 ...

  8. Docker精华问答 | Docker commit如何用?

    Docker 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本!使用 Docker,可以让应用的部署.测试和分发都变得前所未有的高效和轻松! 1 ...

  9. 容器精华问答 | 我们为什么需要容器?

    戳蓝字"CSDN云计算"关注我们哦! 容器技术是这两年热门的话题,因为容器技术给我们带来了很多方便的地方,节约了不少成本,不管是在运维还是开发上.今天,就让我们来看看关于容器更加有 ...

最新文章

  1. javascript运动系列第九篇——碰撞运动
  2. MSN 无法登录 错误代码 8007007e
  3. 【转】Tomcat7启动的总过程 (有时间自己写下tomcat8的)
  4. oracle 怎么备份sqlserver数据库,Oracle和sqlserver数据库的备份与恢复
  5. c#调用带有安全认证的java webservice
  6. 两个JS文件使用全局变量并互相调用funciton,JS判断checkbox状态,延迟执行JS语句
  7. 08 Javascript的函数
  8. Visual C++ MSDEV.exe 应用程序错误
  9. c++学习 | MFC —— 控件介绍
  10. Excel如何将数据上下调换位置
  11. 如何走向真正的智能?
  12. Arduino UNO u8glib显示中文-亲测可用
  13. C++ 使用chrono库准确统计代码运行时间
  14. 网易云音乐的亏损,是社区经济的通病?
  15. 自己写的基金投资分析系统,这只基你们觉得怎么样?
  16. Autofac注册组件(3)
  17. World Streamer学习4
  18. 聚划算平台上多个商品怎样一次采集分类保存
  19. Anaconda环境下安装opencv
  20. ARM涨价背后,软银打了什么如意算盘?

热门文章

  1. android style边界显示兼容问题,android – IDE“无法解析@ style/Theme.Appcompat”时使用v7兼容性支持主题...
  2. 的使用go_使用 Go 开发 Prometheus Exporter
  3. 数学老师出的语文试卷,哈哈哈
  4. 揭秘5位爬藤“牛娃” 他们吸引藤校的到底是什么?
  5. 当我们群嘲假博士时,不要忘了真博士们的艰辛
  6. 工地上收到北大录取通知书,但他说的这句话更动人!
  7. 设置python路径
  8. 找出二维数组中每行的最小数但最小数的列不能相同
  9. bLue的除法算术题 数学
  10. Canal Mysql binlog 同步至 Hbase ES