Добавьте раздел в ваш файл compose для каждой службы, который объявляет stati c IP-адреса для каждого контейнера:
services:
webserver:
build:
dockerfile: Dockerfile
context: .
depends_on:
- some_other_container
ports:
- "443:443"
environment:
- MY_VAR='my_val'
########### ADD THIS PART ##############
networks:
dev_net:
ipv4_address: "192.168.0.50"
и добавьте раздел на том же уровне, что и services
для сети:
networks:
dev_net:
name: my_dev_net
driver: overlay
ipam:
config:
- subnet: "192.168.0.0/24"
Затем убедитесь, что размещенные приложения настроены на использование этих IP-адресов для связи. Если IP-адреса не назначены вручную, docker будет в значительной степени действовать как DHCP-сервер и давать любые IP-адреса, которые он решит назначить.
Для пояснения : Я думаю, что часть проблемы, с которой вы столкнулись, связана с Docker сетевым подключением: на Ma c и Windows, Docker can действительно не предоставляет полностью маршрутизируемую виртуальную сеть, где IP-адреса, назначенные контейнерам, доступны напрямую извне. Неважно, с каким решением вы go столкнетесь, придется обойти это ограничение. Единственный способ сделать контейнер доступным извне - это напрямую связать его с портами на хосте (используя docker run -p [source_port]:[host_port]
)
Вот демонстрация, которая должна прояснить мое предложение. Это будет:
- Сборка двух контейнеров с использованием одного
docker-compose.yml
файла - Контейнер # 1 будет использовать openssl для обслуживания простого текстового файла на порту 8080
- Порт 8080 на Контейнер # 1 будет привязан к тому же порту на хосте
- Контейнер # 2 будет использовать curl для извлечения файла из Контейнер # 1 с использованием IP-адреса частной сети
- Та же команда curl запускается с host , но с использованием
localhost
вместо частного IP (так как не доступен извне docker) - Оба контейнера имеют назначенные stati c IP-адреса в частной сети Docker (которая определена в файле compose)
Цель этого - представить минимальный пример, который: позволяет двум Docker контейнерам связываться; через docker частную сеть; использование приватных IP-адресов stati c; в то же время привязка к порту в хост-системе; разрешение входящих подключений к контейнеру вне частной сети docker.
docker -compose.yml:
version: "3.7"
services:
c1:
build:
dockerfile: Dockerfile
context: ./c1
ports:
- "8080:8080"
networks:
dev_net:
ipv4_address: "192.168.0.50"
c2:
build:
dockerfile: Dockerfile
context: ./c2
depends_on:
- c1
networks:
dev_net:
ipv4_address: "192.168.0.51"
networks:
dev_net:
name: test_dev_net
driver: overlay
external: false
ipam:
config:
- subnet: "192.168.0.0/24"
Контейнер № 1 Dockerfile:
FROM alpine:3.7
RUN apk update && apk upgrade && apk add openssl
COPY run.sh /run.sh
CMD ["/run.sh"]
Запуск контейнера # 1. sh:
#!/bin/sh
echo "HELLO, WORLD!" >> test_file.txt
openssl req -x509 -newkey rsa:2048 -keyout key.pem \
-out cert.pem -days 365 -nodes -subj /C=\/ST=\/L=\/O=\/OU=\/CN=\/
openssl s_server -key key.pem -cert cert.pem -accept 8080 -HTTP &
sleep 25
Контейнер №2 Dockerfile:
FROM alpine:3.7
RUN apk update && apk upgrade && apk add curl;
COPY run.sh /run.sh
CMD ["/run.sh"]
Запуск контейнера # 2. sh:
#!/bin/sh
c1_url="https://192.168.0.50:8080/test_file.txt"
for _ in $(seq 0 2); do
curl -k -g ${c1_url}
sleep 5
done
сборка / запуск / тестирование:
$ docker-compose up & \
sleep 10 && \
curl -k -g "https://localhost:8080/test_file.txt"
[3] 63380
Starting docker_c1_1 ... done
Starting docker_c2_1 ... done
Attaching to docker_c1_1, docker_c2_1
c1_1 | Generating a RSA private key
c1_1 | .....................................+++++
c1_1 | writing new private key to 'keys/key.pem'
c1_1 | No value provided for Subject Attribute C, skipped
c1_1 | No value provided for Subject Attribute ST, skipped
c1_1 | No value provided for Subject Attribute L, skipped
c1_1 | No value provided for Subject Attribute O, skipped
c1_1 | No value provided for Subject Attribute OU, skipped
c1_1 | No value provided for Subject Attribute CN, skipped
c2_1 | % Total % Received % Xferd Average Speed Time Time Time Current
c2_1 | Dload Upload Total Spent Left Speed
100 42 0 42 0 0 3230 0 --:--:-- --:--:-- --:--:-- 3230
c2_1 | HELLO, WORLD! <<<<------ Container #2 curl output
c2_1 | HELLO, WORLD!
c2_1 | HELLO, WORLD!
HELLO, WORLD! <<<<------ Host curl output
docker_c2_1 exited with code 0
c1_1 | DONE. Exiting...
docker_c1_1 exited with code 0
[3] Done docker-compose up
$
Таким образом, это решение будет работать, чтобы docker -компоновать возможность создавать контейнеры, которые используют статическую c IP-адресацию на частной docker сети и которые также доступны через привязку порта на хосте.