Я изучаю сеть докеров. Я создал простой docker-compose
файл, который запускает два контейнера tomcat:
version: '3'
services:
tomcat-server-1:
container_name: tomcat-server-1
image: .../apache-tomcat-10.0:1.0
ports:
- "8001:8080"
tomcat-server-2:
container_name: tomcat-server-2
image: .../apache-tomcat-10.0:1.0
После запуска контейнеров с docker-compose up
я вижу, что tomcat-server-1
ответов на http: // localhost: 8001. На первый взгляд, tomcat-server-2
недоступен с localhost. Это здорово, это то, что мне нужно.
Когда я проверяю два запущенных контейнера, я вижу, что они используют следующие внутренние IP-адреса:
- кот-сервер-1: 172.18.0.2
- кот-сервер-2: 172.18.0.3
Я вижу, что tomcat-server-1
также доступен с хост-машины через http://172.18.0.2:8080.
Затем меня удивило следующее: tomcat-server-2
также доступен с хост-машины, например http://172.18.0.3:8080, несмотря на то, что сопоставление портов не определено для этого контейнера в файле docker-compose.yml
.
Я хотел бы достичь следующего:
- Два сервера tomcat должны видеть друг друга во внутренней сети докеров через имена хостов.
- Tomcat должен быть доступен с хост-машины, ТОЛЬКО если сопоставление портов определено в файле docker-compose, например: 8001: 8080.
- Если определение сопоставления портов отсутствует, контейнер НЕ может быть недоступен. Либо с localhost, либо с его внутреннего IP, например: 172.18.0.3.
Я пробовал использовать разные сетевые конфигурации, такие как мост, отсутствие и режим хоста. Безуспешно.
Конечно, режим host
не может работать, потому что оба контейнера tomcat используют внутри один и тот же порт 8080. Так что, если я прав, то я могу рассмотреть только режим bridge
или none
.
Можно ли таким образом настроить сеть докеров? Было бы здорово решить эту проблему с помощью только файла docker-compose без каких-либо внешних манипуляций с докером, iptable и т. Д.