Перекрестная связь между докерными контейнерами в AWS Beanstalk

Есть ли способ установить двунаправленную связь между контейнерами док-станции в AWS Beanstalk?

Стек, который я пытаюсь заставить работать, довольно стандартный: Varnish -> Nginx -> PHP-FPM.

Я использую спецификацию ссылок, чтобы указать, что nginx должен найти имя хоста "php-app". Nginx находит имя хоста php-app, так что это работает. Однако мне также нужно, чтобы "php-app" разрешал имя хоста "varnish", чтобы "php-app" мог отправлять PURGE-запросы для аннулирования кэша.

В основном сейчас есть только эта связь, которая работает:

[лак:80] -> [nginx:8080] -> [php-app]

Однако это должно работать:

[лак:80] -> [nginx:8080] -> [php-app] ---PURGE---> [лак: 80]

Php-app в основном нужно знать только IP-адрес хоста лака, однако это кажется невозможным.

Я знаю, что я также могу получить ip контейнера для лака из HOST, но я хочу сделать то же самое только из контейнера php-app:

VARNISH_HASH=`docker ps | grep varnish | sed 's/\|/ /' | awk '{print $1}'`
VARNISH_IP=`docker inspect --format '{{ .NetworkSettings.IPAddress }}' $VARNISH_HASH`

Я также попытался добавить ссылки в контейнер php-app, но это привело к ошибкам при развертывании, я думаю, это потому, что существуют циклические зависимости:

"links": [
    "varnish"
]

Мой соответствующий Dockerrun.aws.json (файл определения контейнера) выглядит так:

{
  "AWSEBDockerrunVersion": 2,
  "volumes": [ 
      .....
  ],
  "containerDefinitions": [
    {
      "name": "nginx-proxy",
      "image": "nginx",
      "essential": true,
      "memory": 128,
      "links": [
        "php-app"
      ],
      "portMappings": [
        {
          "hostPort": 8080,
          "containerPort": 8080
        }
      ],
      "environment": [
        {
          "name": "NGINX_PORT",
          "value": "8080"
        }
      ],
      "mountPoints": [ .... ]
    },
    {
      "name": "varnish",
      "hostname": "varnish",
      "image": "newsdev/varnish:4.1.0",
      "essential": true,
      "memory": 128,
      "portMappings": [
        {
          "hostPort": 80,
          "containerPort": 80
        }
      ],
      "links": [
        "nginx-proxy",
        "php-app"
      ],
      "mountPoints":  [ .... ]
    },
    {
      "name": "php-app",
      "image": "peec/magento2-php-fpm-aws",
      "essential": true,
      "memory": 1024,
      "environment": [
      ],
      "mountPoints":  [ .... ]
    }
  ]
}

1 ответ

Проще говоря, вам нужно получить доступ к одному контейнеру от других. Вам просто нужно использовать псевдонимы сетей. Я не вижу вашей сетевой конфигурации для докера, но если ваши образы используют сеть по умолчанию.

varnish:
    image: newsdev/varnish:4.1.0,
    networks:
      default:
        aliases:
          - "varnish.local"

Вы можете изменить "varnish.local" на любое допустимое имя хоста. Из других контейнеров в сети "по умолчанию" этот контейнер будет доступен для ping varnish.local

Вы можете прочитать больше здесь: https://docs.docker.com/compose/compose-file/

Другие вопросы по тегам