Как связать контейнер в докер?

вот изображение, когда я набираю docker ps

в докере, у меня есть 3 контейнера, webapps, redis и rabbitmq, я запутываю, как связать контейнерные контейнеры с контейнером redis и контейнером rabbitmq?, в приложениях, не поддерживающих докеры, mywebapps может отправлять сообщения на rabbitmq и писать/читать reddis. я не знаю, как связать 3 эти контейнеры,  я пробовал использовать команду, подобную этой

docker run --name rabbitmq -p 8080:80 --link webapps:nimmis/apache-php7 -d rabbitmq

но он все еще не работает

вот мой config.php на webapps, когда я пытаюсь отправлять сообщения через rabbitmq

define('HOST', 'localhost');
define('PORT', 5672);

Я попытался изменить localhost с именем хоста

define('HOST', 'rabbitmq');
define('PORT', 5672);

сообщения об ошибках отключены. кажется, что в моем три контейнера необходимо настроить/сопоставить/привязать сеть в одном и том же ip?

] 2

Ответ 1

Связывание - это устаревшая функция. Используйте "определенные пользователем сети":

sudo docker network create mynetwork

Затем перезапустите контейнеры с помощью этой сети:

sudo docker run --name rabbitmq -p 8080:80 -d --network mynetwork rabbitmq

Сделайте то же самое для других контейнеров, которые вы хотите связать друг с другом.

Используя "пользовательские сети", у вас есть "внутреннее разрешение имен" в вашем распоряжении (что-то вроде разрешения имени домена при посещении веб-сайтов). Вы можете использовать имена контейнера, к которым вы хотите обратиться, для разрешения IP-адресов контейнеров, если они работают в одной и той же "сети, определенной пользователем". При этом вы можете разрешить IP-адрес контейнера rabbitmq с его именем в других контейнерах в той же сети.

Все контейнеры в одной и той же "сети, определенной пользователем" будут иметь сетевое подключение. Нет необходимости в "устаревшей ссылке".

Ответ 2

Для межконтейнерных зависимостей и ссылок вы хотите использовать docker-compose, где вы можете определить links между контейнерами.

В корневом каталоге, где хранятся файлы Docker, просто создайте новый файл с именем docker-compose.yml, и здесь вы можете определить свои контейнеры как сервисы, которые полагаются друг на друга следующим образом:

version: '2'
services:
  webapps:
    build: .
    links:
      - "rabbitmq:rabmq"
      - "redis"

  rabbitmq:
    image: rabbitmq

  redis:
    image: redis

поэтому здесь, в определении службы webapps, вы видите links другие две службы rabbitmq и redis. Это означает, что при создании контейнера webapps запись в файл hosts производится таким образом, что доменное имя redis преобразуется в IP и номер порта фактического контейнера.

У вас есть возможность изменить имя адреса этого контейнера, используя нотацию service:alias, например, как я определил rabbitmq используйте псевдоним rabmq внутри контейнера webapps.

Теперь создайте и запустите свои контейнеры с помощью docker-compose просто введите:

docker-compose up -d

Таким образом, подключение к другому контейнеру так же просто, как использование этого псевдонима в качестве имени хоста.

Поскольку вы используете docker-compose в этом случае, он автоматически создает сеть докеров для подключения всех контейнеров, поэтому вам не стоит беспокоиться об этом. Но для получения дополнительной информации смотрите документы: https://docs.docker.com/compose/networking/#/specifying-custom-networks

Ответ 3

Вам нужно связать rabbitmq и redis с контейнером webapps, а не наоборот.

    #run redis container
    docker run --name some-redis -d redis

    #run rabbitmq container
    docker run -d --hostname my-rabbit --name some-rabbit rabbitmq

    #run webapps container
    docker run --name webapps -p 8080:80 --link some-redis:redis --link some-rabbit:rabbitmq nimmis/apache-php7

Сначала запускайте контейнеры redis и rabbitmq. Затем запустите контейнер webapps со ссылками на 2 контейнера.

Теперь, чтобы настроить узел redis в webapps - его легко. Вы можете просто использовать переменную env 'REDIS_PORT_6379_TCP_ADDR'. Потому что, как только контейнер связан, вы получаете его переменные env. и redis экспортирует эту переменную.

Что касается хоста rabbitmq - вы можете получить ip после того, как контейнер для кроликов:

    RABBITMQ_IP=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' some-rabbit)

а затем передайте его в --env при запуске контейнера webapps.