1

我正在将我工作的公司的部分基础设施迁移到 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"
}

如您所见,我正确设置了链接字段,当我尝试使用连接到主机 db 或主机 redis 之类的名称进行连接时,它找不到它。

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

我希望你明白这个问题。

谢谢你。

4

1 回答 1

1

我不认为这个任务定义会按照你想要的方式工作。当您将三个容器放在一个任务定义中时,它会告诉 ECS 每次部署任务时始终将这三个容器一起部署在同一台机器上。

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

在任务定义中运行多个容器实际上仅适用于 sidecar 容器,例如反向代理、临时缓存或类似容器。

对于持久层,我的建议是为您的 postgres 使用 Amazon RDS,为您的 redis 使用 Amazon Elasticache。这样,您的所有任务都可以共享相同的 postgres 和相同的 redis,并且通过使用这些 Amazon 服务,您也不必担心管理工作。

于 2017-07-25T11:00:20.227 回答