Ссылки Docker необходимы только для устаревшего режима «мостовая сеть по умолчанию» . Docker Compose автоматически создаст «определяемую пользователем мостовую сеть» , поэтому links:
никогда не нужны в docker-compose.yml
файлах .
На практике это означаетlinks:
действует точно так же, как depends_on:
. Если вы запустите docker-compose up app
, он также запустится для вас dbc
. Compose начнет запуск базы данных до того, как запустит ваше приложение, но не может знать, что база данных завершена;обычно вы используете скрипт типа wait-for-it , чтобы убедиться, что база данных готова, или задаете политику restart:
и просто аварийно завершаете работу, если база данных еще не доступна.
Чтобы контейнер a
достиг контейнера b
в том же файле docker-compose.yml
, требуется только, чтобы он был в одной сети. Самый простой способ сделать это - вообще не иметь блока networks:
. Если они оба имеют, у них должно быть какое-то общее имя, и если только у одного есть, оно должно содержать default
. Имена сервисов (в вашем примере app
и dbc
) будут использоваться как обычные имена хостов, без дополнительной настройки, которая вам требуется. Настройка hostname:
не влияет на работу сети;container_name:
предоставит дополнительное имя для контейнера;ни одна из этих опций не требуется.
Независимо от любых других настроек, межконтейнерная связь всегда использует любой порт, который прослушивает процесс сервера внутри контейнера. Ни ports:
, ни expose:
не требуются;если у вас ports:
и два номера портов различаются, вы подключитесь к второму номеру порта. Для изображения mysql:5.6
, которое вы показываете, вы всегда будете подключаться к порту 3306 (предоставление другого номера порта не имеет никакого эффекта).
В большинстве случаев никогда не следует указывать links:
, expose:
, hostname:
или container_name:
;они не нужны для работы в сети и не устанавливают полезные свойства контейнеров. Я также рекомендовал бы просто использовать настройки сети по умолчанию и никогда не указывать networks:
где-либо в файле.