วิธีการตั้งค่าพอร์ตผู้ดูแลระบบที่แตกต่างกันสำหรับคอนเทนเนอร์ Zookeeper Docker ที่แตกต่างกัน

ฉันกำลังสร้างคลัสเตอร์ของคอนเทนเนอร์นักเทียบท่าผู้ดูแลสัตว์สามตัวบนระบบเดียว เซิร์ฟเวอร์ผู้ดูแลระบบของนักเทียบท่าผู้ดูแลสัตว์ตัวแรกนั้นใช้งานพอร์ต 8080 ดังนั้นสำหรับคอนเทนเนอร์ Zoo อีกสองตัว มันให้ Failed tobind to /0.0.0.0:8080, ที่อยู่ที่ใช้งานอยู่ ฉันใช้เวอร์ชันสวนสัตว์เป็นผู้ดูแลสวนสัตว์:3.5.6

ตอนนี้คำถามของฉันคือจะกำหนดพอร์ตผู้ดูแลระบบที่แตกต่างกันให้กับเซิร์ฟเวอร์ผู้ดูแลระบบผู้ดูแลสวนสัตว์ที่ไม่ใช่ 8080 ได้อย่างไร

ฉันได้ลองใช้ตัวเลือกอื่นเพื่อตั้งค่าเซิร์ฟเวอร์ผู้ดูแลระบบบนพอร์ตที่แตกต่างกัน แต่ก็ไม่มีอะไรทำงาน

1) - zookeeper.admin.serverPort=8078
2) - ZOO_CFG_EXTRA="admin.serverPort=8077"
3) - admin.serverPort=8078

ด้านล่างนี้คือนักเทียบท่าที่เขียนสำหรับผู้ดูแลสวนสัตว์หนึ่งคน

 zk2:
  hostname: ${LOCAL_HOST}
  image: ${ZOOKEEPER_IMAGE}
  environment:
    - u=${USER}:${USER}
    - JVM_OPTS=-Xmx12g -Xms12g -XX:MaxPermSize=2048m
    - ZOO_MY_ID=${ZOO_MY_ID2}
    - ZOO_SERVERS=${ZOO_SERVER_1} ${ZOO_SERVER_2} ${ZOO_SERVER_3}
    - ZOO_ADMINSERVER_ENABLED=true
    - ZOO_STANDALONE_ENABLED=false
    - zookeeper.admin.serverPort=8078
  volumes:
    - ${VOLUMES_PATH}/zk2/data:/data
    - ${VOLUMES_PATH}/zk2/logs:/datalog
  network_mode: "host"
  ports:
    - ${ZOOK_CL_PORT2}:${ZOOK_CL_PORT2}
    - ${ZOOK_SR_PORT2}:${ZOOK_SR_PORT2}
    - ${ZOOK_EL_PORT2}:${ZOOK_EL_PORT2}
    - ${ZOOK_ADM_PORT2}:8078"

ใครช่วยแนะนำฉันได้บ้างว่าต้องทำอย่างไร?


person Suvendu Ghosh    schedule 08.10.2020    source แหล่งที่มา
comment
ในการเขียนนักเทียบท่า คุณสามารถระบุผู้ดูแลสัตว์ได้ 3 ครั้งในแต่ละครั้งโดยใช้พอร์ตอื่น นอกจากนี้ ให้สร้างอันแรกเป็นโหนดหลัก และอีกสองอันเป็นผู้ปฏิบัติงาน   -  person Peter Majko    schedule 09.10.2020


คำตอบ (2)


เมื่อพิจารณาจากไฟล์เขียนนักเทียบท่าที่คุณโพสต์ องค์ประกอบที่เป็นปัญหาคือ network_mode: "host" อ้างถึงเอกสารอย่างเป็นทางการ:

https://docs.docker.com/network/host/

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

ดังนั้น ที่จริงแล้ว สมาชิกโควรัมผู้ดูแลสวนสัตว์ทั้งสามคนที่คุณดำเนินการ กำลังแข่งขันกันเพื่อจัดสรรพอร์ต 8080 โดยไม่สนใจการเชื่อมโยงพอร์ตที่คุณกำหนดไว้ในภายหลัง

person Arvanitis Christos    schedule 11.10.2020
comment
ขอบคุณ @Arvanitis ฉันพลาดที่จะลบ network_mode ออกจากคำจำกัดความของผู้ดูแลสวนสัตว์ที่เขียนโดยนักเทียบท่า - person Suvendu Ghosh; 12.10.2020

พอร์ตเซิร์ฟเวอร์ผู้ดูแลระบบ 8080 พร้อมใช้งานภายในคอนเทนเนอร์เท่านั้น จนกว่าคุณจะเปิดเผยด้วยการแมปพอร์ต หากคุณต้องการเปิดเผยพอร์ตให้กับโฮสต์นักเทียบท่า คุณควรกำหนดการแมปพอร์ตที่แตกต่างกันให้กับคอนเทนเนอร์ผู้ดูแลสัตว์ทั้งสองของคุณ

ในกรณีนี้ คุณกำลังพยายามเปลี่ยนพอร์ตเซิร์ฟเวอร์ผู้ดูแลระบบภายในของคอนเทนเนอร์ซึ่งไม่จำเป็น คุณสามารถใช้ตัวอย่างของไฟล์นักเทียบท่าเขียนต่อไปนี้ -

version: '3.4'

services:
  zoo1:
    image: 'zookeeper'
    ports:
      - '2181:2181'
      - '8080:8080'
    environment:
      ZOO_SERVER_ID: 1
      ALLOW_ANONYMOUS_LOGIN: "yes"
      ZOO_ADMINSERVER_ENABLED: "true"
      ZOO_SERVERS: "zoo1:2888:3888,zoo2:2888:3888"
  zoo2:
    image: 'zookeeper'
    ports:
      - '3181:2181'
      - '8078:8080'
    environment:
      ZOO_SERVER_ID: 2
      ALLOW_ANONYMOUS_LOGIN: "yes"
      ZOO_ADMINSERVER_ENABLED: "true"
      ZOO_SERVERS: "zoo1:2888:3888,zoo2:2888:3888"

zoo1 - พอร์ต 8080 พร้อมใช้งานภายในคอนเทนเนอร์ และเรากำลังเปิดเผยพอร์ตเดียวกันแก่โฮสต์นักเทียบท่า zoo2 - พอร์ต 8080 พร้อมใช้งานภายในคอนเทนเนอร์ แต่เรากำลังเปิดเผยพอร์ตอื่น (8078) ไปยังโฮสต์นักเทียบท่า

ตอนนี้คุณสามารถเข้าถึงอินเทอร์เฟซได้โดยใช้พอร์ต 8080 สำหรับคอนเทนเนอร์แรกและ 8078 สำหรับคอนเทนเนอร์ที่สองจากโฮสต์นักเทียบท่าของคุณ

person Ravi    schedule 08.10.2020
comment
สวัสดี @Ravi ขอบคุณสำหรับการตอบกลับ แต่ฉันได้ลองแบบเดียวกันแล้ว (พอร์ตคอนเทนเนอร์ภายใน 80 ไปยังพอร์ตที่เปิดเผยที่แตกต่างกัน 81) แต่ภายในคอนเทนเนอร์ก็ไม่อนุญาตให้ฉันใช้พอร์ตเดียวกัน 8080 เนื่องจากมีการใช้งานโดยคอนเทนเนอร์ผู้ดูแลสวนสัตว์อื่นแล้ว ด้วยข้อยกเว้น org.apache.zookeeper.server.admin.AdminServer$AdminServerException: ปัญหาในการเริ่มต้น AdminServer บนที่อยู่ 0.0.0.0, พอร์ต 8080 และ URL คำสั่ง /commands - person Suvendu Ghosh; 08.10.2020
comment
สวัสดี @SuvenduGhosh คุณช่วยแชร์ไฟล์ docker-compose.yml ทั้งหมดของคุณได้ไหม ถ้าเป็นไปได้? - person Ravi; 08.10.2020