我对Docker很陌生,但已经开始考虑生产设置,因此在使用Docker Swarm时需要克服数据持久性的挑战。我决定首先创建我的部署基础架构(TeamCity for builds和NuGet以及#34;注册表" [https://hub.docker.com/_/registry/]用于存储图像)。
我是从TeamCity开始的。显然,这需要数据持久性才能工作。我能够在一个带有EBS驱动器的容器中运行TeamCity,一切看起来都运行得很好 - TeamCity正在完成设置步骤,我的TeamCity驱动器出现在AWS EBS中,但工作节点TeamCity被分配到关闭,安装过程停止。
以下是我所遵循的所有步骤:
阶段1 - 机器设置:
第2阶段 - 在主服务器上配置Docker Remote:
$ 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 delete
所有三个节点都可以在AWS EBS中创建和删除驱动器,没有任何问题。
阶段4 - 设置群组:
在主人身上运行:
$ sudo docker swarm init --advertise-addr eth0:2377
这使得命令可以在每个worker上运行,如下所示:
$ 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 - 在我的本地计算机上使用Remote 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实例的工作机器将关闭,并且该过程突然结束。
我不知道下一步该怎么做。我甚至不确定在哪里查找日志。
感激不尽的任何帮助!
干杯,
史蒂夫。
答案 0 :(得分:1)
我找到了获取服务日志的方法。首先执行此操作以列出堆栈创建的服务:
$ sudo docker service ls
然后执行此操作以查看服务的日志:
$ sudo docker service logs --details {service name}
现在我只需要浏览日志,看看出了什么问题......
答案 1 :(得分:1)
<强>更新强>
我在日志中发现了以下错误:
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实例再次尝试这一点,看看我是如何进行的。
答案 2 :(得分:0)
更新2
使用更大的AWS实例解决了这个问题。 :)
然后我发现当一个容器在我的swarm中的主机之间切换时,rexray / ebs不喜欢它 - 它复制了EBS卷,以便每台机器保留一个。我的解决方案是在AWS中使用EFS驱动器并将其安装到每个可能的主机上。然后我更新了fstab文件,以便在每次重新启动时重新安装驱动器。任务完成。现在来研究使用反向代理...