Как заставить curl http://barfoo:8002 работать из контейнера foobar, не внося изменений в файл Docker?
Простое решение - сопоставить порт хоста 8002 сbarfoo
порт 8002. Но это, вероятно, не то, что вам нужно.
barfoo
- это имя службы, зарегистрированное во внутренней док-станции dns, доступное только службам (foobar
) в той же сети док-станции, созданной при запускеdocker-compose up
8002 - это порт, сопоставленный с хостом докера.
Поэтому, когда вы запускаете curl http://barfoo:8002
из foobar
контейнера, вы пытаетесь подключиться к службе barfoo
к порту 8002. Однакоbarfoo
прослушивает порт 80 внутри контейнера, а не 8002.
Другое решение:
Вы можете добавить network_mode: host
к barfoo
и foobar
.
foobar:
build:
context: ./foobar
network_mode: host
ports:
- 8001:80
depends_on:
- barfoo
barfoo:
build:
context: ./barfoo
network_mode: host
ports:
- 8002:80
Но тогда foobar
необходимо будет подключиться с помощью localhost:8002
Причина в том, что я хочу смоделировать ситуацию, подобную производственной, когда в производстве не нужен порт, так как онииспользуйте другое имя хоста, и оба могут использовать порт 80 напрямую
Если это действительно то, что вам нужно, лучшей альтернативой будет использование стека докеров.
А вашими сервисами будут docker swarm services:
Вы можете развернуть их, используя:
docker deploy --compose-file path_to_compose_file
Затем foobar
подключится к barfoo
, используя имя службы и порт barfoo:80