Cung cấp IP tĩnh cho vùng chứa của docker thông qua docker-soạn


95

Tôi đang cố gắng cung cấp địa chỉ IP tĩnh cho vùng chứa. Tôi hiểu rằng tôi phải tạo một mạng tùy chỉnh. Tôi tạo nó và giao diện cầu nối trên máy chủ (Ubuntu 16.x). Các vùng chứa nhận IP từ mạng con này nhưng không phải là tĩnh mà tôi đã cung cấp.

Đây là docker-compo.yml của tôi:

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

Các vùng chứa nhận được 10.5.0.2 và 10.5.0.3, thay vì 5 và 6.


aux-address được sử dụng để thông báo thủ công cho ipam-driver về các địa chỉ IP đã được sử dụng trong mạng
Hamza

Làm cách nào để tôi có thể mở rộng quy mô một trong hai vùng chứa này bằng cách sử dụng 'docker compile up -d --scale container-name = 3' khi tôi đã cấp phát một ip tĩnh cho dịch vụ?
yash

Câu trả lời:


121

Lưu ý rằng tôi không đề xuất IP cố định cho các vùng chứa trong Docker trừ khi bạn đang làm điều gì đó cho phép định tuyến từ bên ngoài vào bên trong mạng vùng chứa của mình (ví dụ: macvlan). DNS đã có sẵn để khám phá dịch vụ bên trong mạng vùng chứa và hỗ trợ mở rộng vùng chứa. Và bên ngoài mạng vùng chứa, bạn nên sử dụng các cổng tiếp xúc trên máy chủ. Với tuyên bố từ chối trách nhiệm đó, đây là tệp soạn thảo mà bạn muốn:

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
Bạn hẳn đã bỏ lỡ nửa dưới của tệp soạn thư nơi mạng con do người dùng định cấu hình được xác định.
BMitch

11
Làm thế nào bạn có thể làm điều đó trong phiên bản 3?
Atr_Max

4
@Atr_Max Hiện tại, bạn không thể: "Lưu ý: Các cấu hình IPAM bổ sung, chẳng hạn như cổng, chỉ được áp dụng cho phiên bản 2 tại thời điểm này." docs.docker.com/compose/compose-file/#ipam
BMitch

2
@Ryan Static IP's sẽ không cải thiện bảo mật, bạn vẫn cần mở các kết nối tương tự và các vùng chứa của bạn sẽ vẫn chạy bên trong mạng không gian tên nơi bạn chỉ hiển thị những gì bạn cần. IP tĩnh sẽ làm giảm tính linh hoạt, bao gồm khả năng cập nhật liên tục ứng dụng của bạn, không hoạt động ở chế độ bầy đàn và khiến cấu hình của vùng chứa khó sao chép hơn giữa các môi trường hoặc các vùng chứa tương tự. Đối với vấn đề được liên kết, bạn chỉ cần lắng nghe 0.0.0.0 bên trong vùng chứa.
BMitch

1
@alvery Tôi có cùng một vấn đề, bạn cần phải sử dụng tùy chọn --force-tái vì Docker-soạn không áp dụng cấu hình trên mạng đã tạo ra (có thể là một lỗi)
HugoPoi

21

Tôi đã gặp một số khó khăn với biến môi trường có tên tùy chỉnh (không phải với tên vùng chứa / quy ước cổng cho KAPACITOR_BASE_URL và KAPACITOR_ALERTS_ENDPOINT). Nếu chúng tôi cung cấp tên dịch vụ trong trường hợp này, nó sẽ không giải quyết ip là

KAPACITOR_BASE_URL:  http://kapacitor:9092

Ở trên http://[**kapacitor**]:9092sẽ không giải quyếthttp://172.20.0.2:9092

Tôi đã giải quyết các sự cố IP tĩnh bằng cách sử dụng cấu hình mạng con.

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:
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.