Как работает инструкция «ссылки» в docker-compose? - PullRequest
1 голос
/ 21 октября 2019

В приведенном ниже файле docker-compose.yml:

app:
  build: ../../
  dockerfile: docker/release/Dockerfile
  links:
    - dbc
  volumes_from:
    - webroot
  environment:
    DJANGO_SETTINGS_MODULE: someapp.settings.release
    MYSQL_HOST: db
    MYSQL_USER: user1
    MYSQL_PASSWORD: passwd
  command:
    - uwsgi
    - "--socket /var/www/someapp/someapp.sock"
    - "--chmod-socket=666"
    - "--module someapp.wsgi"
    - "--master"
    - "--die-on-term"

dbc:
  image: mysql:5.6
  hostname: db
  expose:
    - "3386"
  environment:
    MYSQL_DATABASE: someapp
    MYSQL_USER: user1
    MYSQL_PASSWORD: passwd
    MYSQL_ROOT_PASSWORD: passwd

существует зависимость службы app от службы dbc.

  links:
    - dbc

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

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

wait_for host={{ probe_host }}
      port={{ probe_port }}

Что именно обеспечивает links?

1 Ответ

1 голос
/ 21 октября 2019

Ссылки 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: где-либо в файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...