AWS ECS未链接我的容器

时间:2017-07-24 18:36:25

标签: amazon-web-services docker amazon-ecs aws-vpc

我正在将我工作的公司的部分基础设施迁移到Amazon ECS,并且我一直试图让我的服务器容器连接到数据库容器。

以下是我如何设置我的任务:

    {
  "requiresAttributes": [
    {
      "value": null,
      "name": "com.amazonaws.ecs.capability.docker-remote-api.1.17",
      "targetId": null,
      "targetType": null
    },
    {
      "value": null,
      "name": "com.amazonaws.ecs.capability.logging-driver.syslog",
      "targetId": null,
      "targetType": null
    },
    {
      "value": null,
      "name": "com.amazonaws.ecs.capability.docker-remote-api.1.18",
      "targetId": null,
      "targetType": null
    },
    {
      "value": null,
      "name": "com.amazonaws.ecs.capability.ecr-auth",
      "targetId": null,
      "targetType": null
    }
  ],
  "taskDefinitionArn": "arn:aws:ecs:us-east-1:9621234232917455:task-definition/ecv-server:12",
  "networkMode": "bridge",
  "status": "ACTIVE",
  "revision": 12,
  "taskRoleArn": null,
  "containerDefinitions": [
    {
      "volumesFrom": [],
      "memory": 500,
      "extraHosts": null,
      "dnsServers": [],
      "disableNetworking": null,
      "dnsSearchDomains": null,
      "portMappings": [],
      "hostname": "db",
      "essential": true,
      "entryPoint": null,
      "mountPoints": [
        {
          "containerPath": "/var/lib/postgresql/data",
          "sourceVolume": "dbdata",
          "readOnly": null
        }
      ],
      "name": "db",
      "ulimits": null,
      "dockerSecurityOptions": null,
      "environment": [
        {
          "name": "POSTGRES_PASSWORD",
          "value": "jmbrito"
        },
        {
          "name": "POSTGRES_USER",
          "value": "jmbrito"
        }
      ],
      "links": [],
      "workingDirectory": null,
      "readonlyRootFilesystem": null,
      "image": "postgres",
      "command": null,
      "user": null,
      "dockerLabels": null,
      "logConfiguration": {
        "logDriver": "syslog",
        "options": null
      },
      "cpu": 0,
      "privileged": null,
      "memoryReservation": null
    },
    {
      "volumesFrom": [],
      "memory": 400,
      "extraHosts": null,
      "dnsServers": [],
      "disableNetworking": null,
      "dnsSearchDomains": null,
      "portMappings": [],
      "hostname": "redis",
      "essential": true,
      "entryPoint": null,
      "mountPoints": [
        {
          "containerPath": "/data",
          "sourceVolume": "redisdata",
          "readOnly": null
        }
      ],
      "name": "redis",
      "ulimits": null,
      "dockerSecurityOptions": null,
      "environment": [],
      "links": null,
      "workingDirectory": null,
      "readonlyRootFilesystem": null,
      "image": "redis:3.2-alpine",
      "command": [
        "redis-server"
      ],
      "user": null,
      "dockerLabels": null,
      "logConfiguration": {
        "logDriver": "syslog",
        "options": null
      },
      "cpu": 0,
      "privileged": null,
      "memoryReservation": null
    },
    {
      "volumesFrom": [],
      "memory": 600,
      "extraHosts": null,
      "dnsServers": null,
      "disableNetworking": null,
      "dnsSearchDomains": null,
      "portMappings": [
        {
          "hostPort": 80,
          "containerPort": 3000,
          "protocol": "tcp"
        }
      ],
      "hostname": null,
      "essential": true,
      "entryPoint": [],
      "mountPoints": [],
      "name": "server",
      "ulimits": null,
      "dockerSecurityOptions": null,
      "environment": [
        {
          "name": "RAILS_ENV",
          "value": "production"
        }
      ],
      "links": [
        "db:db",
        "redis:redis"
      ],
      "workingDirectory": "/usr/src/app",
      "readonlyRootFilesystem": null,
      "image": "MY DOCKER LINK IN ECR",
      "command": [
        "sh",
        "deploy/init.sh"
      ],
      "user": null,
      "dockerLabels": null,
      "logConfiguration": {
        "logDriver": "syslog",
        "options": null
      },
      "cpu": 0,
      "privileged": null,
      "memoryReservation": null
    }
  ],
  "placementConstraints": [],
  "volumes": [
    {
      "host": {
        "sourcePath": null
      },
      "name": "dbdata"
    },
    {
      "host": {
        "sourcePath": null
      },
      "name": "redisdata"
    }
  ],
  "family": "ecv-server"
}

正如您所看到的,我正确设置了我的链接字段,当我尝试使用连接到主机数据库或主机redis等名称进行连接时,它找不到它。

我尝试使用VPC地址连接到其他容器并且工作正常。唯一的问题是,为了做到这一点,我更喜欢在VPC中设置自己的地址(比如将172.13.0.2设置为db),因为当我没有设置时,系统按连接顺序获取地址。

我希望你理解这个问题。

谢谢。

1 个答案:

答案 0 :(得分:1)

我认为此任务定义不会按您希望的方式运行。当您将三个容器放在一个任务定义中时,它告诉ECS每次在部署任务时始终将这三个容器一起部署在同一台机器上。

因此,如果您为此任务部署所需数量为3的服务,您将获得三个应用程序容器,三个postgres容器和三个redis容器。这三个应用程序容器将具有三个隔离的数据持久性堆栈。应用程序容器A只与postgres A和redis A通信,而应用程序容器B只与postgress B和redis B对话,因此每个应用程序容器都会有不相互复制的不一致数据。

在任务定义中运行多个容器实际上仅适用于反向代理或临时缓存等类似的边车容器。

对于持久层,我的建议是将Amazon RDS用于你的postgres,将Amazon Elasticache用于你的redis。这样,您的所有任务都可以共享相同的postgres和相同的redis,并且使用这些Amazon服务也可以减少管理费用。