生产中的Docker,源数据,数据库数据,更新过程

时间:2018-11-16 13:10:31

标签: docker docker-compose production-environment

我刚刚开始使用docker,现在我在生产环境中对docker有一些疑问。

  1. 首先,我应该在产品服务器上使用哪些权限?我应该创建非root用户并在该用户下运行docker吗?还是没关系。

  2. 关于防火墙,我应该为Docker打开端口吗?

  3. 对我来说最大的问题-我应该在哪里存储应用程序的源代码?在撰写文档时,我应该将所有源代码都移入图像,避免完全使用https://docs.docker.com/compose/production/的卷绑定。但是在这种情况下,使用git进行更新的过程将如何?这是否意味着我每次都会更新所有图像?

  4. 如何使用compose将所有源移动到图像中?

  5. 在哪里将DB数据存储在容器中,还是应该使用卷将其绑定?

  6. 容器的权限如何?我应该在容器内创建一个非root用户吗?在使用docker之前,这是最佳做法,是最佳做法,但是使用docker,我看不到任何原因。

2 个答案:

答案 0 :(得分:4)

  1. 任何可以运行任何docker命令的用户都可以不受限制地访问系统(例如,您可以docker run -v /:/host --rm -it -u root busybox sh对主机文件系统进行任意更改)。您可以将内容锁定得很少,但是“逃离盒子”非常容易。考虑在系统上使用专用的协调器(Docker Swarm,Kubernetes,Amazon ECS,Nomad等)和 only 运行Docker容器。

  2. 如果您有某种防火墙,可以,您需要打开Docker应用程序在外部侦听的端口。 (并且在AWS环境中,还允许他们进入安全组。)

  3. 您使用docker build根据源代码创建图像。在生产环境中,您通常不希望手动将源代码与正在构建的图像一起推送。支持此功能的两个关键部分是Docker注册表(Docker Hub,Amazon ECR,Google GCR,运行您自己的)和一个持续集成系统(Jenkins很流行,或者有数十亿个基于云的系统)。设置CI系统,以便对源存储库的每次提交都创建一个新的唯一标记的映像。部署映像的特定版本。

  4. 将您的源代码管理放到幸福的家(GitHub,Bitbucket,Subversion,Perforce等)。

  5. 您不知道。源代码已内置到映像中。考虑使用可远程访问的专用协调器(除了Docker Compose以外,几乎可以进行其他操作),以便您的CI系统可以将您的部署更新到最新版本。

  6. 永远不要将数据“存储在容器中”:它们经常被删除,并且关联的数据将丢失。我个人建议在Docker之外的专用主机上运行数据库,但是有一种说法也可以在Docker中运行所有内容。只需确保正确使用卷或主机目录来存储实际数据,然后进行备份并练习还原即可。 (“所有Docker”的观点是克隆和还原整个环境非常容易。)

  7. 在Docker容器中使用非root用户通常仍被视为最佳实践。通常,它并不重要,但是如果您确实遇到某种安全问题,它至少可以保护应用程序免于在容器内部重写其自己的代码。

答案 1 :(得分:0)

首先,我将用于生产的docker-stack而不是compose用于生产。它是兼容的,不需要其他安装,并且具有某些服务修复功能。对你的问题。

  1. 您创建一个单独的用户并将其放入特定的docker组
  2. 这取决于您正在运行的容器以及群集/堆栈 组态。如果您使用单台计算机,则不需要其他端口
  3. 您可以将文件系统持久层安装到主机系统,也可以使用专用的卷。通常,您的程序代码是docker映像之一的一部分,是创建映像的CI流程的一部分。
  4. 如前所述,您在创建docker映像时执行此操作。在dockerfile中定义了对源的引用。
  5. 为获得更好的概述,我在简单安装中使用了主机系统中挂载到docker容器中的目录。
  6. 直到今天,我从未更改容器内的权限,也未发现任何缺点

docker世界中使用的术语:

  • 图像-与软件开发中的类相同
  • 容器-在运行时根据图像构建的对象-内部基本上没有持久性
  • Dockerfile-描述如何构建映像以及从哪个“父”映像派生
  • 卷-Docker容器文件系统扩展,用于将非持久性容器链接到主机文件系统或其他容器
  • 主机-运行docker的der Machine