Здравейте, опитвам се да свържа моите контейнери, следвайки това ръководство:
https://docs.docker.com/userguide/dockerlinks/
тичам docker run -d --name mongodb devops-mongodb
След това стартирам docker run -d -P --name rest-api --link mongodb devops-rest-api
За да свържа моя контейнер mongodb с контейнера rest-api.
Тогава документацията ми каза да направя това, за да видя променливите на средата:
docker run --rm --name rest-api2 --link db:db devops-rest-api env
Той обаче не отпечатва променливите на средата, както е показано в документите.
Току-що получавам STDOUT от моето приложение Spring Boot.
какво правя грешно
Кои променливи на средата очаквате? Ако не зададете, ще се покаже всяко не. Ще помогне, ако публикувате вашия докер файл тук. Мисля, че това, което искате да направите, е да получите достъп до mongo от вашия rest api, нали? След това просто дефинирайте mongodb като името на хоста на mongo във вашата rest-api конфигурация и трябва да работи. Между другото: при второто извикване имате грешка, защото не посочвате mongodb, а --link db:db. – hrrgttnchml преди 6 часа
РЕДАКТИРАНЕ 1: @hrrgttnchml, очаквам тези променливи на средата, направо от документа:
DB_PORT
DB_PORT_5432_TCP
DB_PORT_5432_TCP_PROTO
DB_PORT_5432_TCP_PORT
DB_PORT_5432_TCP_ADDR
Не мисля, че трябва да създавате променливи на средата с флаговете -e, -env. Според документите Docker ги създава автоматично, когато свържете два контейнера:
Docker creates several environment variables when you link containers. Docker automatically creates environment variables in the target container based on the --link parameters. It will also expose all environment variables originating from Docker from the source container. These include variables from:
the ENV commands in the source container’s Dockerfile
the -e, --env and --env-file options on the docker run command when the source container is started
Може обаче да греша.
Ето моя докер файл rest-api: http://pastebin.com/3Ktbbr9n
Докер файл MongoDB: http://pastebin.com/iqyKm5UK
И двете приложения могат да бъдат стартирани, когато контейнерите се изпълняват. Просто не знам как да ги свържа.
Да, искам rest-api да комуникира с базата данни mongodb.
Тъй като изпълнявам spring-boot за rest-api, мога да посоча в моя файл application.properties хоста и порта на моя mongodb сървър като:
spring.data.mongodb.host=192.168.99.100
spring.data.mongodb.port=27017
Значи ми казваш да заменя 192.168.99.100
with mongodb
?
Също така изпълнявам виртуалната машина на oracle box на Windows, така че самата виртуална машина има ip адрес и когато се свързвам с контейнера, трябва да използвам IP адреса на машината, а НЕ localhost, така че оттам е 192.168.99.100. Правилно?
РЕДАКТИРАНЕ 2: Накарах rest-api да комуникира с mongodb без свързване на контейнер, като просто използвах адреса на виртуалната машина заедно с открития порт в Dockerfile. Така че за mongodb ще бъде 192.168.99.100:27017, докато за rest-api ще бъде 192.168.99.100:8080.
Въпреки това това е непрактично, защото ip адресът е твърдо кодиран в самия клас rest-api. Така че някой друг няма да може да стартира изображенията в неговия контейнер на неговата машина, защото ip адресите няма да съвпадат.
Сега очевидно решението е да се използва свързване на контейнер като решение, тъй като хостът и портът се актуализират автоматично във файла /etc/hosts, когато се променят, което ни връща към първоначалния въпрос как да накараме свързването на контейнер да работи.
РЕДАКТИРАНЕ 3: Посочването на mongodb
като име на хост в rest-api работи, но само когато псевдонимът за базата данни е предаден за връзката, като например: --link mongodb
dockerfile
тук. Мисля, че това, което искате да направите, е да получите достъп до mongo от вашия rest api, нали? След това просто дефинирайте mongodb като името на хоста на mongo във вашата rest-api конфигурация и трябва да работи. Между другото: при второто извикване имате грешка, защото не посочвате mongodb, а--link db:db
. - person daniel.eichten   schedule 15.08.2015rest-api
контейнер и да проверите за хост записи с помощта наdocker exec rest-api2 host mongodb
? Трябва да показва адрес с вътрешния докер ip на вашия mongo контейнер – обикновено 172.x.x.x - person daniel.eichten   schedule 15.08.2015