Masalah saya khusus untuk k6 dan InfluxDB, tetapi saya pikir akar masalahnya lebih umum.

Saya menggunakan distribusi k6 resmi dan docker-compose.yml< /a> untuk menjalankan Grafana dan InfluxDB yang saya mulai dengan perintah docker-compose up -d influxdb grafana.

Dasbor Grafana dapat diakses dari localhost:3000, tetapi menjalankan k6 dengan perintah yang direkomendasikan $ docker run -i loadimpact/k6 run --out influxdb=http://localhost:8086/myk6db - <script.js (mengikuti panduan ini) k6 menampilkan kesalahan berikut (di Linux dan MacOS juga):

level=error msg="InfluxDB: Couldn't write stats" error="Post \"http://localhost:8086/write?consistency=&db=myk6db&precision=ns&rp=\": dial tcp 127.0.0.1:8086: connect: connection refused"

Saya mencoba perintah dengan localhost dan 127.0.0.1 juga untuk InfluxDB. Juga dengan alamat IP yang dikembalikan oleh docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' k6_influxdb_1 Gagal dengan kesalahan di atas atau tidak berfungsi, yang berarti k6 tidak mengeluh, tetapi tidak ada data yang muncul di InfluxDB.

Namun, jika saya menanyakan alamat "IP internal" yang digunakan antarmuka jaringan (dengan perintah ifconfig) dan menggunakan IP itu (192.168.1.66), semuanya berfungsi dengan baik:

docker run -i loadimpact/k6 run --out influxdb=http://192.168.1.66:8086/k6db  - <test.js

Jadi pertanyaan saya adalah:

  1. Mengapa Grafana bekerja dengan baik dengan localhost:3000 dan InfluxDB dengan localhost:8086 tidak?
  2. Mengapa hanya "IP internal" yang berfungsi dan tidak ada IP lain?

Saya tahu ada pertanyaan serupa, tetapi itu tidak menjawab pertanyaan saya.

0
inspiral 5 April 2021, 02:11

1 menjawab

Jawaban Terbaik

Kontainer Docker berjalan di ruang jaringan yang terisolasi. Docker dapat memelihara jaringan internal, dan ada sintaks Compose untuk membuatnya.

Jika Anda melakukan panggilan ke wadah Docker dari luar ruang Docker tetapi pada host yang sama, Anda biasanya dapat menyambungkannya sebagai localhost, dan nomor port pertama yang tercantum di bagian Tulis ports:. Jika Anda melihat file docker-compose.yml yang Anda tautkan, file tersebut mencantumkan ports: [3000:3000], jadi port 3000 di host diteruskan ke port 3000 di container; dan jika Anda memanggil http://localhost:3000 dari browser di host yang sama, itu akan mencapai port yang diteruskan itu.

Jika tidak, panggilan dari satu penampung ke penampung lainnya umumnya dapat menggunakan nama penampung (seperti dalam docker run --name) atau nama layanan Tulis; tetapi, mereka harus berada di jaringan Docker yang sama. File docker-compose.yml itu juga mencantumkan

services:
  influxdb:
    networks:
      - k6
      - grafana

Sehingga Anda dapat mencapai http://influxdb:8086 menggunakan nomor port normal layanan, asalkan wadah panggilan berada di salah satu dari dua jaringan tersebut. Jika layanan memiliki ports:, layanan tersebut tidak dipertimbangkan untuk panggilan antar-kontainer.

Dalam dokumentasi Docker, Networking in Compose memiliki detail selengkapnya tentang penyiapan ini.

Ada satu trik terakhir yang dapat membantu Anda menjalankan perintah spesifik yang Anda coba jalankan. docker-compose run akan menjalankan perintah satu kali, menggunakan penyiapan untuk beberapa wadah di docker-compose.yml, kecuali tanpa ports: dan mengganti command:-nya. File docker-compose.yml yang Anda rujuk menyertakan wadah k6, di jaringan k6, yang menjalankan gambar loadimpact/k6. Jadi kamu mungkin bisa lari

docker-compose run k6 \
  run --out influxdb=http://influxdb:8086/myk6db - \
  <script.js

(Dan mungkin variabel lingkungan K6_OUT di docker-compose.yml dapat menyediakan opsi --out itu untuk Anda.)

Anda seharusnya tidak perlu mencari alamat IP container-private. Mereka tidak dapat digunakan dalam berbagai skenario umum, dan di antara jaringan Docker untuk panggilan antar container dan port yang diterbitkan untuk panggilan dari luar Docker, ada cara yang lebih baik untuk melakukan panggilan ke container.

1
David Maze 5 April 2021, 00:30