这可能是一个101问题,但在第一次设置时,没有关于这样一个基本和常见任务的提示。基本上,我有一个无头的ubuntu在AWS中作为docker映像运行,它是通过github-actions CI/CD构建的。一切都很顺利。
在ubuntu内部,我有一些python脚本,比如说一个自定义服务器、cron作业、一些正在运行的软件等。我怎么能远程知道这些脚本是否记录了任何错误?让我们简单一点:如何从ubuntu内部的python服务器打印错误消息,以便从docker外部读取?AWS是否有任何用于查看stdout/stderr日志的web界面?或者至少是ssh控制台?有什么例子吗?
此外,我已经为我的docker设置了健康检查,以确认我在ubuntu中运行的服务器是否在线并提供服务。这些工作是因为我可以通过执行docker ps
在localhost中测试它们,并显示Status"health"。当我住在AWS时,我如何看待同样的事情?
我真的错过了这么大的东西吗?感觉这应该是在AWS上设置docker的主页上闪烁的第一件事。
这里有一些东西需要打开,你可以在挖掘了很多不需要的东西后学习,这样你就可以知道如何开始了。
-
Docker默认情况下会记录您描述的dockerfile设置的启动过程的输出,例如当您执行
ENTRYPOINT bash -C /home/ubuntu/my_dockerfile_sh_scripts/myStartupScripts.sh
时。如果这些进程派生的任何子进程也登录到stdout/stderr,则消息应该冒泡到主机进程,因此显示在docker日志中。如果它们没有冒泡,请在linux中查找子进程stdout/stderr。 -
好吧,我们知道,但AWS的统计数据和日志页面到底在哪里?在Amazon Cloudwatch中表现良好™当然你不知道那个词吗?为什么,当你创建一个docker时,或者在你的ECS控制台上docker集群旁边,或者在运行的docker镜像服务旁边,它就这么说了。哦,等等!不,不,没有!不存在";Cloudwatch";在任何地方好吧,有一页有";Cloudwatch";如果你知道url,你就可以找到它,但嘿,看看这个,你在docker中的任何地方都看不到任何来自代码的日志,所以。。是 啊那么,在哪里可以看到实际的日志和输出呢?在您的服务页面(当前运行的docker映像的页面)中有一个"日志"选项卡:
https://eu-central-1.console.aws.amazon.com/ecs/home?region=eu-central-1#/clusters/your-cluster-name/services/your-cluster-docker-image-service/logs
。这个通用名称且未描述的选项卡从AWS端显示了一个不属于服务状态的日志,但实际上向您显示了我在第1点中提到的docker日志。好的。我如何将其视为原始文件或通过脚本远程访问?我不知道。我想,在阅读了几本关于设置AWS CLI的手册(另一件你不知道存在的事情)后,你会发现这个基本的常见任务。 -
就像我在第1点中所说的,docker不能记录通用操作系统日志消息,也不能向您显示服务器生成的日志文件,或者只是显示dockerfile/config没有描述和启动的其他正在运行的软件或作业。那么,我们如何让AWS看到这一点呢?好吧,这有点麻烦,你必须用
sudo yum install -y awslogs
替换你的docker镜像的默认操作系统(例如ubuntu)日志驱动程序并进行设置,或者你可以在特定的日志文件和stdout/stderr流之间创建符号链接(docker文档提到了这一点)。还要检查马克B的回答。但可能最简单的事情是用短消息编写自己的小脚本,并将其打印到主进程中——事情的状态是什么。通常这就是你所需要的,除非你是一个企业。 -
在运行的docker中是否有ssh或其他AWS在线命令行界面页面,就像您在localhost docker桌面中获得的那样?所以你可以用
cd
和ls
浏览或搜索文件,看看是否一切正常?不,自己做吧。或者更好的是,从一开始就避免需要它,即使这对R&D. -
健康检查。我到底在哪里看码头工人的健康检查?相当于只运行
docker ps
命令的localhost方法。默认情况下,AWS上没有显示任何健康检查。你为什么需要健康检查?那么,如果你的dockerfile已经定义了HEALTHCHECK
呢?。。🙂你必须在法盖特设置™(无论fargate的意思是什么,都会导致名称没有写在任何地方("UX"))。您必须创建所谓的新任务定义修订版。进入亚马逊云服务器中的集群。转到您的群集。然后单击底部服务表的任务定义列中的服务条目。单击"创建新修订"(新任务定义修订)。在新页面上,单击"容器定义"表中的容器。在新的页面上,你向下滚动到HEALTHCHECK,宾果!这是什么?我要在这里粘贴哪些命令?它并没有自动接受我在dockerfile中定义的HEALTHCHECK,所以这是否意味着我必须在这里写其他东西??健康检查是在什么环境中进行的?是我的码头工人吗?它是linux吗?答案是:你把你已经写在你的dockerfile的HEALTHCHECK中的东西粘贴在这个盒子里。只需像在本地docker桌面测试环境中一样使用http://127.0.0.1
(localhost)。现在单击"更新"。单击"创建"。K、 现在我们还没有结束。返回您的亚马逊ECS/集群/集群。单击服务表中的服务名称。单击"更新"。选择最新版本。检查";强制新部署";。然后继续单击"下一步",直到最后单击"更新服务"。您还可以定义在健康检查失败时触发图像关闭的原因。例如,如果它用完了ram。现在#亚马逊,我希望你接受这个答案,并将其绑定到你糟糕的ECS体验中。
我发誓,像AWS和Azure这样的平台无情地、完全自下而上的用户体验是保持教程博主行业活力的原因。。我怎么知道什么是AWS CloudWatch,或者它是否存在?当你设置时,任何地方都没有关于这些事情的提示。你可能会认为,在你完成docker设置后,屏幕上闪烁的第一件事是"嘿,99.9%的人现在需要设置日志记录。你应该使用cloudwatch。以下是如何将健康检查与cloudwatch连接起来的方法。但不,当然不是。。!🙃
相反,AWS的";工程师;这里的方法似乎是:墙上有一个网格状的洞,旁边是一个水桶里乱七八糟的电线。现在,为了完成你想做的常见的经常做的任务,你必须首先阅读每个孔的手册,以及桶中每个电线的手册,然后找到你需要的所有孔和电线,并按照正确的顺序插入它们(为了正确的顺序,你需要找到一篇博客文章,因为这总是涉及到一定程度的不遵循文档,当然还有魔法)。我想它被称为";工作保障";如果你是一名企业服务器工程师:)
我遇到了同样的问题,我找到了AWS Wiki,/dev/stdout
符号链接对我不起作用,但/proc/1/fd/1
符号链接对我们起作用。
以下是解决方案:
步骤1。将这些命令添加到Dockerfile中。
# forward logs to docker log collector
RUN ln -sf /proc/1/fd/1 /var/log/console.log
&& ln -sf /proc/1/fd/2 /var/log/error.log
步骤2。参见";标记B"s步骤2。
步骤1.通过删除所有您关心的日志文件并用指向stdout或stderr的符号链接替换它们来更新docker映像,例如,为了在nginx容器中捕获日志,我可以在Dockerfile
:中执行以下操作
RUN ln -sf /dev/stdout /var/log/nginx/access.log
&& ln -sf /dev/stderr /var/log/nginx/error.log
步骤2.在ECS任务定义中配置awslogs驱动程序,如下所示:
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "my-log-group",
"awslogs-region": "my-aws-region",
"awslogs-stream-prefix": "my-log-prefix"
}
}
只要您授予ECS Execution Role写入AWS日志的权限,日志数据就会开始出现在CloudWatch日志中。