Docker-compose aracılığıyla docker kapsayıcılarına statik IP sağlayın


95

Kapsayıcılara statik IP adresi sağlamaya çalışıyorum. Özel bir ağ oluşturmam gerektiğini anlıyorum. Ben yaratıyorum ve ana makinede (Ubuntu 16.x) köprü arayüzü var. Kapsayıcılar bu alt ağdan IP alıyor, ancak sağladığım statik değil.

İşte docker-compose.yml'im:

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

Konteynerler 5 ve 6 yerine 10.5.0.2 ve 10.5.0.3 alır.


aux-adresi, ipam sürücüsünü ağda halihazırda kullanımda olan IP adresleri hakkında manuel olarak bilgilendirmek için kullanılır
Hamza

Hizmete statik bir ip tahsis ettiğimde 'docker compose up -d --scale container-name = 3' kullanarak bu konteynerlerden birini nasıl ölçeklendirebilirim?
yash

Yanıtlar:


121

Kapsayıcı ağınızın dışından içine yönlendirmeye izin veren bir şey yapmadığınız sürece Docker'daki kapsayıcılar için sabit bir IP önermediğimi unutmayın (örn. Macvlan). DNS, kapsayıcı ağının içinde hizmet keşfi için zaten oradadır ve kapsayıcı ölçeklendirmeyi destekler. Ve konteyner ağının dışında, ana bilgisayardaki açık bağlantı noktalarını kullanmalısınız. Bu sorumluluk reddi beyanıyla, işte istediğiniz oluşturma dosyası:

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

2
Kullanıcı tarafından yapılandırılan alt ağın tanımlandığı oluşturma dosyasının alt yarısını kaçırmış olmalısınız.
BMitch

11
3. versiyonda bunu nasıl yapabilirsiniz?
Atr_Max

4
@Atr_Max Şu anda şunları yapamazsınız: "Not: Ağ geçidi gibi ek IPAM yapılandırmaları şu anda yalnızca sürüm 2 için geçerlidir." docs.docker.com/compose/compose-file/#ipam
BMitch

2
@Ryan Statik IP'ler güvenliği artırmaz, yine de aynı bağlantıları açmanız gerekir ve konteynerleriniz yine de yalnızca ihtiyacınız olanı açığa çıkardığınız ad alanlı bir ağın içinde çalışır. Statik IP'ler, uygulamanızda sürekli güncelleme yapma yeteneği dahil olmak üzere esnekliği azaltır, sürü modunda çalışmaz ve konteynerin yapılandırmasının ortamlar veya benzer konteynerler arasında kopyalanmasını zorlaştırır. Bağlantılı sorun için, konteynerin içindeki 0.0.0.0'ı dinlemeniz yeterlidir.
BMitch

1
@alvery Ben aynı sorunu var, liman işçisi-oluşturma zaten oluşturulmuş ağ (belki bir hata) üzerinde yapılandırma geçerli değildir çünkü --force-Tekrar Oluştur seçeneği kullanmak gerekmez
HugoPoi

21

Özel ada sahip bir ortam değişkeniyle bazı zorluklarla karşılaşıyordum (KAPACITOR_BASE_URL ve KAPACITOR_ALERTS_ENDPOINT için kapsayıcı adı / bağlantı noktası kurallarında değil). Bu durumda servis adı verirsek, ip'i şu şekilde çözmez

KAPACITOR_BASE_URL:  http://kapacitor:9092

Yukarıda http://[**kapacitor**]:9092çözülmezhttp://172.20.0.2:9092

Statik IP sorunlarını alt ağ yapılandırmalarını kullanarak çözdüm.

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:
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.