资讯专栏INFORMATION COLUMN

如何安全便捷地管理Docker船队

learning / 1490人阅读

摘要:但是我要介绍一下我的经验,我安装的方式和官网的也不同,和别人讲的也不同在这里我们没有暴露端口,而是使用了一个特殊的设置,就是这一点点小小的不同,会对你后面的操作影响巨大。

Docker

Docker是什么?如果说你的服务器是一条船,你只是一个小船主,你的船上散装着各种货物(也就是服务,比如http服务,数据库服务,缓存服务,消息服务等等),那么Docker就相当于把你的服务器改装成了一条集装箱货船,把你原先凌乱堆放的货物放置在一个一个容器里,互相隔离,有序堆放。我们来看看Docker的商标,是不是很形象呢?

但是你的业务越做越大,很明显一条船是装不下了,你需要一支船队:

这时候,如何管理船队就变成了一个难题,没有工具的帮忙,你甚至都不知道你有几条船,每条船上装的都是些什么货物,这些货物现在的状态如何。

Portainer

Portainer这个工具就是管理你船队的一个好帮手。并且它本身也是安装在一条船上,这条船就是你的指挥艇吧(说实话这个图标有点丑,一点都没有船队老大的气质)。

怎么安装Portainer呢?这个别人早都已经介绍过了,包括官网上也有说明。但是我要介绍一下我的经验,我安装Portainer的方式和官网的也不同,和别人讲的也不同:

docker run -d --network=host --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

在这里我们没有暴露9000端口,而是使用了一个特殊的设置:--network=host,就是这一点点小小的不同,会对你后面的操作影响巨大。

Docker API

光装上Portainer是没有用的,它充其量也只能管理它所在的这条船。

它怎么管理整个船队呢?首先你得建立Portainer和船队里其它船只之间的联系。这个联系就是让被管理的船只暴露出Docker API接口来。但是如果你查看Docker官方的说明文档,把整个过程弄得极其复杂无比,又要建立什么安全证书中心,又要颁发证书,没有初中以上文化是搞不定的。

Docker本来是有一套简便的暴露端口的方法的,为什么官网要搞这么复杂呢?因为原先的方法比较简单,会直接把整个管理界面全部暴露给公网,有极大的安全风险,所以Docker官网搞了一套复杂的认证流程。

我们的解决思路比较简单:你不要把端口暴露给公网不就行了吗?加一个防火墙,只让我们允许的地址来访问就可以了,何必搞什么CA认证!

回到我们的被管理的船上,把API端口先暴露出来:

# systemctl edit docker
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375

好吧,这只是CentOS 7下的一种作法,还有一种作法是修改/etc/sysconfig/docker文件:

OPTIONS="--selinux-enabled --log-driver=journald --signature-verification=false -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375"

具体应该用哪种作法,要取决于你的docker服务是怎么设置的:

systemctl show docker | grep EnvironmentFile

你如果有EnvironmentFile设定,那么你就需要用上面第二种办法,如果没有,就用第一种办法。

iptables

好了,现在端口是暴露出来了,但是全公网任何人都能访问,安全性怎么办?这时候我们发现一个严重的问题:Docker在乱搞我们的iptables表!

iptables是很重要的防火墙的设置,docker为了暴露它的服务,它会忽视你设置在iptables表里的一切规则,强行让它的规则生效。这还了得?我们必须禁止Docker这么胡搞,在上面的options里再加上一个选项--iptables=false

OPTIONS="--selinux-enabled --log-driver=journald --signature-verification=false -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375" --iptables=false

重启Docker服务后,它终于不再乱动我们的iptables表了。实际上为了安全起见,我们应该在所有docker服务器上都加上--iptables=false的选项。但是这样又产生了另外一个问题:外部访问固然是阻止了,但我们的Docker容器想访问外部也访问不了了,比如我们一开始安装的Portainer也是运行在容器里的,不能访问互联网,它就没有办法管理其它Docker服务器了。为了解决这个问题,需要我们在建立Docker容器的时候指定--network=host,这也就是本文一开始安装Portainer时候那样设置的原因。

好,现在各个被管理端的2375端口是开开了,但是除了localhost谁也访问不了它,怎么办?我们可以在iptables里增加一条规则:

-A INPUT -s ###.###.###.### -m state --state NEW -m tcp -p tcp --dport 2375 -j ACCEPT

上面那个###.###.###.###就是你的Portainer指挥艇服务器的IP地址。这样一来,除了这台指挥艇服务器可以访问被管理船只的Docker API接口以外,别的任何人都不能访问。这样就既达到了我们管理的目的,又保证了安全,同时还免出去了设置证书的繁琐。

启航吧,船队!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/27464.html

相关文章

  • Docker和容器云落一年后的反思

    摘要:这里我想从我在谷歌内部使用容器,并基于容器研发大规模生产平台的经验中谈谈现有和谷歌容器环境的差别,并通过的实际案例落地经验总结下自身所带来的一些谎言和误区。 我与容器的缘分起源于我在 Google 内部研发容器集群管理系: Cluster Management。谷歌内部一切皆容器,搜索、视频、大数据、内部工具等核心业务都以容器的方式运行在容器编排系统 Borg 上。2014年,随着公司...

    _ang 评论0 收藏0
  • Docker学习与和应用(一)_初步认识

    摘要:分别进行配置和测试。也就是说对于开发和部署来说,使用可以更快速的交付和部署应用环境。更便捷的应用更新管理。使用镜像创建并启动一个容器。执行用户指定的应用程序。执行完毕后,容器被终止。 Docker是为应用的开发和部署提供的一站式容器解决方案,它能帮助开发者高效快速的构建应用,实现Build,Ship and Run Any App, Anywhere,从而达到一次构建,到处运行的目的。...

    kgbook 评论0 收藏0
  • 移动云平台的基础架构之旅(二)- 云代码篇

    摘要:作为一款优秀的平台系统,其云代码的功能如何,是如何实现的,又有哪些加分项,接下来将为大家一一揭晓。当然为了开发者更快的开始,同时提供了和项目来让开发者更快接触云代码。 云代码的由来 随着MBaaS的发展,取代移动企业应用程序平台的趋势也越来越明显。MBaaS系统为了让企业能方便快捷的开发自己移动应用程序,提供了诸多移动客户端支持,有最通用的REST API,也有方便移动开发者的软件开发...

    Carson 评论0 收藏0
  • 曾金龙:迅雷云的Docker开发实践

    摘要:问能否谈一下迅雷云使用的过程其实最初的时候,迅雷团队对是怀有谨慎的态度的。三调度算法是迅雷云定制优化的。迅雷在使用这方面一直没有把数据层面交给迅雷云之外的系统。 非商业转载请注明作译者、出处,并保留本文的原始链接:http://www.ituring.com.cn/article/201256 曾金龙就职于迅雷网络,是国内覆盖面最广的迅雷P2P引擎核心研发成员。他毕业于中山大...

    iflove 评论0 收藏0
  • 阿里云容器服务新增支持Kubernetes编排系统,性能重大提升

    摘要:年底首次开启阿里云容器服务公测年月正式商业化年月成为国内唯一合作伙伴并推出专有云企业版,月实现产品国际化。阿里云容器服务为增加了阿里云云盘和等分布式存储服务支持。阿里云容器服务为此进一步提升了易用性,降低了部署管理和应用开发门槛。 摘要: 作为容器编排系统的两大流派, Kubernetes和Swarm的重要性不言而喻。融合了两大高性能集成的阿里云容器服务,不仅可以降低50%的基础架构成...

    keelii 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<