2015-04-10 2 views
9

Из моего понимания компоновки docker/fig, создание связи между двумя службами/изображениями является одной из главных причин, если вы не хотите показывать порты другим.Понимание портов и ссылок в докере составляют

как здесь дб не предоставляет никаких портов и только связаны между собой:

web: 
    build: . 
    links: 
    - db 
    ports: 
    - "8000:8000" 
db: 
    image: postgres 

ли веб думает дб работает на своем локальном хосте? Могу ли я подключиться со сценария/программы в веб- до localhost: 5432 (стандартный порт из postgresql), чтобы получить соединение с базой данных?

И если это правильно, как вы можете изменить порт 5432 на 6432, не подвергая его воздействию? Я бы просто запустил postgresql на другом порту?

Update:

полезные ссылки после некоторого ввода:

http://docs.docker.com/userguide/dockerlinks/

https://docs.docker.com/compose/yml/#links

ответ

3

веб думает дБ работает на хосте, на который указывает переменная окружения DOCKER_DB или что-то как это. Ваши службы должны указывать на эту переменную (хост), а не на localhost.

Контейнер db раскрывает порты (через EXPOSE) в связанные контейнеры, снова в переменных. Вы можете запустить db на любом порту, который вы хотите, до тех пор, пока он EXPOSEd.

9

docker-compose/fig является главным образом рабочей лошадкой для запуска/управления несколькими изображениями одновременно, которые каким-то образом зависят друг от друга.

Чтобы полностью понять ссылки между контейнерами вы должны знать, что есть запись хоста создается, как правило, внутри /etc/hosts файла, который отображает этот контейнер имя хоста в Докер управляемого сети на определенный адрес IP. Поэтому, если вы хотите получить доступ к postgres db, вы должны указать на db имя хоста вместо localhost.

Что касается открытых портов, большинство изображений уже имеют некоторые порты, поэтому может быть, что вы просто используете изображение, и этот порт открыт, вы всегда можете переопределить его на что-то еще.

Обновление в Докер Написать 1.6.0+

По умолчанию Compose устанавливает единую сеть для вашего приложения. Каждый контейнер для службы присоединяется к сети по умолчанию и доступен для других контейнеров в этой сети и может быть обнаружен ими по имени узла, идентичному имени контейнера. source

Вы можете определить связи между контейнерами только тогда, когда вы хотите, чтобы определить псевдоним в контейнер, например, так:

version: '2' 
services: 
    web: 
    build: . 
    links: 
     - "db:database" 
    db: 
    image: postgres 
Смежные вопросы