Команда запуска docker-compose up имеет странное поведение - PullRequest
0 голосов
/ 23 сентября 2018

Вот содержимое файла docker-compose.yml для создания образа базы данных.

    version: '2'
    services:
          myerp.db:
          image: postgres:10

Когда я запускаю команду docker-compose, я получаю:

Pulling myerp.db (postgres:10)...
10: Pulling from library/postgres
802b00ed6f79: Already exists
4e0de21e2180: Already exists
58b06ac4cd84: Already exists
14e76b354b47: Already exists
0f0c9f244b65: Already exists
37117d8abb6d: Already exists
8b541f5d818a: Already exists
7cb4855fcd96: Already exists
5c7fe264586b: Already exists
64568a495c35: Already exists
283257efa745: Already exists
222b134fa51d: Already exists
e9a30e7f2a9f: Already exists
86bffc7855b0: Already exists
Digest: sha256:1d26fae6c056760ed5aa5bb5d65d155848f48046ae8cd95c5b26ea7ceabb37ad
Status: Downloaded newer image for postgres:10
Starting dev_myerp.db_1 ... done
Attaching to dev_myerp.db_1
myerp.db_1  | 2018-09-23 10:27:38.647 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
myerp.db_1  | 2018-09-23 10:27:38.647 UTC [1] LOG:  listening on IPv6 address "::", port 5432
myerp.db_1  | 2018-09-23 10:27:38.653 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
myerp.db_1  | 2018-09-23 10:27:38.682 UTC [21] LOG:  database system was shut down at 2018-09-23 10:16:13 UTC
myerp.db_1  | 2018-09-23 10:27:38.708 UTC [1] LOG:  database system is ready to accept connections

Я замечаю, что когда я добавляю эти строки в docker-compose.yml:

ports:
      - "127.0.0.1:9432:5433"
    volumes:
#      - "./data/db:/var/lib/postgresql/data"
       - "./init/db/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d"
    environment:
      - POSTGRES_DB=db_myerp
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=usr

, у меня всегда "0.0.0.0" вместо 127.0.0.1.

Attaching to dev_myerp.db_1
myerp.db_1  | 2018-09-23 10:27:38.647 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
myerp.db_1  | 2018-09-23 10:27:38.647 UTC [1] LOG:  listening on IPv6 address "::", port 5432
myerp.db_1  | 2018-09-23 10:27:38.653 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
myerp.db_1  | 2018-09-23 10:27:38.682 UTC [21] LOG:  database system was shut down at 2018-09-23 10:16:13 UTC
myerp.db_1  | 2018-09-23 10:27:38.708 UTC [1] LOG:  database system is ready to accept connections

Пожалуйста, Можете ли вы объяснить мне, почему информация, добавленная в файл, не принимается во внимание?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

Докерская документация довольно хороша для объяснения вещей, особенно в этом посте .

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

То же самое происходит, когда вы используете ports в docker-compose.yml.Поэтому, когда вы устанавливаете 127.0.0.1:9432:5433, он буквально говорит Docker: «Подключите TCP-порт 5433 в контейнере к порту 9432 на хосте Docker».И вы ошибаетесь, если принять во внимание, что Docker не учитывает ваши настройки.

Как и следовало ожидать, существует разница между запуском контейнера и запуском вещей в контейнере.Вы можете настроить запуск pg так, чтобы он слушал 127.0.0.1.В этом случае он будет отклонять все входящие соединения отовсюду, даже из другого контейнера.Поэтому он прослушивает 0.0.0.0 или все интерфейсы .

Есть способ разрешить другим контейнерам в той же сети знать о вашей базе данных, но "скрыть" ее отвнешний мир.Директива expose четко гласит: :

Предоставлять порты без публикации на хост-компьютере - они будут доступны только для связанных служб.Можно указать только внутренний порт.

0 голосов
/ 23 сентября 2018

Здесь происходят две отдельные вещи.

Внутри контейнера запущен серверный процесс, а журналы docker-compose являются выходом этого серверного процесса. Серверный процесс должен настроить сетевые подключения для прослушивания 0.0.0.0, иначе он будет недоступен. Он минимально осведомлен о среде Docker и не знает о таких вещах, как сопоставления портов из файла Compose YAML;обычно он управляется с помощью параметров командной строки или переменных среды.(Таким образом, сообщения журнала, которые вы цитируете, должны всегда сказать "0.0.0.0", иначе ваш контейнер не будет работать.)

За пределами контейнера Docker направляет входящие соединения по указанным портам на определенныеконтейнеры.Это действует как любая другая служба, работающая на хосте: IP-адрес, который вы даете здесь, может быть любым отдельным адресом, который имеет хост (в этом случае он будет доступен только через соответствующий сетевой интерфейс), или волшебным адресом «везде прослушивать» 0.0.0.0 (по умолчанию).

С docker run -p 127.0.0.1:9432:5432 (помните, номер второго порта должен совпадать с портом, который использует сервер внутри контейнера), то, что вы должны найти, это то, что процессы, запущенные на хосте, могут достигнуть контейнера,но процессы, запущенные на других хостах, не смогут.

...