➤ 自顾不暇的系统管理员如何面对开发人员的“Challenge”?
6 月 27 日,开展了一个关于“系统管理员 Docker ”的网络研讨会。这个研讨会基于日常生活中的常见场景:系统管理员坐在桌旁忙自己的事情的时候,开发人员走了进来,说:“这是新的应用程序,它被打包在 Docker 镜像里了,请尽快部署。”因此,该会议旨在为系统管理员提供管理容器化应用程序的一些指导。(视频地址(需翻墙):https://www.youtube.com/watch?v=kT76aLugp48)
➤ 北美 Moby 峰会与开源峰会
下一届 Moby 峰会将于 2017 年 9 月 14 日在洛杉矶举行,作为北美开源峰会的一部分。继以前版本的成功之后,我们将保持同样的会议形式,其中包括早上的短暂的技术讲座/演示,下午的一些非正式的交流会议。于此同时,我们正在寻找可以谈论他们的 Moby 项目的使用情况的人。
➤ 使用 Docker Secrets 保护 Atsea App
将应用程序配置信息作为环境变量传递曾经被认为是 12 因素应用程序中的最佳实践。虽然这种做法可以在日志中显示信息,但是它难以追踪信息暴露的方式和时间。与使用环境变量不同的是,Docker 使用 secrets 来管理系统配置和机密信息。
➤ 使用 Pod 安全策略保护 Kubernetes 群集
随着容器技术的逐渐成型和越来越多的应用程序向着集群环境转型,明确和实施集群安全策略变得越来越重要。集群安全策略提供了一个框架,来确保 pod 和容器仅仅只能使用适当的权限和访问有限的资源集。安全策略还为集群管理者提供了一种方法,以通过限制特定成员、组或命名空间的可用功能,来控制资源的创造。
本文将向您介绍 Kubernetes 中的 pod 安全策略。由于 pod 安全策略可能特定于组织的规则和特定应用程序的要求,所以没有一个适合所有情况的方法 -我们将讨论三种常见情况,并引导您针对个人的实际情况来创建 pod 安全策略。
情况1:防止 Pod 以 Root 权限运行
限制 pod 中的容器以 root 用户身份运行,从而创建更安全的群集环境是 pod 安全策略最常见的用途之一。情况2:阻止 Pod 访问某些卷类型
作为集群管理者,您可能希望限制容器的可用存储选择,以最小化成本或阻止信息访问。这可以通过在 pod 安全策略的卷密钥中指定可用卷类型来实现。
情况3:防止 Pod 访问主机端口
另一个常见的安全问题是容器可以访问主机资源,如主机端口或网络接口。 Pod 安全策略允许集群管理员实施深入的安全规则来限制此类访问。
➤ 将您的第一个镜像发布到 Docker Hub
感谢各位关注我们之前关于 Docker 的推文,让我们潜入探索更多吧。你们已经明白了如何运行一个容器并且拉取镜像,现在我们要为别人发布我们的镜像。我们需要一些什么东西呢?
Docker文件
你的应用程序
为什么我们需要Docker文件呢?
按以往的传统,我们有一个应用程序(假设是 Python 应用),那么我就需要在计算机中安装一个 Python 的运行环境(或者所有的依赖)。这也产生了一个问题:当你在本地,或者是在服务器上运行该应用程序时,运行环境必须与我们的相同。当基于 Docker 运行时,你不再需要任何东西(不需要环境)。你可以将可移植的 Python 环境作为镜像,不再需要安装。然后,你的构建可以将应用程序代码和基本 Python 镜像包含在一起,确保应用程序,其依赖关系和环境都一起运行。这些可移植的镜像被称为 Docker 文件。
Docker 文件是容器中的环境文件,它有助于为你的容器创建一个隔离的环境。比如哪些端口将暴露于外部,哪些文件你想要“复制”到环境中。之后,你在这个 Docker 文件中定义的应用程序的构建将在任何地方都正常运行。
让我们创建一个新目录并建立一个 Docker 文件。
FROM python:3.6WORKDIR /appADD . /appRUN pip install -r requirements.txtEXPOSE 80ENV NAME worldCMD [“python”, “app.py”]复制代码
现在你已经创建好了 Docker 文件。你可以看到它的语法非常简单易懂。
下一步是创建一个 python 应用。
from flask import Flaskimport osimport socketapp = Flask(__name__)@app.route("/")def hello():html = "Hello {name}!
" \"Hostname: {hostname}"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