我刚刚开始使用docker,现在我在生产环境中对docker有一些疑问。
首先,我应该在产品服务器上使用哪些权限?我应该创建非root用户并在该用户下运行docker吗?还是没关系。
关于防火墙,我应该为Docker打开端口吗?
对我来说最大的问题-我应该在哪里存储应用程序的源代码?在撰写文档时,我应该将所有源代码都移入图像,避免完全使用https://docs.docker.com/compose/production/的卷绑定。但是在这种情况下,使用git进行更新的过程将如何?这是否意味着我每次都会更新所有图像?
如何使用compose将所有源移动到图像中?
在哪里将DB数据存储在容器中,还是应该使用卷将其绑定?
容器的权限如何?我应该在容器内创建一个非root用户吗?在使用docker之前,这是最佳做法,是最佳做法,但是使用docker,我看不到任何原因。
答案 0 :(得分:4)
任何可以运行任何docker
命令的用户都可以不受限制地访问系统(例如,您可以docker run -v /:/host --rm -it -u root busybox sh
对主机文件系统进行任意更改)。您可以将内容锁定得很少,但是“逃离盒子”非常容易。考虑在系统上使用专用的协调器(Docker Swarm,Kubernetes,Amazon ECS,Nomad等)和 only 运行Docker容器。
如果您有某种防火墙,可以,您需要打开Docker应用程序在外部侦听的端口。 (并且在AWS环境中,还允许他们进入安全组。)
您使用docker build
根据源代码创建图像。在生产环境中,您通常不希望手动将源代码与正在构建的图像一起推送。支持此功能的两个关键部分是Docker注册表(Docker Hub,Amazon ECR,Google GCR,运行您自己的)和一个持续集成系统(Jenkins很流行,或者有数十亿个基于云的系统)。设置CI系统,以便对源存储库的每次提交都创建一个新的唯一标记的映像。部署映像的特定版本。
您不知道。源代码已内置到映像中。考虑使用可远程访问的专用协调器(除了Docker Compose以外,几乎可以进行其他操作),以便您的CI系统可以将您的部署更新到最新版本。
永远不要将数据“存储在容器中”:它们经常被删除,并且关联的数据将丢失。我个人建议在Docker之外的专用主机上运行数据库,但是有一种说法也可以在Docker中运行所有内容。只需确保正确使用卷或主机目录来存储实际数据,然后进行备份并练习还原即可。 (“所有Docker”的观点是克隆和还原整个环境非常容易。)
在Docker容器中使用非root用户通常仍被视为最佳实践。通常,它并不重要,但是如果您确实遇到某种安全问题,它至少可以保护应用程序免于在容器内部重写其自己的代码。
答案 1 :(得分:0)
首先,我将用于生产的docker-stack而不是compose用于生产。它是兼容的,不需要其他安装,并且具有某些服务修复功能。对你的问题。
docker世界中使用的术语: