java系统找不到指定文件怎么解决
259
2022-10-21
如何安全便捷地管理Docker船队【面试+工作】
Docker
Docker是什么?
Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。
docker就是类似的理念。现在都流行云计算了,云计算就好比大货轮。docker就是集装箱。
1.不同的应用程序可能会有不同的应用环境,比如.net开发的网站和php开发的网站依赖的软件就不一样,如果把他们依赖的软件都安装在一个服务器上就要调试很久,而且很麻烦,还会造成一些冲突。比如IIS和Apache访问端口冲突。这个时候你就要隔离.net开发的网站和php开发的网站。常规来讲,我们可以在服务器上创建不同的虚拟机在不同的虚拟机上放置不同的应用,但是虚拟机开销比较高。docker可以实现虚拟机隔离应用环境的功能,并且开销比虚拟机小,小就意味着省钱了。
2.你开发软件的时候用的是Ubuntu,但是运维管理的都是centos,运维在把你的软件从开发环境转移到生产环境的时候就会遇到一些Ubuntu转centos的问题,比如:有个特殊版本的数据库,只有Ubuntu支持,centos不支持,在转移的过程当中运维就得想办法解决这样的问题。这时候要是有docker你就可以把开发环境直接封装转移给运维,运维直接部署你给他的docker就可以了。而且部署速度快。
3.在服务器负载方面,如果你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker部署的话,这些内存就会利用起来。
总之docker就是集装箱原理。
如果说你的服务器是一条船,你只是一个小船主,你的船上散装着各种货物(也就是服务,比如API
光装上Portainer是没有用的,它充其量也只能管理它所在的这条船。
它怎么管理整个船队呢?首先你得建立Portainer和船队里其它船只之间的联系。这个联系就是让被管理的船只暴露出Docker API接口来。但是如果你查看Docker官方的说明文档 7下的一种作法,还有一种作法是修改/etc/sysconfig/docker文件:
具体应该用哪种作法,要取决于你的docker服务是怎么设置的:
systemctl show docker | grep EnvironmentFile
你如果有EnvironmentFile设定,那么你就需要用上面第二种办法,如果没有,就用第一种办法。
iptables
好了,现在端口是暴露出来了,但是全公网任何人都能访问,安全性怎么办?这时候我们发现一个严重的问题:Docker在乱搞我们的iptables表!
iptables是很重要的防火墙的设置,docker为了暴露它的服务,它会忽视你设置在iptables表里的一切规则,强行让它的规则生效。这还了得?我们必须禁止Docker这么胡搞,在上面的options里再加上一个选项--iptables=false:
重启Docker服务后,它终于不再乱动我们的iptables表了。实际上为了安全起见,我们应该在所有docker服务器上都加上--iptables=false的选项。但是这样又产生了另外一个问题:外部访问固然是阻止了,但我们的Docker容器想访问外部也访问不了了,比如我们一开始安装的Portainer也是运行在容器里的,不能访问互联网,它就没有办法管理其它Docker服务器了。为了解决这个问题,需要我们在建立Docker容器的时候指定--network=host,这也就是本文一开始安装Portainer时候那样设置的原因。
好,现在各个被管理端的2375端口是开开了,但是除了localhost谁也访问不了它,怎么办?我们可以在iptables里增加一条规则:
上面那个###.###.###.###就是你的Portainer指挥艇服务器的IP地址。这样一来,除了这台指挥艇服务器可以访问被管理船只的Docker API接口以外,别的任何人都不能访问。这样就既达到了我们管理的目的,又保证了安全,同时还免出去了设置证书的繁琐。
启航吧,船队!
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~