Bagaimana cara mengatur port admin yang berbeda untuk wadah Zookeeper Docker yang berbeda?

Saya membuat sekelompok tiga kontainer buruh pelabuhan penjaga kebun binatang dalam satu sistem. Server admin dari buruh pelabuhan zookeeper pertama menggunakan port 8080, jadi untuk dua kontainer Zoo lainnya, ia memberikan Failed to bind to /0.0.0.0:8080, alamat sedang digunakan. Saya menggunakan versi kebun binatang sebagai penjaga kebun binatang:3.5.6.

Sekarang pertanyaan saya adalah bagaimana cara menetapkan port admin yang berbeda ke server admin penjaga kebun binatang selain 8080?

Saya telah mencoba berbagai opsi untuk mengatur server admin pada port yang berbeda, tetapi tidak ada yang berhasil.

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

Di bawah ini adalah penulisan buruh pelabuhan untuk satu penjaga kebun binatang.

 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"

Adakah yang bisa menyarankan saya cara melakukan itu?


person Suvendu Ghosh    schedule 08.10.2020    source sumber
comment
Dalam penulisan buruh pelabuhan, Anda dapat menentukan zookeeper 3 kali, setiap kali dengan port yang berbeda. Juga, jadikan node pertama sebagai node master, dan dua lainnya sebagai node pekerja.   -  person Peter Majko    schedule 09.10.2020


Jawaban (2)


Mengingat file penulisan buruh pelabuhan yang Anda posting, elemen yang bermasalah adalah network_mode: "host". Mengutip dokumentasi resmi:

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

Jika Anda menggunakan mode jaringan host untuk sebuah kontainer, tumpukan jaringan kontainer tersebut tidak diisolasi dari host Docker (kontainer berbagi namespace jaringan host), dan kontainer tersebut tidak mendapatkan alokasi alamat IP-nya sendiri. Misalnya, jika Anda menjalankan container yang terikat ke port 80 dan Anda menggunakan jaringan host, aplikasi container tersebut tersedia di port 80 pada alamat IP host.

Jadi, kenyataannya, masing-masing dari tiga anggota kuorum penjaga kebun binatang yang Anda jalankan bersaing dalam mengalokasikan port 8080, mengabaikan pengikatan port yang Anda tetapkan nanti.

person Arvanitis Christos    schedule 11.10.2020
comment
terima kasih @Arvanitis, saya ketinggalan menghapus network_mode dari definisi penjaga kebun binatang yang menulis buruh pelabuhan. - person Suvendu Ghosh; 12.10.2020

Port server admin 8080 hanya tersedia di dalam kontainer sampai Anda mengeksposnya dengan pemetaan port. Jika Anda ingin mengekspos port ke host buruh pelabuhan, Anda harus menetapkan pemetaan port yang berbeda ke kedua container zookeeper Anda.

Dalam hal ini, Anda mencoba mengubah port server admin internal kontainer yang tidak diperlukan. Anda dapat mengambil contoh file penulisan buruh pelabuhan berikut -

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 - Port 8080 tersedia di dalam container dan kami mengekspos port yang sama ke host buruh pelabuhan. zoo2 - Port 8080 tersedia di dalam container tetapi kami mengekspos port yang berbeda (8078) ke host buruh pelabuhan.

Sekarang Anda dapat mengakses antarmuka menggunakan port 8080 untuk container pertama dan 8078 untuk container kedua dari host buruh pelabuhan Anda.

person Ravi    schedule 08.10.2020
comment
hai @Ravi terima kasih atas balasannya, tapi saya sudah mencoba hal yang sama (port kontainer internal 80 ke port terbuka berbeda 81) tetapi di dalam kontainer juga tidak memungkinkan saya menggunakan port 8080 yang sama karena sudah digunakan oleh kontainer penjaga kebun binatang lain, dengan pengecualian org.apache.zookeeper.server.admin.AdminServer$AdminServerException: Masalah memulai AdminServer pada alamat 0.0.0.0, port 8080 dan URL perintah/perintah - person Suvendu Ghosh; 08.10.2020
comment
hai @SuvenduGhosh, Bisakah Anda membagikan file docker-compose.yml lengkap Anda jika memungkinkan? - person Ravi; 08.10.2020