【问题标题】:Issues with Docker Swarm running TeamCity using rexray/ebs for drive persistence in AWS EBSDocker Swarm 使用 rexray/ebs 在 AWS EBS 中运行 TeamCity 以实现驱动器持久性的问题
【发布时间】:2018-10-23 12:19:12
【问题描述】:

我对 Docker 很陌生,但已经开始考虑生产设置,因此在使用 Docker Swarm 时需要解决数据持久性的挑战。我决定从创建我的部署基础架构开始(TeamCity 用于构建和 NuGet 以及“注册表”[https://hub.docker.com/_/registry/] 用于存储图像)。

我从 TeamCity 开始。显然,这需要数据持久性才能工作。我可以在带有 EBS 驱动器的容器中运行 TeamCity,一切看起来都运行良好 - TeamCity 正在完成设置步骤,我的 TeamCity 驱动器出现在 AWS EBS 中,但随后工作节点 TeamCity 被分配到关闭并且安装过程停止。

这是我要遵循的所有步骤:

第 1 阶段 - 机器设置:

第 2 阶段 - 在主服务器上配置 Docker 远程:

$ sudo docker run -p 2375:2375 --rm -d -v /var/run/docker.sock:/var/run/docker.sock jarkt/docker-remote-api

第 3 阶段 - 在所有机器上安装 rexray/ebs 插件:

$ sudo docker plugin install --grant-all-permissions rexray/ebs REXRAY_PREEMPT=true EBS_ACCESSKEY=XXX EBS_SECRETKEY=YYY

[我从 AWS 中提取了 XXX 和 YYY 的正确值]

  • 我对此进行了测试:

    $ sudo docker volume create --driver=rexray/ebs --name=delete --opt=size=2

    $ sudo docker volume rm 删除

  • 所有三个节点都能够毫无问题地在 AWS EBS 中创建和删除驱动器。

第 4 阶段 - 设置集群:

  • 在主服务器上运行:

    $ sudo docker swarm init --advertise-addr eth0:2377

  • 这给出了在每个工人上运行的命令,如下所示:

    $ sudo docker swarm join --token XXX 1.2.3.4:2377

  • 这些在工作机器上执行良好。

第 5 阶段 - 在我的本地计算机上使用 Remote Powershell 设置可视化:

$ $env:DOCKER_HOST="{master IP address}:2375"

$ docker stack deploy --with-registry-auth -c viz.yml viz

viz.yml 看起来像这样:

version: '3.1'

services:
    viz:
        image: dockersamples/visualizer
        volumes:
            - "/var/run/docker.sock:/var/run/docker.sock"
        ports:
            - "8080:8080"
        deploy:
            placement:
                constraints:
                    - node.role==manager
  • 这很好用,可以让我可视化我的群体。

第 6 阶段 - 在我的本地计算机上使用远程 Powershell 安装 TeamCity:

$ docker stack deploy --with-registry-auth -c docker-compose.yml infra

docker-compose.yml 看起来像这样:

version: '3'

services:
  teamcity:
    image: jetbrains/teamcity-server:2017.1.2
    volumes:
        - teamcity-server-datadir:/data/teamcity_server/datadir
        - teamcity-server-logs:/opt/teamcity/logs
    ports:
        - "80:8111"

volumes:
  teamcity-server-datadir:
   driver: rexray/ebs
  teamcity-server-logs:
   driver: rexray/ebs
  • [将 NGINX 作为代理加入是我的待办事项列表中的后续步骤。]

  • 我可以看到所需的驱动器出现在 AWS EBS 中,并且容器出现在我的 swarm 可视化中。

  • 但是,在 TeamCity 中看到进度屏幕一段时间后,包含 TeamCity 实例的工作计算机将关闭并且进程突然结束。

  • 我不知道下一步该做什么。我什至不确定在哪里寻找日志。

感谢您的任何帮助!

干杯,

史蒂夫。

【问题讨论】:

  • P.S.我不喜欢使用 rexray/ebs 的想法,但它看起来确实是经过一些扩展谷歌搜索后实现数据持久性的最流行和最简单的方法。我非常喜欢将数据保存在单独的 EBS 卷中的想法。
  • 好的,我对在 AWS 中将 EFS 用于共享驱动器进行了一些研究,并在我的三台服务器之间进行了设置。这最终出现了同样的错误,所以我认为问题不在于 rexray/ebs 插件。我想知道这是否是 TeamCity 的问题。如果您使用 Docker Swarm 下的本地共享设置 TeamCity 容器,它确实可以正常工作。也许 TeamCity 不喜欢使用共享驱动器?
  • 更新:看来我错了!看起来问题出在 Docker Swarm 上。 TeamCity 甚至无法在 Swarm 模式下使用本地存储(在主机上)。但是,它在使用简单的 docker-compose 时效果很好。 rexray 组件也可以很好地使用 docker-compose。那么,我的 Docker Swarm 配置有什么问题导致 TeamCity 在一段时间后停止?
  • 欢迎来到 Stack Overflow!很高兴您想与 Docker Swarm 分享您的经验,但 Stack Overflow 不适合这样做。也许您更愿意使用像 hackernoon.comdev.to 这样的发布平台来代替它。 Stack Overflow 是一个为特定问题寻找最佳答案的平台。
  • 道歉 - 实际上我确实是从提出问题开始的,但经过更多研究后,我能够回答自己的问题,所以我想我应该分享我学到的东西。实际上很难找到关于 Docker Swarm 的好信息。我会考虑在我自己的博客上添加一个帖子:code-smart.org.uk

标签: amazon-web-services docker docker-swarm data-persistence aws-ebs


【解决方案1】:

我找到了一种为我的服务获取日志的方法。首先这样做列出堆栈创建的服务:

$ sudo docker service ls 

然后执行此操作以查看服务的日志:

$ sudo docker service logs --details {service name}

现在我只需要翻阅日志,看看出了什么问题...

【讨论】:

    【解决方案2】:

    更新

    我在日志中发现以下错误:

    infra_teamcity.1.bhiwz74gnuio@ip-172-31-18-103    |  [2018-05-14 17:38:56,849]  ERROR - r.configs.dsl.DslPluginManager - DSL plugin compilation failed
    infra_teamcity.1.bhiwz74gnuio@ip-172-31-18-103    |  exit code: 1
    infra_teamcity.1.bhiwz74gnuio@ip-172-31-18-103    |  stdout: #
    infra_teamcity.1.bhiwz74gnuio@ip-172-31-18-103    |  # There is insufficient memory for the Java Runtime Environment to continue.
    infra_teamcity.1.bhiwz74gnuio@ip-172-31-18-103    |  # Native memory allocation (mmap) failed to map 42012672 bytes for committing reserved memory.
    infra_teamcity.1.bhiwz74gnuio@ip-172-31-18-103    |  # An error report file with more information is saved as:
    infra_teamcity.1.bhiwz74gnuio@ip-172-31-18-103    |  # /opt/teamcity/bin/hs_err_pid125.log
    infra_teamcity.1.bhiwz74gnuio@ip-172-31-18-103    |
    infra_teamcity.1.bhiwz74gnuio@ip-172-31-18-103    |  stderr: Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000e2dfe000, 42012672, 0) failed; error='Cannot allocate memory' (errno=12)
    

    这让我觉得这是一个内存问题。我将使用更好的 AWS 实例再试一次,看看效果如何。

    【讨论】:

      【解决方案3】:

      更新 2

      使用更大的 AWS 实例解决了这个问题。 :)

      然后我发现 rexray/ebs 不喜欢当容器在我的 swarm 中的主机之间切换时它会复制 EBS 卷,以便每台机器保留一个。我对此的解决方案是在 AWS 中使用 EFS 驱动器并将其安装到每个可能的主机上。然后我更新了 fstab 文件,以便在每次重新启动时重新安装驱动器。任务完成。现在研究使用反向代理...

      【讨论】:

        猜你喜欢
        • 2018-09-17
        • 1970-01-01
        • 2021-06-11
        • 1970-01-01
        • 1970-01-01
        • 2020-09-10
        • 2012-12-24
        • 2021-11-06
        • 1970-01-01
        相关资源
        最近更新 更多