自顾不暇的系统管理员如何面对开发人员的“Challenge”?|航海日志 Vol.20

汇总一周容器圈热点资讯,让开发者了解最 in 的容器技术,让企业熟知最实时的国内外容器行业动态。

航海日志

 自顾不暇的系统管理员如何面对开发人员的“Challenge”?

sisadmin_EN-1

6 月 27 日,开展了一个关于“系统管理员 Docker ”的网络研讨会。这个研讨会基于日常生活中的常见场景:系统管理员坐在桌旁忙自己的事情的时候,开发人员走了进来,说:“这是新的应用程序,它被打包在 Docker 镜像里了,请尽快部署。”因此,该会议旨在为系统管理员提供管理容器化应用程序的一些指导。

视频地址(需翻墙):https://www.youtube.com/watch?v=kT76aLugp48

➤ 北美 Moby 峰会与开源峰会

6f1bb915-2e19-439d-aab2-ee5c4ac62493

下一届 Moby 峰会将于 2017 年 9 月 14 日在洛杉矶举行,作为北美开源峰会的一部分。继以前版本的成功之后,本次峰会将保持同样的会议形式,其中包括早上的短暂的技术讲座/演示,下午的一些非正式的交流会议。于此同时,大会正在寻找可以谈论他们的 Moby 项目的使用情况的人。想要了解更多信息可点击文后连接,持续关注 Moby 峰会。

➤ 使用 Docker Secrets 保护 Atsea App

088fc671-e653-4dd1-9268-41e3d777163b-3

将应用程序配置信息作为环境变量传递曾经被认为是 12 因素应用程序中的最佳实践。虽然这种做法可以在日志中显示信息,但是它难以追踪信息暴露的方式和时间。与使用环境变量不同的是,Docker 使用 secrets 来管理系统配置和机密信息。

➤ 使用 Pod 安全策略保护 Kubernetes 群集

d6ca7bcb0a46f21fa83440c6f5246b600c33ae26

随着容器技术的逐渐成型和越来越多的应用程序向着集群环境转型,明确和实施集群安全策略变得越来越重要。集群安全策略提供了一个框架,来确保 pod 和容器仅仅只能使用适当的权限和访问有限的资源集。安全策略还为集群管理者提供了一种方法,以通过限制特定成员、组或命名空间的可用功能,来控制资源的创造。

本文将向您介绍 Kubernetes 中的 pod 安全策略。由于 pod 安全策略可能特定于组织的规则和特定应用程序的要求,所以没有一个适合所有情况的方法 -我们将讨论三种常见情况,并引导您针对个人的实际情况来创建 pod 安全策略。

  情况1:防止 Pod 以 Root 权限运行

限制 pod 中的容器以 root 用户身份运行,从而创建更安全的群集环境是 pod 安全策略最常见的用途之一。

情况2:阻止 Pod 访问某些卷类型

作为集群管理者,您可能希望限制容器的可用存储选择,以最小化成本或阻止信息访问。这可以通过在 pod 安全策略的卷密钥中指定可用卷类型来实现。

  情况3:防止 Pod 访问主机端口

另一个常见的安全问题是容器可以访问主机资源,如主机端口或网络接口。 Pod 安全策略允许集群管理员实施深入的安全规则来限制此类访问。

➤ 将您的第一个镜像发布到 Docker Hub

docker-hub-diagram

感谢各位关注我们之前关于 Docker 的推文,让我们潜入探索更多吧。你们已经明白了如何运行一个容器并且拉取镜像,现在我们要为别人发布我们的镜像。我们需要一些什么东西呢?

  • Docker文件
  • 你的应用程序

为什么我们需要 Docker 文件呢?

按以往的传统,我们有一个应用程序(假设是 Python 应用),那么我就需要在计算机中安装一个 Python 的运行环境(或者所有的依赖)。这也产生了一个问题:当你在本地,或者是在服务器上运行该应用程序时,运行环境必须与我们的相同。当基于 Docker 运行时,你不再需要任何东西(不需要环境)。你可以将可移植的 Python 环境作为镜像,不再需要安装。然后,你的构建可以将应用程序代码和基本 Python 镜像包含在一起,确保应用程序,其依赖关系和环境都一起运行。这些可移植的镜像被称为 Docker 文件。

Docker 文件是容器中的环境文件,它有助于为你的容器创建一个隔离的环境。比如哪些端口将暴露于外部,哪些文件你想要“复制”到环境中。之后,你在这个 Docker 文件中定义的应用程序的构建将在任何地方都正常运行。

让我们创建一个新目录并建立一个 Docker 文件。

FROM python:3.6WORKDIR /appADD . /appRUN pip install -r requirements.txt

EXPOSE 80

ENV NAME world

CMD [“python”, “app.py”]

现在你已经创建好了 Docker 文件。你可以看到它的语法非常简单易懂。

下一步是创建一个 python 应用。

from flask import Flaskimport osimport socketapp = Flask(__name__)

@app.route(“/”)

def hello():

html = “<h3>Hello {name}!</h3>” \

“<b>Hostname:</b> {hostname}<br/>”

return html.format(name=os.getenv(“NAME”, “world”), hostname=socket.gethostname())

if __name__ == “__main__”:

app.run(host=’0.0.0.0′, port=80)

OK ! 你已经创建完了所有的必要文件,现在开始构建你的应用吧。

使用ls指令查看所有文件:

$ lsapp.py        requirements.txt        Dockerfile

创建镜像:

docker build -t imagebuildinginprocess .

新建的镜像在哪呢?它在本地的镜像注册表中。

$ docker imagesREPOSITORY                TAG                 IMAGE ID            CREATED             SIZEimagebuildinginprocess    latest              4728a04a9d39        14 minutes ago      694MB

运行它们。

docker run -p 4000:80 imagebuildinginprocess

我们在这里所做的是将端口 4000 映射到容器暴露的 80 端口。你应该可以看到 Python 提示我们的应用被部署在端口 http://0.0.0.0:80 。但是事实上,信息来源于内部的容器。它并不知道我们将 80 端口映射到了4000,使得服务的地址变成了 http://localhost:4000 。在浏览器中输入该地址,我们就会在网页上看到” Hellow World “和容器的编号。

我们将把我们的镜像推向注册表,这样我们就可以在任何地方使用它。Docker CLI 默认使用公共注册表。

用你的本地计算机登陆到 Docker 公共注册表。(如果你没有账号的话,去 cloud.docker.com 上注册吧)

docker login

  给镜像打标签:命名镜像的版本号。这不是必须的步骤,但是推荐你们这么做。因为这可以很好的帮助我们进行版本管理。(就像 ubuntu:16.04 和 ubuntu:17.04 那样)

docker tag imagebuildinginprocess rusrushal13/get-started:part1

  发布镜像:将你打过标签的镜像上传到仓库中。该操作完成后,你就可以在Docker Hub中看到你的新镜像和拉取指令。

docker push rusrushal13/get-started:part1

OK,大功告成,你已经成功的发布了第一个镜像!赶紧去 Docker Hub 中查看一下吧。

这个 GitHub 上的仓库有很大的参考价值,建议各位前去查看。( https://github.com/jessfraz/dockerfiles)

这一期的『航海日志』就到这里,下期再浪~

参考链接

  • https://blog.docker.com/2017/07/docker-sysadmin-webinar-qa/
  • https://blog.docker.com/2017/07/title-moby-summit-alongside-open-source-summit-north-america/
  • https://blog.docker.com/2017/07/securing-atsea-app-docker-secrets/
  • https://docs.bitnami.com/kubernetes/how-to/secure-kubernetes-cluster-psp/#assumptions-and-prerequisites
  • https://dev.to/rusrushal13/publish-your-first-image-to-docker-hub

Leave a Reply

Your email address will not be published. Required fields are marked *