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

How to deploy MySQL docker image on AWS ECS?

我在 AWS ECS FARGATE.

上部署 MySQL 图像时遇到问题

我拥有的 cloudformation 脚本是这样的(不要介意语法,我正在使用 python lib Troposphere 来管理 cloudfromation 模板):

    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

在本地主机上它就像一个魅力。我在这里做错了什么?至少 - 有调试方法吗?

对于 AWS ECS,如果它正在停止,可能是因为健康检查失败导致容器重新启动。容器数据库映射到哪个端口,您可以检查容器日志以查看它启动然后停止时发生了什么吗?此外,检查ECS中服务或任务下的日志。 Post 它在这里,所以我可以看看它们。

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

您要做的第一件事 - 是在本地主机上测试 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

就是这样:)