如何在AWS ECS上部署MySQL Docker镜像?

4

我在AWS ECS FARGATE上部署MySQL镜像时遇到了麻烦。

我拥有的CloudFormation脚本如下(不用在意语法,我使用Python库Troposphere来管理CloudFormation模板):

    TaskDefinition(
            'WordpressDatabaseTaskDefinition',
            RequiresCompatibilities=['FARGATE'],
            Cpu='512',
            Memory='2048',
            NetworkMode='awsvpc',   
            ContainerDefinitions=[
                ContainerDefinition(
                    Name='WordpressDatabaseContainer',
                    Image='mysql:5.7',
                    Environment=[
                        Environment(Name='MYSQL_ROOT_PASSWORD', Value='root'),
                        Environment(Name='MYSQL_DATABASE', Value='wpdb'),
                        Environment(Name='MYSQL_USER', Value='root'),
                        Environment(Name='MYSQL_PASSWORD', Value='root'),
                    ],
                    PortMappings=[
                        PortMapping(
                            ContainerPort=3306
                        )
                    ]
                )
            ]
        )

部署成功了。我甚至可以看到任务运行了几秒钟,直到状态变为STOPPED。
唯一能看到的是:
  1. 停止原因:任务中的必要容器已退出
  2. 退出代码1
在本地主机上它完美运行。我做错了什么?至少有没有调试的方法?
2个回答

1
使用AWS ECS,如果容器停止,则可能未通过健康检查导致容器重新启动。请确认容器数据库映射到哪个端口,并检查容器日志以查看启动和停止时发生了什么。另外,请在服务或任务下检查ECS中的日志。请将结果张贴在此处,以便我查看。

这是一个非常愚蠢的错误。我只是尝试在本地主机上使用完全相同的环境运行Docker容器,结果也崩溃了。通过运行docker logs,我发现它无法创建root用户。我不得不选择不同的用户和密码。 - Laimonas Sutkus

1

所以,我发现了一个错误。

你需要做的第一件事就是在本地主机上测试该Docker容器,看是否能重现该问题。在我的情况下,本地机器上的Docker MySQL容器在完全相同的环境下也崩溃了。我能够检查日志并发现它无法创建“root”用户。只需更改用户和密码即可使一切正常工作,甚至在ECS上也是如此。

这是在AWS ECS FARGATE上运行MySQL Docker镜像的完整堆栈:

    self.wordpress_database_task = TaskDefinition(
            'WordpressDatabaseTaskDefinition',
            RequiresCompatibilities=['FARGATE'],
            Cpu='512',
            Memory='2048',
            NetworkMode='awsvpc',

            # If your tasks are using the Fargate launch type, the host and sourcePath parameters are not supported.
            Volumes=[
                Volume(
                    Name='MySqlVolume',
                    DockerVolumeConfiguration=DockerVolumeConfiguration(
                        Scope='shared',
                        Autoprovision=True
                    )
                )
            ],

            ContainerDefinitions=[
                ContainerDefinition(
                    Name='WordpressDatabaseContainer',
                    Image='mysql:5.7',
                    Environment=[
                        Environment(Name='MYSQL_ROOT_PASSWORD', Value='root'),
                        Environment(Name='MYSQL_DATABASE', Value='wpdb'),
                        Environment(Name='MYSQL_USER', Value='wordpressuser'),
                        Environment(Name='MYSQL_PASSWORD', Value='wordpressuserpassword'),
                    ],
                    PortMappings=[
                        PortMapping(
                            ContainerPort=3306
                        )
                    ]
                )
            ]
        )

        self.wordpress_database_service = Service(
            'WordpressDatabaseService',
            Cluster=Ref(self.ecs_cluster),
            DesiredCount=1,
            TaskDefinition=Ref(self.wordpress_database_task),
            LaunchType='FARGATE',
            NetworkConfiguration=NetworkConfiguration(
                AwsvpcConfiguration=AwsvpcConfiguration(
                    Subnets=[Ref(sub) for sub in VpcFormation().public_subnets],
                    AssignPublicIp='ENABLED',
                    SecurityGroups=[Ref(self.security_group)]
                )
            ),
        )

请注意AssignPublicIp='ENABLED'选项,这样您就可以远程连接数据库了。
在堆栈完成后,我能够成功地使用以下命令连接: mysql -uwordpressuser -pwordpressuserpassword -h18.202.31.123 就是这样 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接