Как связать контейнер в докер?
вот изображение, когда я набираю 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.