จัดเตรียม IP แบบคงที่ให้กับคอนเทนเนอร์นักเทียบท่าผ่านนักเทียบท่า


95

ฉันกำลังพยายามระบุที่อยู่ 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


aux-address ใช้เพื่อแจ้งไดรเวอร์ ipam ด้วยตนเองเกี่ยวกับที่อยู่ IP ที่ใช้อยู่ในเครือข่าย
Hamza

ฉันจะปรับขนาดคอนเทนเนอร์เหล่านี้โดยใช้ 'docker compose up -d --scale container-name = 3' ได้อย่างไรเมื่อฉันจัดสรร IP แบบคงที่ให้กับบริการ
yash

คำตอบ:


121

โปรดทราบว่าฉันไม่แนะนำ IP คงที่สำหรับคอนเทนเนอร์ใน Docker เว้นแต่คุณจะทำบางอย่างที่อนุญาตให้กำหนดเส้นทางจากภายนอกไปยังภายในเครือข่ายคอนเทนเนอร์ของคุณ (เช่น macvlan) DNS มีอยู่แล้วสำหรับการค้นหาบริการภายในเครือข่ายคอนเทนเนอร์และรองรับการปรับขนาดคอนเทนเนอร์ และนอกเครือข่ายคอนเทนเนอร์คุณควรใช้พอร์ตที่เปิดเผยบนโฮสต์ ด้วยข้อจำกัดความรับผิดชอบดังกล่าวนี่คือไฟล์เขียนที่คุณต้องการ:

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
คุณต้องพลาดครึ่งล่างของไฟล์เขียนที่ผู้ใช้กำหนดค่าซับเน็ตไว้
BMitch

11
คุณทำได้อย่างไรในเวอร์ชัน 3?
Atr_Max

4
@Atr_Max ในขณะนี้คุณไม่สามารถ: "หมายเหตุ: การกำหนดค่า IPAM เพิ่มเติมเช่นเกตเวย์ใช้ได้เฉพาะกับเวอร์ชัน 2 ในขณะนี้" docs.docker.com/compose/compose-file/#ipam
BMitch

2
@Ryan Static IP จะไม่ปรับปรุงความปลอดภัยคุณยังคงต้องเปิดการเชื่อมต่อเดิมและคอนเทนเนอร์ของคุณจะยังคงทำงานอยู่ภายในเครือข่ายเนมสเปซที่คุณจะเปิดเผยเฉพาะสิ่งที่คุณต้องการเท่านั้น Static IP จะลดความยืดหยุ่นรวมถึงความสามารถในการอัปเดตทีละขั้นตอนของแอปพลิเคชันของคุณไม่ทำงานในโหมดจับกลุ่มและทำให้การกำหนดค่าของคอนเทนเนอร์ยากขึ้นในการคัดลอกระหว่างสภาพแวดล้อมหรือคอนเทนเนอร์ที่คล้ายกัน สำหรับปัญหาที่เชื่อมโยงคุณเพียงแค่ต้องฟัง 0.0.0.0 ภายในคอนเทนเนอร์
BMitch

1
@ ทุกอย่างฉันมีปัญหาเดียวกันคุณต้องใช้ตัวเลือก - บังคับใช้ใหม่เนื่องจากนักเทียบท่าเขียนไม่ได้ใช้การกำหนดค่าบนเครือข่ายที่สร้างไว้แล้ว (อาจเป็นข้อผิดพลาด)
HugoPoi

21

ฉันประสบปัญหาบางอย่างกับตัวแปรสภาพแวดล้อมที่มีชื่อที่กำหนดเอง (ไม่ใช่กับชื่อคอนเทนเนอร์ / รูปแบบพอร์ตสำหรับ 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:
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.