Предоставить статический IP для контейнеров Docker через docker-compose
Я пытаюсь предоставить статический IP-адрес для контейнеров. Я понимаю, что я должен создать собственную сеть. Я создаю его, и интерфейс моста работает на хост-машине (Ubuntu 16.x). Контейнеры получают IP из этой подсети, но не статический, который я предоставил.
Вот мой docker-compose.yml:
version: '2'
services:
mysql:
container_name: mysql
image: mysql:latest
restart: always
environment:
- MYSQL_ROOT_PASSWORD=root
ports:
- "3306:3306"
networks:
- vpcbr
apigw-tomcat:
container_name: apigw-tomcat
build: tomcat/.
ports:
- "8080:8080"
- "8009:8009"
networks:
- vpcbr
depends_on:
- mysql
networks:
vpcbr:
driver: bridge
ipam:
config:
- subnet: 10.5.0.0/16
gateway: 10.5.0.1
aux_addresses:
mysql: 10.5.0.5
apigw-tomcat: 10.5.0.6
Контейнеры получают 10.5.0.2 и 10.5.0.3 вместо 5 и 6.
5 ответов
Обратите внимание, что я не рекомендую фиксированный IP для контейнеров в Docker, если вы не делаете что-то, что позволяет маршрутизировать снаружи внутрь вашей контейнерной сети (например, macvlan). DNS уже существует для обнаружения службы внутри контейнерной сети и поддерживает масштабирование контейнера. А вне контейнерной сети вы должны использовать открытые порты на хосте. С этим отказом от ответственности, вот вам файл compose:
version: '2'
services:
mysql:
container_name: mysql
image: mysql:latest
restart: always
environment:
- MYSQL_ROOT_PASSWORD=root
ports:
- "3306:3306"
networks:
vpcbr:
ipv4_address: 10.5.0.5
apigw-tomcat:
container_name: apigw-tomcat
build: tomcat/.
ports:
- "8080:8080"
- "8009:8009"
networks:
vpcbr:
ipv4_address: 10.5.0.6
depends_on:
- mysql
networks:
vpcbr:
driver: bridge
ipam:
config:
- subnet: 10.5.0.0/16
gateway: 10.5.0.1
Я столкнулся с некоторыми трудностями с переменной среды, которая имеет пользовательское имя (не с именем контейнера / соглашением о порте для KAPACITOR_BASE_URL и KAPACITOR_ALERTS_ENDPOINT). Если мы дадим имя сервиса в этом случае, он не разрешит IP как
KAPACITOR_BASE_URL: http://kapacitor:9092
В выше http://[**kapacitor**]:9092
не разрешит http://172.20.0.2:9092
Я решил проблемы со статическими IP-адресами, используя конфигурации подсетей.
version: "3.3"
networks:
frontend:
ipam:
config:
- subnet: 172.20.0.0/24
services:
db:
image: postgres:9.4.4
networks:
frontend:
ipv4_address: 172.20.0.5
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
redis:
image: redis:latest
networks:
frontend:
ipv4_address: 172.20.0.6
ports:
- "6379"
influxdb:
image: influxdb:latest
ports:
- "8086:8086"
- "8083:8083"
volumes:
- ../influxdb/influxdb.conf:/etc/influxdb/influxdb.conf
- ../influxdb/inxdb:/var/lib/influxdb
networks:
frontend:
ipv4_address: 172.20.0.4
environment:
INFLUXDB_HTTP_AUTH_ENABLED: "false"
INFLUXDB_ADMIN_ENABLED: "true"
INFLUXDB_USERNAME: "db_username"
INFLUXDB_PASSWORD: "12345678"
INFLUXDB_DB: db_customers
kapacitor:
image: kapacitor:latest
ports:
- "9092:9092"
networks:
frontend:
ipv4_address: 172.20.0.2
depends_on:
- influxdb
volumes:
- ../kapacitor/kapacitor.conf:/etc/kapacitor/kapacitor.conf
- ../kapacitor/kapdb:/var/lib/kapacitor
environment:
KAPACITOR_INFLUXDB_0_URLS_0: http://influxdb:8086
web:
build: .
environment:
RAILS_ENV: $RAILS_ENV
command: bundle exec rails s -b 0.0.0.0
ports:
- "3000:3000"
networks:
frontend:
ipv4_address: 172.20.0.3
links:
- db
- kapacitor
depends_on:
- db
volumes:
- .:/var/app/current
environment:
DATABASE_URL: postgres://postgres@db
DATABASE_USERNAME: postgres
DATABASE_PASSWORD: postgres
INFLUX_URL: http://influxdb:8086
INFLUX_USER: db_username
INFLUX_PWD: 12345678
KAPACITOR_BASE_URL: http://172.20.0.2:9092
KAPACITOR_ALERTS_ENDPOINT: http://172.20.0.3:3000
volumes:
postgres_data:
Если вы никогда не видите установленный статический IP-адрес, возможно, это связано с тем, что вы используете команду «docker compose up». Попробуйте использовать "docker-compose up".
Когда я использую «docker-compose up» (с дефисом), я теперь вижу назначенные статические IP-адреса.
networks:
mynet:
driver: bridge
ipam:
driver: default
config:
- subnet: 192.168.55.0/24
gateway: 192.168.55.1
services:
web:
image: 'mycompany/webserver:latest'
hostname: www
domainname: mycompany.com
stdin_open: true # docker run -i
tty: true # docker run -t
networks:
hfnet:
ipv4_address: 192.168.55.10
ports:
- '80:80'
- '443:443'
volumes:
- '../honeyfund:/var/www/html'
Я потратил много времени, чтобы понять это. :(
Я понял, что более удобный и осмысленный способ — дать контейнеру имя контейнера. Вы можете использовать имя в той же сети докеров, что и источник. Это помогло мне, потому что у докер-контейнеров менялись IP-адреса, и благодаря этому я мог общаться с другим контейнером со статическим именем, которое я могу использовать в конфигурационных файлах.
Статические IP-адреса в докере очень полезны, особенно при использовании с обратным прокси-сервером. Эмпирическое правило заключается в том, что первый файл компоновки Docker (контейнер) определяет сетевую подсеть, которая будет использоваться будущими контейнерами.
Простой вариант использования — работа с прокси-менеджером, который направляет трафик в контейнеры в дополнение к выделению контейнерам SSL-сертификатов. Источник: Docker Compose для статического/фиксированного IP-адреса (открывает видео на YouTube).