我很好奇是否有人在某种形式的分布式文件系统上的生产容器中实际运行 PostgreSQL - 最好是 GlusterFS 或任何东西。
我目前正在运行 Mesos/Marathon。如果 PostgreSQL 节点发生故障,Marathon 只需在其他节点上启动另一个 PostgreSQL 实例,如果做得好(服务发现和应用程序从数据库连接丢失中恢复),将实现最终的容错。
我知道PostgreSQL有自己的HA解决方案,比如日志传送和热备备份,但是仍然需要解决什么时候从主切换到从,如何正确切换等等问题。
那么,您如何在 GlusterFS 或类似产品上运行 PostgreSQL?如果是这样,它是否稳定?性能怎么样?
我们遇到了一个有趣的争论,并陷入了两个阵营。我对我们可能遗漏的想法或陷阱的任何特定问题感兴趣。真的,任何可以帮助我们做出决定或指出我们没有考虑的事情的东西。我知道这有点接近“无意见”规则,但我希望这仍然是一个可以接受的问题。长度也很抱歉,有一些细微差别。
1)一方面(我的 - 我并非没有偏见)发现不可变服务器模型对于云系统非常有趣。为此,我们设计了将基础架构的所有组件迁移到 Docker 中的原型。我们的自定义应用程序通过 Jenkins 直接构建到部署到本地 Docker Registry 的 Docker 镜像中。然后我们创建了大量 Ansible 角色和一个剧本,它能够接触到一个空服务器,安装 Docker,然后告诉 Docker 根据需要安装所有容器。几分钟后,整个应用程序及其所有支持基础设施都已连接好并开始工作 - 日志记录、监控、数据库创建/填充等。完成的机器是一个独立的 QA 或开发环境,具有精确的副本应用。我们的扩展计划是制作新的 Playbooks 以从基本可信 AMI(可能是一个非常裸的镜像)构建新的 AWS 服务器,滚动部署生产应用程序以处理配置管理和发布,并且通常不再编辑服务器 -只是让他们重新。我并不担心在实践中得到我所描述的东西——只要它是一个合理的模型。
2) 另一个阵营想用 Puppet 来处理配置管理,Ansible 来部署我们的自定义应用程序,这些应用程序是从我们的构建过程中生成的 tarball,Foreman 来处理整个过程的触发和管理,而 Katello 来做一些基础形象管理。发布将涉及 Puppet 根据需要更改配置,以及 Ansible 通过一定数量的 Foreman 协调部署更新的组件。如果我们需要新的服务器,服务器的构建速度会相当快,但目的不是让它们成为标准流程的一部分。虽然寿命很长,但它更接近凤凰服务器模型。
所以我的问题真的归结为这个:带有我上面描述的工具的不可变服务器模型实际上和它看起来一样真实吗?我喜欢这样的想法,即我们的暂存过程实际上可以实时构建应用程序的完整克隆,让 QA 对其进行锤击,然后只需翻转数据库存储和一些 DNS 设置即可使其生效。
还是不可变服务器模型在实践中失败了?我们在 AWS 和云环境方面拥有丰富的经验,因此这并不是真正的问题 - 更重要的是如何可靠地部署合理复杂的应用程序。这是特别有趣的,因为我们经常发布。
除了实际为我们创建 EC2 服务器之外,我们让 Ansible 做大多数需要的事情,这并不难。我无法理解为什么您实际上需要在此模型中使用 Puppet/Foreman/Katello。Docker 比我能说的任何工具中的自定义部署脚本都要干净和简单得多。当您不再担心必须就地配置它们而只需使用新配置重新构建它们时,Ansible 似乎比 Puppet 更易于使用。我是 KISS 原则的粉丝——尤其是在墨菲定律猖獗的自动化领域。机器越少越好 IMO。
对这种方法的任何想法/意见或建议将不胜感激!
我有dockerised一个 wordpress 应用程序,现在我是一个纯粹主义者,不想包含nginx在 docker 容器中,也不想在nginx容器和php-fpm容器之间共享任何状态。
我想php-fpm作为一个独立的网络服务器(如 ruby 中的 unicorn 或 python 中的 gunicorn)运行,为 wordpress 站点提供所有内容(html、css 和图像)。并nginx在它前面运行一个反向代理(缓存静态内容)。这样我就可以保持关注点的分离,并且我没有nginx将流量转发到nginx服务器。
的默认配置php-fpm只允许处理 php 文件。可以php-fpm更改的conf吗?如何?这是个好主意吗?
我需要在 Kubernetes 中运行这个 Docker 命令:
docker run -p 8080:8080 sagemath/sagemath sage -notebook
Run Code Online (Sandbox Code Playgroud)
我可以映射除“-notebook”之外的所有内容 - 有谁知道怎么做?
这是我到目前为止所拥有的,当然它不起作用,因为“-notebook”没有正确转换为 kubectl:
kubectl run --image=sagemath/sagemath sage --port=8080 --type=LoadBalancer -notebook
Run Code Online (Sandbox Code Playgroud) 根据官方文档,可以“强制”删除卷。文档中的--force. 到目前为止,我在网络上发现的这意味着删除其他容器仍在使用的卷。
使用该--force选项似乎没有影响:
$ docker volume create mydata
$ docker docker run -v mydata:/mydata alpine:latest /bin/sh -c "touch /mydata/mydata.test; ls /mydata"
$ docker volume rm --force mydata
Error response from daemon: unable to remove volume: remove mydata: volume is in use - [1cbcfa3d47a32db7b0075e113216f7146a436a4da22a97dc2f7b60c68de95c3d]
Run Code Online (Sandbox Code Playgroud)
这与省略--force标志时的输出相同。这是一个错误还是我误解了什么?
$ docker version
Client:
Version: 18.01.0-ce
API version: 1.35
Go version: go1.9.2
Git commit: 03596f5
Built: Wed Jan 10 20:09:13 2018
OS/Arch: linux/amd64
Experimental: false
Orchestrator: swarm
Server: …Run Code Online (Sandbox Code Playgroud) 我需要在 Docker 容器内创建命名空间。作为其中的一部分,我需要将/proc私有挂载到内部命名空间。我意识到我必须以特定权限运行容器才能实现这一点,但我更愿意启用最小集。
这有效:
$ sudo docker run --privileged --security-opt=seccomp=unconfined \
-it fedora:rawhide /usr/bin/unshare -Ufmp -r \
/bin/sh -c 'mount -t proc proc /proc'
Run Code Online (Sandbox Code Playgroud)
这不会:
$ sudo docker run --cap-add=sys_admin --security-opt=seccomp=unconfined \
-it fedora:rawhide /usr/bin/unshare -Ufmp -r \
/bin/sh -c 'mount -t proc proc /proc'
mount: /proc: cannot mount proc read-only.
Run Code Online (Sandbox Code Playgroud)
因此,仅关闭 seccomp 过滤器并添加CAP_SYS_ADMIN是不够的。什么是足够了吗?
更新: Selinux 是问题的一部分。如果您全局关闭 selinux 强制,它会起作用。但是,您也可以使用 关闭对特定容器的强制执行--security-opt label:disable,这在在线 Docker 手册的安全配置部分有记录:
sudo docker run --cap-add=sys_admin --security-opt …Run Code Online (Sandbox Code Playgroud) 我在 Ubuntu 16.04 上使用 Docker CE,使用 ZFS 作为 Docker 的存储。设置非常标准:
/var/lib/docker。大部分时间一切正常。但是,有时当我的 VM 启动时,zpool 无法挂载。我相信(虽然我不是 100% 确定)这是因为 Docker 服务在 ZFS 文件系统安装之前启动,实际上我看到/var/lib/docker在根 FS 上创建了一个文件夹。
如何确保在挂载所有 ZFS 文件系统之前 Docker 服务不会启动?
我有一个 docker swarm 配置,在那里我部署了两个堆栈(main和mon),我可以在一个堆栈中公开一个端口,我可以从另一个堆栈中引用它。但是,我试图找到一种不这样做的方法,而是让它使用 127.0.0.11 DNS 访问它。
在mon我有一项名为grafana
使用https://docs.docker.com/docker-cloud/apps/service-links/#discovering-services-or-containers-on-another-stack这表明我可以使用堆栈名称来引用它没有当我尝试ping grafana.mon它时,它只返回无效的主机名。
Docker 的新手,我正在努力使其正确。
我想创建一个 docker 容器来“深度冻结”使用 bash 脚本和大量依赖项创建的应用程序,这样我就不必再维护它了。我认为 docker 会帮助我解决这个问题。将更新/升级语句放在 Dockerfile 中(如“apt-get upgrade”)是一个好习惯吗?这不会在未来破坏应用程序,这是 docker 应该阻止的吗?
已经有关于 Windows Server 2016 的非常相似的问答,但我仍然不清楚。
我们已经在 18.09.6 版本中安装了 Docker Enterprise。我们确实设法使用 LCOW 以实验模式运行 Linux 容器。但是不鼓励在生产中使用实验模式。特别是我们不知道https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/linux-containers末尾提到的有关文件系统操作和数据库的问题是否仍然存在。
所以问题是如何在非实验模式下运行 Linux 容器(使用 MobyVM)。Windows Server 2019 是否完全支持此功能?Docker Windows Server 2016 切换到 linux 容器中的答案是否仍然有效?
docker ×10
amazon-ec2 ×1
ansible ×1
docker-swarm ×1
foreman ×1
glusterfs ×1
kubernetes ×1
namespaces ×1
nginx ×1
php-fpm ×1
postgresql ×1
puppet ×1
security ×1
ubuntu ×1
ubuntu-16.04 ×1
wordpress ×1
zfs ×1
zfsonlinux ×1