Добавьте раздел в свой файл композиции под каждой службой, который объявляет статические 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-адреса не назначаются вручную, докер будет в значительной степени действовать как DHCP-сервер и давать любые IP-адреса, которые он решит назначить.
Чтобы уточнить: я думаю, что часть проблемы, с которой вы столкнулись, связана с самой сетью Docker: на Mac и Windows Docker действительно не может предоставить полностью маршрутизируемую виртуальную сеть, в которой IP-адреса, назначенные контейнерам, доступны. прямо снаружи. Независимо от того, какое решение вы выберете, это ограничение придется обойти. Единственный способ сделать контейнер доступным извне - напрямую привязать его к портам на хосте (используя docker run -p [source_port]:[host_port]
).
Вот демонстрация, которая должна прояснить мое предложение. Это будет:
- Создайте два контейнера, используя один
docker-compose.yml
файл
- Контейнер №1 будет использовать openssl для обслуживания простого текстового файла через порт 8080.
- Порт 8080 в контейнере №1 будет привязан к тому же порту на хосте.
- Контейнер № 2 будет использовать curl для извлечения файла из Контейнера № 1 с использованием IP-адреса частной сети.
- Та же команда curl запускается с хоста, но с использованием
localhost
вместо частного IP (поскольку он недоступен из внешнего докера)
- Обоим контейнерам назначаются статические IP-адреса в частной сети Docker (которая определена в файле создания).
Цель этого состоит в том, чтобы представить минимальный пример, который: позволяет двум контейнерам Docker взаимодействовать; через частную сеть докера; использование частных статических IP-адресов; а также привязку к порту в хост-системе; разрешение входящих подключений к контейнеру из-за пределов частной сети докера.
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 run.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 run.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-compose создавать контейнеры, которые используют статическую IP-адресацию в частной сети докеров и которые также доступны через привязку порта на хосте.
person
Z4-tier
schedule
12.03.2020
api
контейнер докеров? - person Thanh Nguyen Van   schedule 12.03.2020/api/*
будут перенаправлены наlocalhost:44384
. Однако в прокси-контейнере localhost ссылается на сам контейнер, а в прокси-контейнере на 44384 ничего не работает. Вы можете найти решение. Прочтите больше и больше а>. - person leopal   schedule 12.03.2020