Skala Docker dengan pengikatan port deterministik

14

Saya ingin skala wildflywadah yang terkena beberapa port dengan hasil deterministik.

docker-compose.yml

version: '3'
services:
  wildfly-server:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        admin_user: admin
        admin_password: admin
    deploy:
      resources:
          limits:
            memory: 1.5G
            cpus: "1.5"
    restart: always
    ports:
      - "8000-8099:8080"
      - "8100-8199:9990"
      - "8200-8299:8787"
    expose:
      - "8080"
      - "9990"
      - "8787"

Dockerfile

FROM jboss/wildfly:16.0.0.Final

# DOCKER ENV VARIABLES
ENV WILDFLY_HOME /opt/jboss/wildfly
ENV STANDALONE_DIR ${WILDFLY_HOME}/standalone
ENV DEPLOYMENT_DIR ${STANDALONE_DIR}/deployments
ENV CONFIGURATION_DIR ${STANDALONE_DIR}/configuration

RUN ${WILDFLY_HOME}/bin/add-user.sh ${admin_user} ${admin_password} --silent

# OPENING DEBUG PORT
RUN rm ${WILDFLY_HOME}/bin/standalone.conf
ADD standalone.conf ${WILDFLY_HOME}/bin/

# SET JAVA ENV VARS
RUN rm ${CONFIGURATION_DIR}/standalone.xml
ADD standalone.xml ${CONFIGURATION_DIR}/

Perintah untuk memulai

docker-compose up --build --force-recreate --scale wildfly-server=10

Ini hampir berfungsi seperti yang saya inginkan, tetapi ada beberapa perbedaan port. Ketika saya membuat wadah, saya ingin mereka memiliki port tambahan untuk setiap wadah yang terbuka sebagai berikut:

machine_1 8001, 8101, 82001
machine_2 8002, 8102, 82002
machine_3 8003, 8103, 82003 

Tapi apa yang saya dapatkan sebagai hasilnya tidak deterministik dan terlihat seperti ini:

machine_1 8001, 8102, 82003
machine_2 8002, 8101, 82001
machine_3 8003, 8103, 82002 

Masalahnya adalah bahwa setiap kali saya menjalankan perintah compose up, port berbeda untuk setiap kontainer.

Contoh output:

CONTAINER ID  COMMAND                  CREATED             STATUS              PORTS                                                                    NAMES
0232f24fbca4  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8028->8080/tcp, 0.0.0.0:8231->8787/tcp, 0.0.0.0:8126->9990/tcp   wildfly-server_7
13a6a365a552  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8031->8080/tcp, 0.0.0.0:8230->8787/tcp, 0.0.0.0:8131->9990/tcp   wildfly-server_10
bf8260d9874d  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8029->8080/tcp, 0.0.0.0:8228->8787/tcp, 0.0.0.0:8129->9990/tcp   wildfly-server_6
3d58f2e9bdfe  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8030->8080/tcp, 0.0.0.0:8229->8787/tcp, 0.0.0.0:8130->9990/tcp   wildfly-server_9
7824a73a09f5  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8027->8080/tcp, 0.0.0.0:8227->8787/tcp, 0.0.0.0:8128->9990/tcp   wildfly-server_3
85425462259d  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8024->8080/tcp, 0.0.0.0:8224->8787/tcp, 0.0.0.0:8124->9990/tcp   wildfly-server_2
5be5bbe8e577  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8026->8080/tcp, 0.0.0.0:8226->8787/tcp, 0.0.0.0:8127->9990/tcp   wildfly-server_8
2512fc0643a3  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8023->8080/tcp, 0.0.0.0:8223->8787/tcp, 0.0.0.0:8123->9990/tcp   wildfly-server_5
b156de688dcb  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8025->8080/tcp, 0.0.0.0:8225->8787/tcp, 0.0.0.0:8125->9990/tcp   wildfly-server_4
3e9401552b0a  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8022->8080/tcp, 0.0.0.0:8222->8787/tcp, 0.0.0.0:8122->9990/tcp   wildfly-server_1

Pertanyaan

Apakah ada cara untuk membuat distribusi pelabuhan menjadi deterministik? Seperti menonaktifkan paralel yang berjalan untuk melakukan pemeriksaan serial pada port yang tersedia atau metode lain? Satu-satunya alternatif yang saya temukan adalah memiliki yml templat dan menghasilkan semua file yang diperlukan (seperti 10 jika saya perlu 10 kontainer dll). Apakah ada solusi alternatif?

Hash
sumber
jika Anda menggunakan server CI seperti jenkins, Anda dapat
mengatasinya dengan
Lingkungan bukan lingkungan tetap. Tujuannya adalah untuk memunculkannya di mana saja sebanyak yang diperlukan. Saya dapat menyelesaikannya dengan ymltemplate yang disebutkan dengan variabel lingkungan yang berbeda, tetapi saya tertarik jika ada cara untuk menggunakannya --scale.
Hash
apakah ada alasan untuk mencegah Anda menggunakan mode Swarm?
eez0
Bagaimana Anda menggunakan mode swarm untuk membuat banyak instance dengan port sekuensial dan dengan port deterministik yang mengikat?
Hash
Anda ingin menjalankan beberapa instance, ketika Anda mengirim permintaan maka itu akan pergi ke salah satu instance yang tersedia. Apakah ini perilaku yang Anda inginkan?
Keaz

Jawaban:

3

Tidak, saat ini Anda tidak dapat (10/14/19) menentukan pilihan port dalam file komposisi buruh pelabuhan. Perilaku ini diminta dalam masalah Github # 722 dan # 1247 , tetapi masalah itu ditutup tanpa masalah telah dilaksanakan.

Jika Anda ingin skala semi-dinamis aplikasi seperti sepertinya Anda lakukan, maka Anda harus menyelesaikannya dengan cara lain. .ymlIde templating Anda terdengar seperti solusi terbersih IMO.

Apakah Anda yakin Anda membutuhkan porta untuk menjadi deterministik? Jika Anda menggunakan proxy terbalik seperti nginx yang mendengarkan pada satu port host dan menyeimbangkan beban antara semua kontainer buruh pelabuhan Anda, apakah itu akan berfungsi untuk kasus penggunaan Anda? Menyiapkan penyeimbang beban nginx dalam wadah buruh pelabuhan cukup mudah. Saya sarankan Anda melihat ke dalam itu, dan jika Anda masih membutuhkan cara deterministik bagi penelepon untuk mengetahui port layanan sehingga dapat mengirim permintaan ke server tertentu berulang kali, kemudian pergi dengan .ymlsolusi templating Anda atau semacam proses penemuan layanan terpisah dari konfigurasi buruh pelabuhan-menulis.

Brendan Goggin
sumber
Terima kasih atas tautannya, saya agak kecewa bahwa mereka bahkan tidak mengatasi masalah ... Saya ingin skala sepenuhnya secara otomatis. :) Saya perlu port deterministik untuk menghasilkan beberapa file sebelum kontainer (masing-masing port harus untuk pengguna yang berbeda sehingga saya berkomentar sebelum load balancing bukan pilihan). Jadi informasi yang Anda bagikan lebih seperti komentar, bukan jawaban.
Hash
Jadi dalam hal ini, Anda tidak benar-benar "secara dinamis skala" dengan cara yang membuat buruh pelabuhan dan buruh pelabuhan siap untuk menangani. Mereka mengharapkan contoh layanan Anda sepenuhnya dapat dipertukarkan, dan dalam kasus Anda mereka tidak ... Anda juga memerlukan semacam mekanisme penemuan layanan atau penetapan deterministik port, dan saya pikir .ymlpendekatan templating Anda adalah yang tercepat, termudah larutan. Dan btw, secara teknis saya menjawab pertanyaan Anda, "Apakah ada cara untuk membuat distribusi pelabuhan menjadi deterministik?" :) tapi saya minta maaf karena saya tidak bisa menyarankan solusi yang lebih bermanfaat.
Brendan Goggin