Moby: Dokumentasikan cara terhubung ke Host Docker dari wadah

Dibuat pada 5 Jul 2013  ·  263Komentar  ·  Sumber: moby/moby

Saya mengalami kesulitan mencari tahu cara menghubungkan Host buruh pelabuhan dari wadah. Tidak dapat menemukan dokumentasi, tetapi menemukan log irc yang mengatakan sesuatu tentang menggunakan 172.16.42.1 , yang berfungsi.

Akan lebih baik jika perilaku ini dan bagaimana itu terkait dengan docker0 didokumentasikan.

Komentar yang paling membantu

Saya pikir persyaratannya jelas dari judul masalah. Perlu ada cara yang mudah dan terdokumentasi dengan baik untuk berbicara dengan tuan rumah dari wadah, bagaimanapun itu diterapkan.

Semua 263 komentar

ketika Anda melihat ke dalam network.go Anda menemukan bahwa buruh pelabuhan memeriksa jaringan internal yang tidak dirutekan.

pertama 172.16.42.1 ditebak sebagai alamat jembatan kemudian yang lain.

Jadi mendokumentasikan ini tidak akan banyak membantu. Ini adalah skema dinamis yang tidak dapat Anda andalkan.

Saya pikir apa yang Anda butuhkan lebih merupakan cara untuk menentukan alamat yang digunakan untuk jembatan dan klien.
mungkinkah itu?

Saya pikir persyaratannya jelas dari judul masalah. Perlu ada cara yang mudah dan terdokumentasi dengan baik untuk berbicara dengan tuan rumah dari wadah, bagaimanapun itu diterapkan.

+1 Akan sangat menyenangkan memiliki cara yang baik untuk terhubung ke sistem host

+1, cabang 1.0 akan mendefinisikan API introspeksi sehingga setiap wadah dapat berinteraksi dengan host dengan cara yang terbatas dan terkendali.
saya
Ini saat ini direncanakan untuk 0,8.


@solomonstre
@getdocker

Pada Kam, 8 Agustus 2013 pukul 13:10, EJ Bensing [email protected]
menulis:

+1 Akan sangat menyenangkan memiliki cara yang baik untuk terhubung ke sistem host

Balas email ini secara langsung atau lihat di GitHub:
https://github.com/dotcloud/docker/issues/1143#issuecomment -22351792

Jadi bagaimana saya bisa terhubung ke Host buruh pelabuhan dari dalam wadah? Saya mencoba terhubung ke wadah buruh pelabuhan melalui port Host daripada IP pribadi wadah.

@gerhard : API introspeksi direncanakan untuk 0.8. Sementara itu, jika Anda ingin mengakses Docker API dari container, Anda dapat mengatur Docker untuk mendengarkan alamat IP dari jembatan Docker.

Untuk melakukannya, Anda akan:

  • membuat jembatan

ip link add docker0 type bridge

  • tetapkan alamat IP untuk itu

ip link set docker0 up
ip addr add 172.17.0.1/16 dev docker0

  • mulai buruh pelabuhan dan ikat API ke jembatan

docker -d -H 172.17.0.1:4242

Sekarang Anda dapat mengakses Docker API dari container Anda.

Saat ini (versi 0.7) buruh pelabuhan tidak secara andal mendukung pemberian akses tak terbatas ke soket kontrolnya sendiri ke salah satu wadahnya. Solusi yang dijelaskan di utas ini adalah peretasan yang tidak dijamin akan berhasil, dan jika memang bisa rusak kapan saja - tolong jangan menggunakannya dalam produksi atau mengharapkan kami untuk mendukungnya. Karena tidak ada fitur resmi untuk didokumentasikan, masalah dokumen ini tidak dapat diperbaiki.

Untuk membahas peretasan dan solusi untuk fitur yang hilang, saya merekomendasikan milis _docker-user_, atau saluran _#docker_ irc di Freenode.

Selamat meretas

@shykes Apakah ada masalah lain yang melacak pembuatan fitur seperti itu, dalam kasus itu?

Omong-omong, untuk memberikan motivasi untuk fitur seperti itu: ini berguna ketika menguji server secara lokal (di mana saya akan menggunakan gelandangan di masa lalu) dan saya ingin menghubungkan server dalam wadah ke database atau server lain yang berjalan di mesin dev saya (host buruh pelabuhan).

Saya sudah menjual nilai fitur ini :)

Pada Senin, 2 Des 2013 pukul 09:09, Caleb [email protected]
menulis:

Omong-omong, untuk memberikan motivasi untuk fitur seperti itu: ini berguna ketika menguji server secara lokal (di mana saya akan menggunakan gelandangan di masa lalu) dan saya ingin menghubungkan server dalam wadah ke database atau server lain yang berjalan di mesin dev saya (host buruh pelabuhan).

Balas email ini secara langsung atau lihat di GitHub:
https://github.com/dotcloud/docker/issues/1143#issuecomment -29636528

Saya menggunakan Fedora 20 dengan docker 0.7.2, menyiapkan Docker UI . Saya harus membuka port tempat daemon buruh pelabuhan mendengarkan sehingga firewall tidak memblokirnya:

  • firewall-cmd --permanent --zone=trusted --add-interface=docker0
  • firewall-cmd --permanent --zone=trusted --add-port=4243/tcp

Setelah itu _docker-ui_ dapat terhubung ke soket kontrol daemon docker.

HTH
Ini adalah kebutuhan yang jelas dan sah untuk fitur tersebut.

Maaf, jika saya membuat utas keras tetap hidup.

Judul masalah ini mengatakan: "Cara terhubung ke Host dari wadah buruh pelabuhan".
Saya tidak melihat bagaimana ini berhubungan dengan fitur docker inspect . Fitur inspeksi digunakan di sisi host untuk menemukan IP wadah, jika saya tidak salah.

Saya pikir masalah oleh bkad adalah menemukan IP Host dari dalam wadah. Memang saya bukan ahli jaringan, tetapi tidak cukup aman untuk mengasumsikan bahwa gateway ip (dari dalam wadah) memetakan ke Host.
(Dengan asumsi seseorang tidak mengonfigurasi pengaturan jembatan atau sesuatu).

Menggunakan gateway untuk 0.0.0.0 dari netstat -nr Saya tentu saja tidak memiliki masalah mencapai server yang berjalan di mesin host saya. Saya menduga bahwa ip gateway statis (setelah buruh pelabuhan dimulai), adakah yang bisa mengonfirmasi itu?

Alternatifnya adalah meneruskan ip publik host saya ke wadah menggunakan variabel lingkungan, tetapi IP publik mungkin tidak statis. Dan sementara nama host mungkin bekerja lebih baik dalam produksi, mereka sulit digunakan secara lokal.

Saya masih lebih suka cara menelepon dari wadah buruh pelabuhan ke Host melalui loopback dan muncul sebagai 127.0.0.1 di Host. Atau jika keamanan menjadi perhatian perangkat loopback lain yang selalu memiliki ip yang sama.
Atau mungkin hal yang saya temukan tidak mengekspos komunikasi saya ke publik? Seperti yang dikatakan saya bukan penyihir jaringan :)
Catatan, jika menggunakan ip-gateway untuk memanggil host buruh pelabuhan adalah "cara yang benar", tidak bisakah kita mendokumentasikannya?

Bagi mereka yang ingin menemukan ip gateway dari container /proc/net/route mungkin adalah tempat yang tepat untuk membacanya.

The Motivation , untuk fitur ini mencakup berbagai layanan meta-data. Mengekspos hal-hal dari layanan meta-data EC2 akan menyenangkan. Distribusi kredensial dan data terstruktur yang lebih kompleks yang tidak sesuai dengan variabel lingkungan.

@jonasfj : sebenarnya ada cara yang lebih mudah, sekarang Docker mendukung file pengikatan dari Host ke wadah. Anda dapat mengikat-mount soket kontrol Docker, yaitu : docker run -v /var/run/docker.sock:/var/run/docker.sock … ; ini lebih mudah daripada mengutak-atik aturan jaringan.

Saya tidak yakin bagaimana soket buruh pelabuhan membantu. Saya masih berpikir masalah harus dibuka kembali, tidak ada dokumentasi untuk skenario berikut:

1) Pada 'Host' layanan berjalan pada port 8080 (katakanlah 'etcd')
2) Dari Host itu wadah buruh pelabuhan dimulai
3) Bagaimana layanan pada port 8080 pada Host dapat dicapai dari wadah buruh pelabuhan? Apa yang akan menjadi URL/IP?

@jpetazzo Bagaimana pengaturan docker.sock berperan untuk menyelesaikan masalah di atas?

@vrvolle , mengekspos docker.sock tidak menyelesaikan masalah asli yang dijelaskan oleh @bkad.
Tetapi seseorang akan mengekspos soket domain unix yang berbeda untuk komunikasi antara Host dan docker-container.

Misalnya, jika Anda ingin mengekspos mysql dari Host, Anda akan mengekspos soket mysql: /tmp/mysql.sock .

Atau jika Anda seperti saya memiliki API metadata di mana wadah harus dapat menanyakan Host untuk berbagai hal yang berguna, Anda membuat soket domain unix Anda sendiri dan memaparkannya ke wadah. HTTP melalui soket domain unix harus bekerja dengan sangat baik. Anda juga tidak memiliki semua masalah konfigurasi jaringan dan masalah keamanan.

baru saja membaca tentang 'soket domain unix'.
tetapi:

http://stackoverflow.com/questions/14771172/http-over-af-unix-http-connection-to-unix-socket

mengklaim tidak ada URL dan oleh karena itu tidak ada klien biasa yang dapat menggunakan mekanisme itu di luar kotak.

Di samping itu:

http://stackoverflow.com/questions/14771172/http-over-af-unix-http-connection-to-unix-socket

menunjukkan bahwa entah bagaimana mungkin untuk menggunakan soket tersebut.

Tapi tetap saja saya ingin secara sederhana dapat memiliki alamat IP dan port, yang dapat digunakan oleh program di dalam buruh pelabuhan. Saya akan -- untuk saat ini -- menggunakan

 netstat -nr | grep '^0\.0\.0\.0' | awk '{print $2}'

Haruskah saya membuat masalah baru atau dapatkah seseorang membuka kembali yang ini.

@vrvolle
Saya bukan orang jaringan, tetapi saya membayangkan bahwa ada beberapa trik yang dapat dilakukan untuk mem-proxy localhost ke dalam wadah melalui soket unix dan kemudian di dalam soket proxy unix wadah ke wadah-localhost (perangkat loopback) ...

Akan lebih baik untuk mendokumentasikan bagaimana melakukan itu. Namun sepertinya fitur docker itu belum tentu membutuhkan dukungan aktif.

Ada beberapa cara untuk mengatasinya, tergantung pada apa yang sebenarnya ingin Anda capai.

Jika Anda ingin terhubung ke layanan yang berjalan di host (layanan apa pun, misalnya beberapa API atau database yang akan berjalan langsung di host), Anda harus mencari tahu alamat IP host.

Salah satu caranya adalah dengan mengandalkan fakta bahwa host Docker dapat dijangkau melalui alamat jembatan Docker, yang kebetulan merupakan gateway default untuk container. Dengan kata lain, penguraian cerdas ip route ls | grep ^default mungkin yang Anda butuhkan dalam kasus itu. Tentu saja, itu bergantung pada detail implementasi (gerbang default kebetulan adalah alamat IP dari host Docker) yang mungkin berubah di masa mendatang.

Cara lain adalah dengan menggunakan Docker API untuk mengambil informasi tersebut. Kemudian, masalahnya menjadi "bagaimana cara saya terhubung ke API Docker dari sebuah wadah?", Dan solusi potensial (digunakan oleh banyak, banyak wadah di luar sana!) adalah dengan mengikat-mount /var/run/docker.sock dari Host ke wadah. Ini memiliki kelemahan besar: API menjadi tersedia secara penuh untuk wadah, yang mungkin melakukan hal-hal buruk dengannya.

Dalam jangka panjang, Docker akan mengekspos API introspeksi yang lebih baik, memungkinkan untuk mengakses informasi itu tanpa memberikan terlalu banyak hak istimewa ke wadah.

TL,DR: jangka pendek, periksa rute default wadah. Jangka panjang, akan ada API introspeksi yang luar biasa.

saya juga punya masalah karena pemula. saya tidak dapat menemukan apa pun di /var/run/docker.sock. dan menggunakan perintah "-v /etc/run/docker.sock:/etc/run/docker.sock" tetapi tidak ada yang terjadi.
saya pikir ini masalah karena beberapa pembaruan baru tentang kemampuan kernel. tolong beri saya catatan singkat tentang masalah ini. dan perintah penuh untuk menyelesaikan ini. Terima kasih

gunakan -v /var/run/docker.sock - bukan /etc (yang biasanya disediakan untuk file conf).

ada pembaruan tentang ini di rilis 1.0.0 yang baru?

Ada nsenter - tapi saya pikir cara yang dianjurkan adalah menjalankan sshd di sini
panggung.

Pada hari Jumat, 13 Juni 2014, Camilo Aguilar [email protected] menulis:

ada berita tentang ini di rilis 1.0.0 yang baru?


Balas email ini secara langsung atau lihat di GitHub
https://github.com/dotcloud/docker/issues/1143#issuecomment -45958769.

Michael D Neale
rumah: www.michaelneale.net
blog: michaelneale.blogspot.com

vrvolle, terima kasih untuk itu. Banyak orang seperti kita mencari sedikit berita gembira seperti ini

netstat -nr | grep '^0\.0\.0\.0' | awk '{print $2}'

Docker memperbarui otomatis /etc/hosts pada setiap wadah dengan IP host, misalnya 172.17.42.1 dan memanggilnya misalnya dockerhost akan menjadi perbaikan yang mudah.
Saya kira untuk saat ini kita terjebak dengan netstat -nr | grep '^0\.0\.0\.0' | awk '{print $2}'

+1 untuk dockerhost di /etc/hosts

+1 untuk dockerhost di /etc/hosts, sepertinya ide yang bagus

Mengedit file dalam gambar tidak boleh dilakukan KECUALI secara khusus memberikan argumen atau tanda untuk melakukannya. Juga, tidak wajib bahwa 100% gambar akan mengikuti LSB, jadi mungkin tidak ada direktori /etc . Nama file yang akan digunakan untuk memuat IP host juga harus ditentukan oleh argumen perintah.

docker --host /etc/hosts

+1 untuk dockerhost di /etc/hosts

+1 untuk entri /ec/hosts

@Sepero buruh pelabuhan sudah mengisi /etc/hosts dengan wadah yang ditautkan, jadi argumen Anda tidak benar-benar berlaku.

@matleh Itu benar, tapi saya pikir cara yang benar tidak mengisi /etc/hosts secara langsung, atau setidaknya meninggalkan kami untuk menentukan lokasi jika kami tidak memilikinya.

Bagaimanapun, entri dockerhost di hosts.

Saya juga ingin memiliki IP Host buruh pelabuhan di /etc/hosts .

+1 pada IP host buruh pelabuhan di /etc/hosts

Mungkin cara yang lebih baik untuk memfasilitasi akses ke layanan jaringan pada host adalah dengan membuatnya mudah untuk mengatur entri iptables yang meneruskan port secara terbalik, yaitu dari wadah ke host. Saya pikir opsi -p atau --publish akan dilengkapi dengan baik oleh opsi -s atau --subscribe yang memiliki efek sebaliknya. Saya kira saya akan memanggil mereka --forward dan --reverse, meskipun. Apa pun sebutannya, bagi saya ini merupakan pendekatan yang jauh lebih konsisten daripada saran lain di sini.

Ini mungkin menyatakan yang jelas, tetapi cara sederhana untuk melakukan ini yang berfungsi saat ini dan mungkin kurang bergantung pada implementasi adalah dengan menentukan alamat ip pada Host sebelum memulai wadah dan mengatur variabel lingkungan dalam wadah dengan tepat. Sepanjang garis ini:

#!/bin/bash
HOSTNAME=$(hostname)
HOST_IP=$(ip route | awk '/docker/ { print $NF }')
docker run -e HOST=$HOSTNAME -e HOST_PORT=tcp://$HOST_IP:8000 mycontainer

Ini pada dasarnya akan sejajar dengan cara kerja --link . Itu masih tergantung pada jembatan yang memiliki nama yang cocok dengan /docker/ dan hanya ada satu jembatan seperti itu, tetapi jembatan diatur ketika daemon buruh pelabuhan dimulai. Akan lebih baik jika docker info memberi kami nama jembatan yang digunakan dan/atau alamat ip host. Pemikiran lain adalah menambahkan opsi --link-host PORT ke docker run yang pada dasarnya akan melakukan hal di atas.

IMO ini adalah pilihan terbaik. Dengan --link-host , wadah tidak perlu tahu apakah layanan yang diaksesnya ada di Host atau di wadah lain.

Saya tidak yakin bagaimana orang lain memanggil wadah mereka tetapi ketika saya menjalankannya dengan --net=host maka saya dapat melihat pengaturan jaringan yang sama dengan Host buruh pelabuhan saya. Tanpa sakelar ini saya mendapatkan tumpukan jaringan mandiri, seperti yang dijelaskan di halaman manual docker-run .

$ docker run -i --net=host fedora ip route ls
default via 10.0.2.2 dev eth0  metric 1
10.0.2.0/24 dev eth0  proto kernel  scope link  src 10.0.2.15
127.0.0.1 dev lo  scope link
172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.42.1
192.168.59.0/24 dev eth1  proto kernel  scope link  src 192.168.59.103

berjalan tanpa sakelar menghasilkan ini:

$ docker run -i fedora ip route ls
default via 172.17.42.1 dev eth0
172.17.0.0/16 dev eth0  proto kernel  scope link  src 172.17.0.4

Apa yang kami cari adalah metode untuk mendapatkan alamat IP 10.0.2.15 (IP eth0 i/f host buruh pelabuhan saya) atau 172.17.42.1 (IP jembatan buruh pelabuhan docker0 i/f saya).

Saya tidak terlalu peduli dengan pendekatan menambahkan beberapa Host ke file container /etc/hosts saya, yang menurut saya agak hackey. Alih-alih membiarkan info ini diekspos secara internal sehingga saya bisa mengambilnya saat dibutuhkan tampaknya merupakan cara yang lebih bijaksana untuk pergi ke sini.

+1 untuk --link-host atau cara intuitif lainnya

+1 untuk entri /etc/hosts
Tampaknya cukup nyaman dan mengikuti konvensi komunikasi saat ini.

Hanya untuk memperjelas komentar saya sebelumnya: apa yang hebat tentang --link <container>:<alias> adalah ia memperlihatkan _service_ melalui _alias_. Demikian pula, mekanisme untuk mengekspos host ke wadah harus menyediakan akses ke layanan tertentu, bukan hanya alamat ip. Wadah akan mengakses layanan itu melalui alias; seharusnya tidak perlu tahu di mana layanan itu sebenarnya. Opsi harus memiliki semantik terbalik -p dan berperilaku seperti --link . Dengan kata lain --link-host <ip address>:<port>:<alias> akan mengatur variabel env dan entri /etc/hosts , dan akan mengatur entri iptables seperlunya, yaitu jika layanan pada host mendengarkan pada alamat ip yang sebaliknya tidak dapat diakses ke wadah.

@altaurog Bagaimana dengan yang seperti ini?

docker run --name someservice -d host-exposing-image --expose 8000

someservice hanya akan menjadi nama apa pun yang Anda dapat --link , dan host-exposing-image akan menjadi gambar khusus yang meneruskan port host pada port yang terbuka. Mungkin ide tersebut dapat diterapkan dengan membagikan /var/run/docker.sock Host dengan gambar.

Mungkin yang seperti ini sudah ada, entahlah.

Sunting:

docker run --name someservice -d --expose 8000 host-exposing-image

Lupakan yang di atas, belum baca semua komentar di sini (masih belum). Inilah yang berfungsi untuk saya di docker-osx (dan maaf karena tidak memposting ke milis):

docker run --rm -ti -e HOST_IP="$(docker-osx ssh -c 'route -n' 2> /dev/null |
  awk '/^0.0/ { print $2 }')" debian:jessie

+1. --link-host adalah ide yang bagus dan juga hanya memiliki entri dockerhost di /etc/hosts

Saya membuat masalah baru sejak masalah ini ditutup (tetapi tidak diselesaikan): #8395

+1 untuk dockerhost atau cara mudah lainnya.

+1 untuk cara yang nyaman

Karena pendekatan dockerhost mendapat beberapa suara di sini, cara termudah yang saya temukan (dari komentar hingga 3 masalah terkait #8395 #10023) untuk memiliki entri host seperti itu adalah dengan menambahkan argumen --add-host=dockerhost:$(ip route | awk '/docker0/ { print $NF }') saat menjalankan gambar, misalnya:

run --add-host=dockerhost:$(ip route | awk '/docker0/ { print $NF }')  ubuntu ping -c2 dockerhost

Meskipun ini menambahkan entri /etc/hosts yang diperlukan, sayangnya dockerhost tidak ada secara default. Saat mendistribusikan gambar, saya punya pilihan untuk

  • menginstruksikan pengguna untuk menambahkan parameter di atas
  • buat beberapa skrip berjalan di wadah yang mengadaptasi file konfigurasi berdasarkan tabel perutean

Saya pribadi tidak mengerti mengapa dockerhost tidak ada secara default, itu akan membuat pembuatan dan distribusi gambar yang mengakses layanan biasanya di Host (XServer, CUPS, Puleaudio) jauh lebih nyaman.

+1 untuk dockerhost. Saya benar-benar akan mengekspos ini baik sebagai env var, entri /etc/hosts dan flag cli. Itu pasti akan digunakan dalam banyak cara.

:+1: untuk dockerhost

di dalam wadah Anda:

cat << EOF > /etc/profile.d/dockerhost.sh
 grep dockerhost /etc/hosts || echo $(ip r ls | grep ^default | cut -d" " -f3) dockerhost >> /etc/hosts
EOF

bekerja untuk saya setiap kali saya masuk (dengan akun root)

+1 untuk dockerhost

+1 untuk dockerhost

+1 untuk dockerhost

+1 untuk dockerhost

+1 untuk dockerhost :yum:

+1 untuk dockerhost

+1 untuk dockerhost :+1:

Akhirnya menulis skrip ini, seseorang mungkin merasa berguna:

#!/bin/bash

SED="$(which sed)"
NETSTAT="$(which netstat)"
GREP="$(which grep)"
AWK="$(which awk)"
CAT="$(which cat)"


$SED '/dockerhost$/d' /etc/hosts > /etc/hosts.tmp
DOCKERHOST="$($NETSTAT -nr | $GREP '^0\.0\.0\.0' | $AWK '{print $2}')"

echo "$DOCKERHOST dockerhost" >> /etc/hosts.tmp

$CAT /etc/hosts.tmp > /etc/hosts

rm -rf /etc/hosts.tmp

+1 dockerhost

karena ada cukup minat dalam topik ini, saya pikir masuk akal daripada mendiskusikan tiket tertutup untuk membuka permintaan fitur baru.

Saya membuka https://github.com/docker/docker/issues/8395 beberapa waktu lalu -- ditutup juga. Masih belum ada solusi yang terdokumentasi

ok, sementara ada solusi, saya pikir alasan utamanya mungkin karena mengakses Host adalah usecase yang sebagian terisolasi.

karena ada fitur tautan buruh pelabuhan, saya beralasan masuk akal untuk dapat memberikan tautan ke Host.

Halo!

FYI ini sekarang didokumentasikan :

Catatan: Terkadang Anda perlu terhubung ke host Docker, yang berarti mendapatkan alamat IP dari host tersebut. Anda dapat menggunakan perintah shell berikut untuk menyederhanakan proses ini:

$ alias hostip="ip route show 0.0.0.0/0 | grep -Eo 'via \S+' | awk '{ print \$2 }'"
$ docker run --add-host=docker:$(hostip) --rm -it debian

Terima kasih, @icecrime.

Bisakah orang buruh pelabuhan mengunci masalah ini sehingga orang berhenti memperbaruinya?

+1 untuk dockerhost

+1 untuk dockerhost - harus menjalankan perintah lokal alias hostip tidak kompatibel dengan misalnya docker-compose, docker-swarm dll.

+1 untuk dockerhost

@icecrime , yang memberikan gateway Host dan bukan ip Host di ubuntu saya. Bukankah seharusnya hanya perintah di bawah ini?

$ ip address show

+1, sesuatu yang dapat digunakan tanpa harus menjalankan perintah akan ideal

Bagaimana ini masih belum terselesaikan? Menjalankan perintah dalam wadah untuk membuat wadah untuk meng-host jaringan berfungsi sama sekali tidak dapat diterima.

+1 untuk apa pun yang sederhana
BTW solusi dengan ip berfungsi di Ubuntu saya, tetapi tidak berfungsi di OS X, bukan?

+1 Ini adalah masalah berusia 2 tahun dan fitur yang berguna. Saya ingin cara mudah untuk terhubung ke api jarak jauh buruh pelabuhan dari dalam wadah.

@ianchildress jika Anda memiliki daemon yang dikonfigurasi untuk menerima koneksi soket, cukup ikat-pasang soket ke dalam wadah Anda, misalnya docker run -d -v /var/run/docker.sock:/var/run/docker.sock myimage

+1 untuk dockerhost
Menemukan masalah ini saat menelusuri solusi untuk menggunakan kasus: xdebug.remote_host=dockerhost

+1 untuk dockerhost

@thaJeztah dan bagaimana cara mendapatkan nama host atau alamat IP dari sana?

@mbonaci Saya menanggapi @ianchildress , yang ingin terhubung ke Docker API di dalam wadah (yang menggunakan koneksi soket adalah pendekatan umum)

Saya bingung. @icecrime di atas mengatakan di atas bahwa ini sekarang didokumentasikan, tetapi tautan yang dia berikan sudah mati. Saya tidak dapat dengan cepat menemukan bagian dokumentasi yang dikutip. Saya perhatikan bahwa contoh apt-cache-ng menggunakan dockerhost, tetapi tidak mendefinisikan apa itu (#11556). Satu-satunya referensi yang dapat saya temukan dengan mudah adalah utas ini. Saya telah mencari semua sumber dan dokumentasi buruh pelabuhan dan sepertinya tidak disebutkan dalam konteks ini .

@pwaller Sejak Maret, kami telah membagi dokumen panjang besar itu menjadi referensi terpisah. Lokasi baru untuk materi ini adalah:

http://docs.docker.com/reference/commandline/run/#adding -entries-to-a-container-hosts-file

+1 untuk dockerhost

@moxiegirl Saya pikir param --add-host memuaskan. Terima kasih

Dan bagaimana cara terhubung ke Host dari wadah buruh pelabuhan? Misalnya, untuk membuat git pull? Tanpa volume menggunakan?

@a93ushakov semuanya dijelaskan di tautan yang disediakan @moxiegirl .
Saat Anda melakukan docker run , tambahkan parameter berikut: --add-host=dockerhost:replace_with_docker_host_ip , yang membuat entri dalam file /etc/hosts penampung.
Yang, tentu saja, berarti Anda dapat merujuk ke Host buruh pelabuhan Anda dari dalam wadah itu menggunakan namanya, dockerhost .

@mbonaci > Yang, tentu saja, berarti Anda dapat merujuk ke Host buruh pelabuhan Anda dari dalam wadah itu menggunakan namanya, dockerhost.

Melalui ssh?

@thaJeztah > jika daemon Anda dikonfigurasi untuk menerima koneksi soket, ...
Bagaimana cara melakukannya?

@a93ushakov SSH: Jika Anda telah menginstal dan menjalankannya di host (dan portnya tidak diblokir), ya.

@a93ushakov @thaJeztah mengacu pada koneksi soket Unix. Saya pikir itu default - lihat apakah Anda memiliki file /var/run/docker.sock di Host Anda.

+1 untuk dockerhost

+1 untuk dockerhost

+1 untuk dockerhost

+1 untuk dockerhost
Akan menyenangkan untuk mendapatkan nama host ini tanpa langkah tambahan.

1 untuk dockerhost

+1 untuk dockerhost

Sepertinya tidak dapat terhubung ke Host buruh pelabuhan dari dalam wadah. Ada ide apa yang saya lakukan salah?

$ hostip=$(ip route show 0.0.0.0/0 | grep -Eo 'via \S+' | awk '{ print $2 }')
$ nc -l -p 1234 &
[1] 17361
$ docker run --add-host=docker:$(hostip) --rm -it hiromasaono/curl curl docker:1234
curl: (7) Failed to connect to docker port 1234: Connection refused

+1 untuk dockerhost

Ketika saya menambahkan IP dari jembatan Docker itu berfungsi.

Pertama dengarkan di port 1234 dengan netcat

$ nc -l -p 1234

Dapatkan IP jembatan

$ ifconfig docker0 | grep 'inet addr'
          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0

Kemudian hubungkan

$ docker run --add-host=docker:172.17.42.1 --rm -it hiromasaono/curl curl 172.17.42.1:1234

Kemudian saya melihat jawabannya

GET / HTTP/1.1
User-Agent: curl/7.35.0
Host: 172.17.42.1:1234
Accept: */*

+1 untuk dockerhost
Astaga, kapan?

+1 untuk dockerhost yang berfungsi di Mac juga, yaitu, menangani VM secara transparan

Bisakah seseorang tolong beri tahu saya bagaimana saya akan memanggil Docker API dari dalam wadah? Saya bukan orang linux. Saya sudah memulai wadah dengan -v /var/run/docker.sock:/var/run/docker.sock .
Setiap orang berbicara bagaimana melakukan mount, tetapi tidak ada yang menyebutkan cara memanggil api di dalam.

Saya mencoba menelepon menggunakan curl tidak berhasil. Saya menggunakan IP host misalnya

curl -XGET http://hostip :2375/images/json

Ini adalah bagaimana saya memulai daemon saya. yaitu buruh pelabuhan -H unix:///var/run/docker.sock -H tcp://0.0.0.0 :2375

Bantuan apa pun akan sangat dihargai.

@jprogn pelacak masalah github tidak dimaksudkan untuk pertanyaan dukungan umum; lebih baik ajukan pertanyaan ini di saluran #docker IRC, grup pengguna buruh pelabuhan di Google, atau forums.docker.com

Pertanyaan ini terkait dengan topik awal, yang belum terjawab sepenuhnya. Silakan lihat judul di atas

Adakah yang bisa tolong balas bagaimana memanggil docker api di dalam dari wadah????????????????

@jprogn silakan ikuti komentar saya di atas; ini adalah pelacak masalah, digunakan untuk melacak bug dan permintaan fitur; bukan forum dukungan untuk menggunakan buruh pelabuhan; gunakan metode lain yang saya sebutkan di atas https://github.com/docker/docker/issues/1143#issuecomment -146924892

+1 untuk dockerhost

Di Host buruh pelabuhan CentOS7 saya, saya tidak bisa mendapatkan rute dari wadah ke Host:

[root@docker-host-fkb slehmann]# ifconfig docker0 | grep 'inet'

inet 172.17.42.1  netmask 255.255.0.0  broadcast 0.0.0.0
inet6 fe80::42:a7ff:fe4d:4cb2  prefixlen 64  scopeid 0x20<link>


[root@docker-host-fkb slehmann]# docker run --add-host=docker:172.17.42.1 --rm -it hiromasaono/curl curl 172.17.42.1:1234

curl: (7) Failed to connect to 172.17.42.1 port 1234: No route to host

Ada ide?

+1, Mungkin harus ada variabel Lingkungan untuk ini.

Saya sendiri ingin sebaliknya; tautan dari mesin Host saya ke wadah buruh pelabuhan dengan nama

+1 untuk variabel lingkungan dockerhost

Sangat sulit untuk menggabungkan entri dns dipesan lebih dahulu yang mengakses host tanpa hard-coding 172.17.42.1. misalnya

extra_hosts:
     - "docker:172.17.42.1"

+1 untuk dockerhost di mana pun (/etc/Host dari ENV)

+1 ini masih dibutuhkan!

+1 saya juga karena menambahkan ip route list dev eth0 | grep -Eo 'via \S+' | awk '{ print \$2 }' ke setiap proyek (karena di dev, semua proyek berada di Host yang sama dan harus dapat saling memanggil) mulai tampak seperti peretasan yang buruk

Bagaimana kita memecahkan masalah ini dalam sebuah cluster, misalnya Docker Swarm, di mana kita tidak tahu mesin mana yang akan ditugaskan untuk wadah ketika kita menjalankannya? IP gateway docker0 bisa berbeda dari satu host ke host lain dalam swarm cluster, jadi kita tidak bisa hanya menjalankan perintah ip route pada satu host dan kemudian menganggap IP sama untuk semua host.

Saya juga ingin kemampuan untuk memetakan port kontainer ke port di jembatan docker0 tanpa harus tahu apa IP jembatan docker0 itu. Sesuatu seperti ini:

eval $(docker-machine env --swarm swarm-master-node)
docker run -d -p "$HOST_GATEWAY_IP:80:80" my-image

$HOST_GATEWAY_IP akan diganti dengan IP yang sama dengan yang Anda dapatkan dari menjalankan perintah ip route pada Host tempat wadah akhirnya disebarkan di cluster.

Ini perlu didukung untuk perintah lain yang melibatkan IP, misalnya opsi --dns pada docker run .

Saya menemukan perintah ini lebih mudah:

ip ro | grep docker | sed 's|.* \(\([0-9]\+\(.[0-9]\+\)\{3\}\)\)\s*|\1|'

+1 untuk dockerhost di /etc/hosts

+1 dockerhost

+1 untuk memiliki dockerhost di /etc/hosts

+1000 untuk dockerhost

+1 dockerhost

+1

+1, atau lebih.

Saya menjalankan server web dalam sebuah wadah dan perlu menghubungkannya ke mysql saya yang berjalan di Host.
Ip host berubah dengan dhcp jadi sesuatu yang dinamis adalah suatu keharusan.

@wederbrand pendekatan alternatif (dan mungkin berkinerja lebih baik) dapat menghubungkan ke soket mysql, misalnya;

docker run -v /var/lib/mysql/mysql.sock:/mysql.sock mywebapp

Itu akan membuat soket MySQL tersedia sebagai /mysql.sock di dalam wadah

@thaJeztah Itu bisa menjadi pilihan. Namun, gambar buruh pelabuhan yang saya gunakan juga digunakan untuk lingkungan lain di mana server mysql berada di server jauh dan gambar tersebut memiliki konfigurasi untuk Host:port untuk database.

Saya ingin wadah saya berperilaku sedekat mungkin dengan yang ada dalam produksi, jadi tidak perlu mengutak-atik properti koneksi kecuali untuk mengatur Host dan port.

+1

+1

+1

+1

@peterbollen @radek1st @BradRuderman @aldarund @wederbrand @pataiadam @jllado @geniousphp @coreylenertz @dgtlmoon @xlight (semua +1 di Desember 2015 saja)
Masalah _this_ ditutup serta #8395
Saya tidak berpikir menambahkan +1 ke masalah lama akan membantu. Buat yang baru (saya lakukan dengan #8395) atau coba beberapa rute lain untuk mengatasi ini.

Terima kasih!

+1

+1 dockerhost

+1 untuk dockerhost

+1 untuk dockerhost

+1 untuk dockerhost, ayo...

+1 untuk dockerhost

menggunakan docker-compose dan scaling n-ary container dalam swarm tidak secara alami menyediakan sarana untuk melakukan pencarian alamat IP node dengan cepat di semua mesin.

Ini, sebagaimana dinyatakan di atas dan dimodifikasi ke gateway, bukan merupakan opsi:

extra_hosts:
     - "docker:172.18.0.1"

👍 untuk dockerhost juga...

+1 untuk dockerhost

+1

+1

+1

+1 dockerhost

+1 dockerhost

+1 dockerhost

+1 untuk dockerhost

+1 untuk dockerhost

+1 untuk dockerhost.
Sejak masalah ini ditutup membuka tiket baru.

+1

+1

Untuk mendapatkan Host dalam pengaturan docker-machine , Anda dapat menggunakan perintah ini:

docker-machine ssh "${DOCKER_MACHINE_NAME}" 'echo ${SSH_CONNECTION%% *}'

Ini melaporkan mesin yang Anda hubungkan melalui ssh , jadi itu harus bekerja dengan cukup baik baik untuk mesin lokal dan untuk yang jarak jauh, selama tidak ada NAT di sepanjang jalan. Akan lebih baik jika docker-machine inspect akan melaporkan nilai ini di suatu tempat juga, jika itu layak secara teknis.

+1

+1 untuk dockerhost . Kedengarannya seperti fitur yang berharga dengan praktis tidak ada upaya untuk diterapkan.

Untuk saat ini jika Anda perlu mengakses dockerhost dalam wadah yang dibuat dari gambar yang Anda kontrol, Anda dapat menambahkan Gist ini ke skrip entrypoint.sh untuk gambar Anda: https://Gist.github.com/dimitrovs/493678fd86c7cdf0c88312d9ddb4906b

Atau saya rasa Anda dapat menambahkannya ke /etc/rc.local jika gambar Anda tidak menggunakan skrip shell sebagai titik masuknya. Apa yang dilakukan Intisari ini adalah memeriksa dockerhost di /etc/hosts dan menambahkannya jika tidak ada. Itu harus terjadi setiap kali wadah dimulai.

Keluarkan ip gateway dari /proc/net/route:

export ipaddr=$(printf "%d." $(
  echo $(awk '$2 == "00000000" {print $3}' /proc/net/route) | sed 's/../0x& /g' | tr ' ' '\n' | tac
  ) | sed 's/\.$/\n/')

@dimitrovs Bisakah Anda menunjukkan contoh konfigurasi? Saya bermain-main dengan itu dan tidak bisa mendapatkan hasil yang benar.

Apa hasil yang Anda dapatkan @amcdnl ? Anda dapat meletakkan Gist yang saya tautkan di file entrypoint.sh sehingga berjalan setiap kali container dimulai atau di /etc/rc.local di dalam container. Anda harus melakukan ini saat membuat image, tetapi skrip itu sendiri akan dijalankan saat container dimulai.

+1 untuk host buruh pelabuhan

@dimitrovs Saya akhirnya menulis skrip yang akan menghasilkan penulisan saat runtime.

StartDocker.sh

#!/bin/bash
built_docker_file="docker-compose.dev.built.yml"

rm -rf docker-compose.dev.built.yml
localhost_ip="$(ifconfig en0 inet | grep "inet " | awk -F'[: ]+' '{ print $2 }')"
sed -e "s/\${localhost}/$localhost_ip/" docker-compose.dev.template.yml > $built_docker_file

docker-compose -f $built_docker_file build
docker-compose -f $built_docker_file up

docker-compose.dev.template.yml

version: '2'

services:
  nginx:
    container_name: sw_nginx
    image: nginx:latest
    ports:
      - 80:80
    links:
     - search
    volumes:
      - ./Web/wwwroot:/var/www/public
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    extra_hosts:
      - "dockerhost:${localhost}"

@amcdnl Solusi yang bagus. Perhatikan bahwa docker-compose mendukung substitusi variabel (lingkungan).

misalnya (bash):

$ export localhost=$(...)
$ docker-compose (...)

@sebastiannm saran saya harus independen dari Host karena dijalankan di dalam gambar buruh pelabuhan, tetapi jika Anda menjalankannya di Mac di VirtualBox maka IP yang akan Anda dapatkan adalah IP VM VirtualBox, bukan IP Mac Anda. Saya pikir ini adalah persyaratan yang sedang kita bicarakan. Jika Anda ingin mengetahui IP Mac dari dalam instance buruh pelabuhan maka diperlukan pendekatan yang berbeda.

+1 untuk dockerhost.

Tetapi untuk saat ini, saya melakukan peretasan yang serupa dengan yang diposting di atas, yang memungkinkan Anda mendapatkan alamat IP Host secara dinamis dengan skrip sederhana yang berfungsi baik di Linux dan OSX : http://stackoverflow.com/questions/24319662/from-inside -of-a-docker-container-how-do-i-connect-to-the-localhost-of-the-mach#38753971

+1 untuk dockerhost.

+1 untuk dockerhost

+1+1 dockerhost

+1 untuk dockerhost

+1 untuk dockerhost

+1 untuk dockerhost

Saya tidak dapat terhubung ke server netcat Host dasar dari dalam wadah buruh pelabuhan ketika --net=bridge (default) melalui berbagai teknik yang dibahas dalam masalah ini.

@frankscholten Saya tidak dapat mereproduksi tes netcat Anda yang berhasil

Saya telah membuat masalah stackoverflow yang menjelaskan masalah sebenarnya: http://stackoverflow.com/questions/38936738/communicate-to-docker-Host-from-docker-container
dan ingin memposting di sini jika itu membantu seseorang di masa depan

Sementara semua ini berbicara tentang berkomunikasi dari wadah ke Host menggunakan docker0 ip dalam mode jembatan, saya ingin tahu apakah wadah juga dapat berbicara dengan ip publik Host (katakanlah ip eth0 aslinya). Hargai balasan Anda. Saya belum berhasil dalam hal ini.

@sburnwal Saya tidak mengerti mengapa Anda tidak dapat berkomunikasi dengan ip eth0 Host. Kontainer akan mengirim permintaan ke gateway defaultnya (docker0) dan host harus membalas tanpa meneruskan lebih lanjut karena ia tahu bahwa ia memiliki ip. Apakah ping Anda ke ip eth0 dari waktu wadah habis atau Anda tidak mendapatkan rute ke Host atau apa yang terjadi? Apakah wadah dapat terhubung ke internet?

Sayangnya ini tidak bekerja untuk saya. Meskipun saya dapat melakukan ping IP wadah dari Host, saya tidak dapat melakukan ping ip Host (LAN/eth0 Host) dari wadah. Saya menggunakan buruh pelabuhan 1.9.1. Saya terjebak di sini karena saya membutuhkan wadah saya untuk berkomunikasi ke server web hanya mendengarkan di eth0 ip dari Host.

Saya menyesuaikan docker0 menggunakan opsi:
/bin/docker daemon --bip=169.254.0.254/24 --fixed-cidr=169.254.0.0/24

Jadi saya memiliki antarmuka ini di Host saya (tidak mencantumkan antarmuka veth* di sini):

[root@pxgrid-106 irf]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtg 1500
        inet 169.254.0.254  netmask 255.255.255.0  broadcast 0.0.0.0
        inet6 fe80::42:84ff:fe87:d510  prefixlen 64  scopeid 0x20<link>
        ether 02:42:84:87:d5:10  txqueuelen 0  (Ethernet)
        RX packets 512  bytes 150727 (147.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 653  bytes 281686 (275.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtg 1500
        inet 172.23.166.176  netmask 255.255.255.128  broadcast 172.23.166.255
        inet6 fe80::20c:29ff:fecc:7d0f  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:cc:7d:0f  txqueuelen 1000  (Ethernet)
        RX packets 58462  bytes 12056152 (11.4 MiB)
        RX errors 0  dropped 69  overruns 0  frame 0
        TX packets 30877  bytes 18335042 (17.4 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Wadah saya memiliki ip 169.254.0.2 dan saya dapat melakukan ping ip wadah ini dari Host. Tentu saja, saya dapat melakukan ping dari container gatewaynya 169.254.0.254 (docker0 ip) tetapi saya tidak dapat melakukan ping ke Host eth0 ip 172.23.166.176.

Saya mencoba dengan menghentikan firewall sepenuhnya dan saya menambahkan aturan eksplisit ini juga ke firewall ke rantai INPUT tetapi belum berhasil. Siapa yang dapat membantu saya dalam hal ini? Atau apakah ini bug?

ACCEPT     all  --  172.23.166.176       169.254.0.0/24      
ACCEPT     all  --  169.254.0.0/24       172.23.166.176   

Selain itu, izinkan saya juga memberikan output 'ip route' di Host saya:

[root@pxgrid-106 bin]# ip route
default via 172.23.166.129 dev eth0 
169.254.0.0/24 dev docker0  proto kernel  scope link  src 169.254.0.254 
172.23.166.128/25 dev eth0  proto kernel  scope link  src 172.23.166.176 

@tn-osimis terima kasih atas sarannya, saya memperbarui dan berfungsi dengan baik, ini kode saya untuk orang lain:

docker-compose.yml

version: '2'

services:
  nginx:
    image: nginx:latest
    ports:
      - 80:80
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    extra_hosts:
      - "dockerhost:${localhost_ip}"

StartDocker.sh

#!/bin/bash
dev_docker_file="docker-compose.yml"

export localhost_ip="$(ifconfig en0 inet | grep "inet " | awk -F'[: ]+' '{ print $2 }')"

docker-compose -f $dev_docker_file build
docker-compose -f $dev_docker_file up

+1 untuk dockerhost

+1 untuk dockerhost

+1 untuk dockerhost

Solusi @magicalbob memang ajaib

+1 untuk dockerhost

+1, omong-omong, mengapa ini ditutup? Masalah/permintaan fitur belum diselesaikan

Ada pembaruan tentang ini? Apa cara yang benar?

+1

Adakah yang punya pembaruan tentang cara terhubung ke Host (IP publik Host seperti eth0 ip dan bukan ip antarmuka docker0) dari wadah?

@sburnwal docker run --add-host=publicip:$(hostname --ip) ubuntu ping -c2 publicip

Lihat jawaban @retog

+1 untuk dockerhost

+1 untuk dockerhost

+1 untuk dockerhost

meninggalkannya di sini karena mungkin itu akan membantu setidaknya beberapa dari Anda:

Saya diberitahu bahwa antarmuka jaringan default tidak selalu harus docker0 juga, mendapatkan IP docker0 tidak akan bekerja pada sistem selain linux, ini adalah masalah bagi kami karena beberapa pengembang kami yang menggunakan mac

jadi alih-alih menggunakan skrip ajaib untuk mendapatkan IP Host dari koneksi jaringan, saya disarankan untuk memaksa pengaturan jaringan penampung alih-alih mencoba menemukannya secara terprogram

Saya mengonfigurasi pengaturan jaringan buruh pelabuhan di file penulisan buruh pelabuhan saya seperti ini:

``` jaringan:
bawaan:
pengemudi: jembatan
ipam:
konfigurasi:
- subnet: 10.10.0.0/24
gerbang: 10.10.0.1

if you are only running one container, you could first create a network (`docker network create`) and connect to it with `docker run --network=<network-name>|<network-id> <image name>`

BUT if you don't want to do this (i.e. force the docker network) and really want to get the default gateway IP, you could get it more cleanly than using `docker0` network interface, for example by parsing the `docker network inspect <network name>`, which outputs the gateway IP (among other things):

...
"IPAM": {
"Pengemudi": "default",
"Konfigurasi": [
{
"Subnet": "172.17.0.1/16",
"Gerbang": "172.17.0.1"
}
]
}
...

you could also use the `--format` option of `docker network inspect` to get only the fields that are of interest, like this:

$ docker network inspect bridge --format='{{range .IPAM.Config}}{{.Gateway}}{{end}}'
$172.17.0.1
```

CATATAN: jika ada lebih banyak entri .IPAM.Config Anda akan mendapatkan semuanya di output, jadi logika tambahan untuk memilih yang tepat akan diperlukan

+1 untuk dockerhost

Catatan, ini akan sangat berguna ketika Anda hanya ingin menggunakan xdebug di dalam wadah php-fpm untuk terhubung ke IDE Anda untuk debugging karena Anda jelas tidak dapat menjalankan IDE dalam wadah.

+1 untuk dockerhost

Ringkasan saya tentang peretasan di atas:

di docker-compose.yml :

nginx:
  restart: always
  build: ./nginx/
  ports:
    - "80:80"
  extra_hosts:
    # requires `export DOCKERHOST="$(ifconfig en0 inet | grep "inet " | awk -F'[: ]+' '{ print $2 }')"` in ~/.bash_profile
    - "dockerhost:$DOCKERHOST"

di ~/.bash_profile :

# see https://github.com/docker/docker/issues/1143
export DOCKERHOST="$(ifconfig en0 inet | grep "inet " | awk -F'[: ]+' '{ print $2 }')"

di nginx-conf :

location / {
        proxy_pass http://dockerhost:3000;
        proxy_set_header host $host;
        proxy_set_header x-real-ip $remote_addr;
        proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
}

Saya cenderung menggunakan gambar buruh pelabuhan svendowideit/ambassador untuk mengatasi masalah ini.

Misalnya, jika saya ingin mengikat ke simpul elasticsearch yang berjalan di Host Docker:

docker run --restart always -d --name elasticsearch --expose 9200 -e ELASTICSEARCH_PORT_9200_TCP=tcp://<host>:9200 svendowideit/ambassador

Sekarang, wadah buruh pelabuhan lain hanya dapat menemukan elasticsearch dengan menggunakan --link elasticsearch, sambil tetap agnostik, apakah elasticsearch berjalan di wadah buruh pelabuhan, di Host, atau di mana pun.

+1 untuk dockerhost

... untuk saat ini Anda bisa melakukan ini:

$ docker build --build-arg HTTP_PROXY=172.16.42.1 .

... atau dalam kasus saya yang serupa dengan docker-compose - saya melakukan ini:

client:
        build: ./client
        extra_hosts:
            - "foobar:${HTTP_PROXY}"

atur Host Anda pada waktu pembuatan:

export HTTP_PROXY=172.16.42.1 && docker-compose build

@rattrayalex di mac, saya menemukan ini mencetak IP secara langsung: ipconfig getifaddr en0

+1 untuk dockerhost

Bisakah Anda yang baru saja melakukan +1 untuk dockerhost, cukup tambahkan jempol (reaksi) ke komentar yang ada dengan sifat yang sama? +1 komentar cukup perpanjang/isi utas masalah ini jika tidak perlu. Sudah banyak, tidak perlu ditambah lagi, tapi kita selalu bisa mengacungkan jempol! 👍

Saya pikir para komentator sedang menulis +1 ekstensif untuk menyoroti ini adalah kasus penggunaan umum, dengan solusi yang diketahui, dan harus membutuhkan waktu yang dapat diperkirakan dalam jam untuk dikodekan oleh tim buruh pelabuhan
Tetap buka sejak 3 tahun 👍

Jadi, menurut saya ini lebih merupakan "apakah kita masih di sini"? Alih-alih hanya emoji

Solusi @magicalbob di https://github.com/docker/docker/issues/1143#issuecomment -233152700 bekerja dengan sempurna di setiap penyiapan wadah dan jembatan yang saya coba sejauh ini!

solusi dari https://github.com/docker/docker/issues/1143#issuecomment -7052272 tidak berfungsi saat menggunakan docker compose extra_hosts

+1 untuk dockerhost

Masih belum ada dockerhost?

+1 untuk dockerhost

+1 untuk dockerhost

itu tidak akan terjadi, itu ditutup 3 tahun yang lalu, dan mereka tidak berencana untuk mengimplementasikan ini. alasan yang sama docker.sock adalah pijakan untuk keamanan, dockerhost juga. memiliki nama domain yang dapat dipecahkan dari dalam aplikasi Anda adalah masalah keamanan utama IMHO. jika Anda harus, gunakan saja solusi, secara selektif hanya di mana mengakses layanan host dengan IP tidak akan menjadi permukaan serangan yang meningkat.

Jangan tidak setuju bahwa itu tidak terjadi, tetapi saya tidak melihat bagaimana dockerhost adalah risiko keamanan kecuali Anda mematikan banyak pekerjaan mudah juga ....⁣

Dikirim dari BlueMail

Pada 16 Des 2016, 17:58, pukul 17:58, Paulo [email protected] menulis:

itu tidak akan terjadi, itu ditutup 3 tahun yang lalu, dan mereka tidak berencana untuk pernah
menerapkan ini. alasan yang sama docker.sock adalah footgun untuk keamanan,
dockerhost juga. memiliki nama domain yang dapat dipecahkan dari dalam . Anda
aplikasi adalah masalah keamanan utama IMHO. jika harus, gunakan saja
solusi, secara selektif hanya jika mengakses layanan host dengan IP tidak akan
menjadi permukaan serangan yang meningkat.

--
Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung atau lihat di GitHub:
https://github.com/docker/docker/issues/1143#issuecomment -267655915

+1 untuk dockerhost

+1 untuk dockerhost

Ip mesin host adalah 192.168.0.208 .

File docker-compose adalah sebagai berikut:

version: '2'
 services:
   zl-tigervnc:
     image: zl/dl-tigervnc:1.5
     container_name: zl_dl_tigervnc
     restart: always
     tty: true
     ports:
       - "8001:8888"
       - "6001:6006"
       - "8901:5900"
       - "10001:22"
     devices:
       - /dev/nvidia0
     volumes:
       - ~/data:/root/data
       - /var/run/docker.sock:/var/run/docker.sock
     extra_hosts:
       - "dockerhost:192.168.0.208"

Sebuah wadah diluncurkan oleh skrip ini. Wadah ingin mengakses port 8080 pada mesin host (misalnya 192.168.0.208:8080 ). Tapi itu tidak berhasil.

Namun, saya menggunakan penerusan port untuk memetakan 8080 pada mesin host ke 8080 pada router. IP router adalah 63.25.20.83 . Wadah dapat mengakses 8080 mesin host dengan penerusan port (mis 63.25.20.83:8080 ).

Saya telah mencoba banyak solusi dari halaman ini, tetapi masih tidak berhasil.

Catatan, ini akan sangat berguna ketika Anda hanya ingin menggunakan xdebug di dalam wadah php-fpm untuk
sambungkan ke IDE Anda untuk debugging karena Anda jelas tidak dapat menjalankan IDE dalam sebuah wadah.

Tepatnya @colinmollenhour ! Kecuali ada masalah tambahan. Anda dapat melakukan ping ke host, tetapi Anda tidak dapat benar-benar terhubung ke port host (mis. debugger jarak jauh yang berjalan pada 9000).

Banyak barang lama dan/atau tidak tepat di internet. Banyak orang tampaknya berpikir menyiapkan IP alias dan melampirkannya ke antarmuka lo seharusnya berhasil, tetapi ternyata tidak.

(pengujian dengan netcat di Host dan telnet di wadah buruh pelabuhan, jadi saya dipreteli dengan baik).

@bitwombat periksa firewall host Anda untuk aturan port 9000

@gregmartyn Itulah tepatnya. Terima kasih! Akan menjadi hal pertama yang saya periksa dalam pengaturan yang lebih sederhana! Semua lapisan penipuan membuat saya memeriksa hal-hal yang lebih aneh.

Juli, 2013 hingga 2017. Hampir 4 tahun, bagaimana ini belum menjadi fitur? Ini jelas bukan kasus penggunaan yang terisolasi.

Ini bukan fitur karena tidak selaras dengan strategi Docker untuk menjadi solusi manajemen penerapan multi-host.

Saya masih percaya ada banyak kasus penggunaan yang valid dan menambahkan fitur tidak akan membahayakan strategi Docker. Bagaimanapun, ini adalah solusi yang agak sederhana untuk menyelesaikan alamat Host buruh pelabuhan dari dalam wadah yang menurut saya harus berfungsi secara universal:

ip route | awk '/^default via /{print $3}'

+1 untuk dockerhost

Sangat dibutuhkan. +1 untuk dockerhost

+1 untuk dockerhost

+1 untuk dockerhost

+1 untuk dockerhost

+1 untuk solusi apa pun yang bukan solusi peretasan. Tidak ada yang berhasil di sini.

Sepakat. +1 untuk solusi. Membutuhkannya untuk melakukan pekerjaan pengembangan dan pengujian pada proyek yang menggunakan buruh pelabuhan.

+1 untuk dockerhost

+1 untuk dockerhost

+1 untuk dockerhost

wow.. 4 tahun dan akan kuat. +1 untuk dockerhost?

+1 dockerhost!!

+1 dockerhost!!!

Ini mungkin dibisukan. Kita mungkin harus membuat masalah baru dengan referensi yang satu ini.

:+1: untuk dockerhost... Saat ini saya sedang menyiapkannya dengan env:

export DOCKERHOST=$(ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1)

Itu membuat hal-hal rumit.

Bahkan sesuatu yang sederhana seperti menggunakan docker-compose dalam wadah dengan ssh-tunneled private registry tidak berfungsi karena Docker sangat ingin tidak menginginkan dockerhost.

CATATAN: masalah ini sudah ditutup, jadi tidak ada gunanya menambahkan lebih banyak komentar :-)

Jika Anda membutuhkan fitur ini, Anda dapat dengan mudah menambahkan alias DNS dockerhost menggunakan --add-host dan opsi yang setara.

Mengapa ini tidak tersedia secara default? Karena itu hanya berfungsi dalam kasus-kasus sepele. Yaitu:

  • bagaimana dengan container yang _tidak_ memiliki akses jaringan?
  • bagaimana dengan container yang memiliki _multiple_ network?
  • bagaimana dengan container yang berjalan di cluster Swarm?

Jika Anda memiliki kasus penggunaan yang baik (yaitu "Saya ingin melakukan XXX, dan untuk melakukannya, saya ingin memiliki dockerhost ...") serta jawaban yang solid untuk pertanyaan di atas (dan kasus sudut lain yang mungkin muncul), jangan ragu untuk membuka masalah baru dengan referensi yang satu ini!

Terima kasih.

Masalahnya adalah ip host Anda bisa dinamis dan tergantung pada jaringan tempat Anda berada. Jika Anda mengembangkan koneksi ke Host untuk debugging adalah suatu keharusan. Alasan semua orang menginginkan dockerhost bukan karena opsi yang tidak ada nyaman atau berguna sama sekali.
Docker memiliki banyak opsi yang tidak relevan untuk semua, apa yang membuat ini berbeda? Mengapa tidak memiliki opsi di docker untuk mengaktifkan dockerhost jika diperlukan, saya kira itu akan membuat 99% senang.

@jpetazzo

bagaimana dengan container yang tidak memiliki akses jaringan?

Maka dockerhost tidak akan berfungsi.

bagaimana dengan container yang memiliki banyak jaringan?

Maka dockerhost tidak akan berfungsi.

bagaimana dengan container yang berjalan di cluster Swarm?

Siapa peduli?

Jika Anda mengembangkan beberapa perangkat lunak yang melibatkan komponen di luar ekosistem buruh pelabuhan (seperti beberapa perangkat lunak yang berjalan di dalam VM Windows di Host), maka sulit untuk menghubungkannya ke buruh pelabuhan. Kenapa harus sakit?

Semua kasus yang Anda daftarkan bukanlah yang dibicarakan oleh 226 komentar di utas ini, mereka berbicara tentang kasus dasar.

Sunting: Maaf, saya telah menghapus sebagian dari komentar saya. Aku tidak bermaksud mengoceh. Ini hanya sedikit membuat frustrasi, ini adalah fitur yang sangat dibutuhkan untuk beberapa pengguna buruh pelabuhan dan jika Anda mengembangkan perangkat lunak yang membutuhkannya, itu bahkan lebih membuat frustrasi karena harus meretasnya tanpa alasan.

@jpetazzo terkadang kasus "sepele" adalah 80% dari kasus penggunaan. Dockerhost akan sangat berharga bagi orang yang menggunakan Docker dalam lingkungan pengembangan atau pementasan , atau benar-benar lingkungan apa pun yang tidak bergantung pada jaringan swarm/multi-host. Berikut adalah beberapa contoh di mana saya ingin menggunakan Dockerhost:

1) Docker-Compose di Windows dengan registri pribadi. Kami memiliki registri Docker pribadi yang dihosting sendiri. Pengembang dapat mengakses registri melalui terowongan SSH dengan penerusan porta (yaitu di localhost:5000). Tetapi ketika Docker-Compose berjalan di wadah Docker-nya sendiri, tidak ada cara untuk menentukan host registri pribadi. Jika kita memiliki dockerhost , kita dapat menggunakan d ockerhost:5000 dalam file docker-compose.yml yang memberikannya akses ke port yang diteruskan pada host.

2) Aplikasi apa pun yang perlu berkomunikasi dengan layanan yang berjalan di host. Misalnya, klien SSH berbasis Web yang berjalan di wadah buruh pelabuhan dapat digunakan untuk membuat koneksi SSH dengan host jika ada dockerhost . Ada banyak contoh layanan yang berjalan di host wadah Docker yang dapat digunakan jika ada dockerhost .

3) Penerusan port terbalik. Kami dapat menjalankan server SSH atau OpenVPN kami dalam wadah Docker dan itu dapat memberi klien akses ke layanan yang berjalan di Host jika ada dockerhost . Anda dapat mengatur penerusan port dari wadah ke dockerhost.

Saya akan senang mendengar pembenaran teknis mengapa pengembang Moby menolak untuk mendengar komunitas ketika datang ke dockerhost. Sejauh ini saya hanya mendengar alasan politik/bisnis.

Menemukan utas ini ketika mencoba menemukan cara untuk melampirkan antarmuka jaringan macvlan ke layanan swarm... Swarm sepertinya solusi setengah jadi, ketidakmampuan untuk mengekspos layanan langsung ke dunia luar adalah frustrasi terus-menerus bagi saya. Rasanya seperti Docker kehilangan daya tarik dengan kasus penggunaan dunia nyata, maju cepat 4 tahun sejak utas ini dimulai dan masih belum ada implementasi asli untuk memiliki wadah yang mengelola sendiri.

Saya relatif baru di Docker. Semua yang saya baca dari dokumen resmi masuk akal. _Docker sebenarnya adalah alat yang cukup mudah untuk diambil._

Faktanya, satu-satunya hal yang telah saya habiskan beberapa jam untuk mencoba mencari tahu adalah _bagaimana menghubungkan ke host dari dalam wadah._ Segala sesuatu yang lain mudah ditentukan. Saya masih tidak tahu bagaimana melakukannya. Banyak "peretasan" di forum ini dan di SO tidak berfungsi. Kami perlu mengakses host untuk menggunakan aplikasi lawas yang tidak disetel ke "Dockerized" selama berbulan-bulan.

Tidak akan pernah terjadi aku takut Josh. Pengembang telah menjelaskannya.
Yang membuat buruh pelabuhan lebih buruk daripada tidak berguna untuk kelas aplikasi yang besar,
sayangnya buruh pelabuhan (atau "moby") tidak dapat memberikan tanggapan tentang itu
pengembang atau aplikasi tersebut.

Pada 19 Jun 2017 01:08, "Josh Wedekind" [email protected] menulis:

Saya relatif baru di Docker. Semua yang saya baca dari dokumen resmi
masuk akal. Docker sebenarnya adalah alat yang cukup mudah untuk diambil.

Faktanya, satu-satunya hal yang saya habiskan beberapa jam untuk mencari tahu
adalah bagaimana menghubungkan ke host dari dalam wadah. Yang lainnya
mudah ditentukan. Saya masih tidak tahu bagaimana melakukannya. banyak dari
"peretasan" di forum ini dan di SO tidak berfungsi. Kita perlu mengakses
Host untuk menggunakan aplikasi lawas yang tidak disetel ke "Dockerized"
selama berbulan-bulan.


Anda menerima ini karena Anda berkomentar.
Balas email ini secara langsung, lihat di GitHub
https://github.com/moby/moby/issues/1143#issuecomment-309311997 , atau bisukan
benang
https://github.com/notifications/unsubscribe-auth/AA-shyjglsJXawxHHWGhQH0d1LlZeJqxks5sFbwXgaJpZM4Ayw00
.

Ini benar-benar membuat frustrasi bahwa Anda dapat menangani setiap situasi dengan file pembuatan buruh pelabuhan deklaratif sederhana, tetapi Anda harus menggunakan seribu trik untuk terhubung ke aplikasi lama dari wadah Anda di lingkungan pengembangan Anda.
@thaJeztah Itu tidak membuat kesan pertama yang baik dari buruh pelabuhan sama sekali.

FYI, kami akhirnya meninggalkan Docker dalam produksi karena alasan ini. Saya tahu para pengembang Docker menentangnya (dan saya mengerti bahwa itu bukan fitur sepele seperti yang diklaim beberapa orang) tetapi saya hanya ingin ikut campur: Anda kehilangan pelanggan dunia nyata karena penolakan keras kepala untuk mempertimbangkan masalah ini. Sebagai "ahli" Docker yang enggan di perusahaan saya, saya sekarang harus memperingatkan orang-orang yang bertanya kepada saya tentang hal itu dengan mengatakan "Docker hebat... kecuali jika Anda perlu berkomunikasi dengan apa pun yang berjalan di localhost."

Jadi, sekali lagi, saya yakin masalahnya tidak terdengar, tetapi jika Anda melihat kembali utas ini, pengembang Docker, ini menyebabkan rasa sakit yang nyata dan menyebabkan pelanggan Docker nyata berhenti menggunakan Docker. Saya sarankan untuk mempertimbangkan kembali penolakan keras kepala Anda untuk mengatasi masalah ini; hanya karena tidak sesuai dengan visi Anda tentang bagaimana Docker "seharusnya" digunakan tidak berarti itu adalah fitur yang tidak berguna atau tidak perlu.

Mereka tidak hanya bisa kehilangan klien yang sudah ada. Kami dapat memigrasikan semuanya ke buruh pelabuhan jika memenuhi janji pengembangannya. Ini adalah anti-promosi nyata untuk digunakan buruh pelabuhan dalam skala besar untuk semua proses.

Cara saya membuatnya bekerja untuk saat ini adalah dengan membuat jaringan. Beginilah tampilan file komposisi buruh pelabuhan saya:

version: '2'
services:
  <container_name>:
    image: <image_name>
    networks:
      - dockernet

networks:
  dockernet:
    driver: bridge
    ipam:
      config:
        - subnet: 192.168.0.0/24
          gateway: 192.168.0.1

Setelah melakukan ini, Anda dapat mengakses host dengan 192.168.0.1.
Mungkin berguna bagi sebagian dari Anda karena fitur ini tidak akan hadir dalam waktu dekat.

@deltabweb Akankah permintaan yang masuk ke aplikasi di mesin host muncul sebagai lalu lintas "localhost", atau apakah saya harus memodifikasi aplikasi untuk merespons 192.168.0.1?

Terima kasih atas bantuan Anda.

@halfnibble
Saya belum melihat dokumentasi networks secara detail tetapi pemahaman saya adalah bahwa jaringan baru di mesin Host Anda dibuat di mana:

  • IP dari "dockerhost" adalah 192.168.0.1
  • IP wadah pertama adalah 192.168.0.2
  • IP wadah kedua adalah 192.168.0.3
  • dan seterusnya ...

Mulai dari sana, semuanya akan berfungsi seolah-olah Anda memiliki mesin fisik yang terhubung bersama di jaringan lokal:

  • mesin dapat terhubung satu sama lain
  • dan Anda bahkan harus dapat menggunakan ping 192.168.0.2 dari Host - ini hanya akan berfungsi jika wadah Anda merespons ping.

Jadi untuk menjawab pertanyaan Anda, saya pikir aplikasi Anda di mesin host perlu merespons 192.168.0.X (bergantung pada wadah yang mencoba terhubung).

@deltabweb bagaimana cloud saya mengakses port Host server? >>> Koneksi ditolak

@nooperpudd Hanya untuk memastikan: Anda mencoba mengakses aplikasi yang berjalan di Host dari wadah kan?
Saya pertama-tama akan memeriksa apakah aplikasi mengizinkan koneksi masuk dari luar (0.0.0.0 dan bukan hanya localhost). Dan mungkin juga memastikan bahwa Anda tidak memiliki firewall yang memblokir koneksi?

@nooperpudd jika Anda menggunakan Docker for mac Anda tidak dapat menggunakan mode host , solusi @deltabweb juga tidak berfungsi untuk saya (server saya semua mendengarkan 0.0.0.0 dan firewall mesin Host saya dimatikan tetapi saya mendapatkan Connection refused setiap saat). Setelah sekitar 2 hari mencoba dan kesalahan, satu-satunya cara yang saya temukan untuk memperbaiki masalah ini adalah skrip di bawah ini:

#!/bin/bash
export DOCKERHOST=$(ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1)

# You should use DOCKERHOST env variable in your `docker-compose.yml` 
# and put it everywhere you want to connect to `localhost` of the host machine
docker-compose $@

Satu-satunya masalah dengan pendekatan ini adalah jika IP Anda berubah setelah menjalankan container Anda, Anda harus menjalankannya lagi dan mereka tidak dapat menemukan IP baru Anda.

Pengamatan yang luar biasa bagi saya adalah bahwa perintah, yang dijalankan saat memulai wadah buruh pelabuhan, tidak dapat terhubung ke wadah melalui alamat IP hostnya. Namun ketika perintah itu tidak melakukan upaya koneksi seperti itu dan selesai dieksekusi dengan sukses , wadah kemudian dapat menjangkau dirinya sendiri melalui alamat IP hostnya.

Saya melakukan pengamatan ini ketika mencoba mengekspos titik akhir dari instance cluster database NoSql ke klien di luar swarm cluster. Bagaimanapun, titik akhir ini perlu dikonfigurasi dengan alamat IP pribadi atau publik dari VM agar klien eksternal dapat menjangkaunya. Namun Cassandra dirancang sedemikian rupa sehingga ketika mulai mencoba untuk segera terhubung dengan alamat IP host (ditetapkan sebagai variabel lingkungan CASSANDRA_BROADCAST_ADDRESS -- lihat di bawah) dan karena itu gagal. Di sisi lain, node replika Mongodb pertama-tama semuanya dimulai dalam keadaan bersih, dan kemudian perintah inisiasi terpisah dijalankan sedemikian rupa sehingga node primer dan sekunder dapat membentuk sebuah replika.

Di bawah ini Anda melihat akun terperinci dari pengamatan ini untuk cassandra (Saya membuat ini dengan buruh pelabuhan tetapi masalah yang sama muncul di docker run -d (dalam mode NAT, jadi tanpa opsi --net=Host)

1) Di satu sisi, wadah yang dibuat oleh

docker service create  --name cassandra-service
--publish mode=host,target=7000,published=7000,protocol=tcp 
-e CASSANDRA_SEEDS=host IP address  -e CASSANDRA_BROADCAST_ADDRESS=host IP address

gagal dengan pesan bahwa itu tidak dapat terhubung ke alamat pendengar: <host IP address>:7000

2) Di sisi lain, wadah yang dilampirkan ke jaringan overlay, dibuat oleh

docker service create  --network cassandra-net --name cassandra-service
-e CASSANDRA_SEEDS=cassandra-service  -e CASSANDRA_BROADCAST_ADDRESS=cassandra-service

dimulai dengan benar dan pada saat yang sama saya dapat terhubung ke alamat ip Host pada port apa pun yang terbuka di Dockerfile dari gambar cassandra:2.0 :

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                                         NAMES
07603a75a379        cassandra:2.0       "/docker-entrypoin..."   About a minute ago   Up About a minute   7000-7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp   cassandra-service-1.1.m243u97zku15w08m6puytdngs

$ docker exec -it 1e61ec16f8d0 bash
root<strong i="5">@1e61ec16f8d0</strong>:/# cqlsh 172.17.13.151
Connected to Test Cluster at 172.17.13.151:9160.
[cqlsh 4.1.1 | Cassandra 2.0.17 | CQL spec 3.1.1 | Thrift protocol 19.39.0]

Demikian pula, hal yang sama dapat diamati selama pembuatan simpul cassandra kedua

1) Jika saya membuat wadah cassandra kedua di simpul lain dengan

docker service create  --network cassandra-net --name cassandra-service-2
-e CASSANDRA_SEEDS=172.17.13.151  -e CASSANDRA_BROADCAST_ADDRESS=cassandra-service-2

wadah gagal dengan pengecualian runtime yang tidak dapat bergosip dengan benih:

java.lang.RuntimeException: Unable to gossip with any seeds
        at org.apache.cassandra.gms.Gossiper.doShadowRound(Gossiper.java:1322)
        at org.apache.cassandra.service.StorageService.checkForEndpointCollision(StorageService.java:457)

2) Di sisi lain, jika saya membuat wadah cassandra melalui docker run -d , saya dapat mencapai simpul benih melalui alamat IP Hostnya:

$ docker run -d cassandra:2.0
d87a79cc3de8cd7e4cf40284d1eca91ceb660581cc71082fe64a6b84a09fbd77
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                         NAMES
d87a79cc3de8        cassandra:2.0       "/docker-entrypoin..."   3 seconds ago       Up 2 seconds        7000-7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp   trusting_ardinghelli
$ docker exec -it d87a79cc3de8 bash
root<strong i="17">@d87a79cc3de8</strong>:/# cqlsh 172.17.13.151
Connected to Test Cluster at 172.17.13.151:9160.
[cqlsh 4.1.1 | Cassandra 2.0.17 | CQL spec 3.1.1 | Thrift protocol 19.39.0]
Use HELP for help.
cqlsh>

Khusus untuk Cassandra, Anda memecahkan masalah ini dengan mematikan bootstrap otomatis node cassandra. Anda melakukannya dengan mengatur auto_bootstrap ke false di /etc/cassandra/cassandra.yaml menggunakan perintah entrypoint di Compose V3:

version: '3'
services:
  cassandra-1:
    image: cassandra:2.0
    entrypoint:
    - "sh"
    - "-c"
    - "echo auto_bootstrap: false >> /etc/cassandra/cassandra.yaml; /docker-entrypoint.sh cassandra -f"
    environment:
      CASSANDRA_BROADCAST_ADDRESS: 172.17.13.151
    volumes:
    - volume1:/var/lib/cassandra
    ports:
    - "7000:7000"
    - "7001"
    - "7199"
    - "9042:9042"
    - "9160:9160"

dan kemudian secara manual memulai node cassandra dengan menjalankan docker exec -it <container id> nodetool rebuild .

Saya bisa menggunakan fitur ini dalam pengembangan, yah ...

@jpetazzo Kami mengembangkan solusi PHP dalam tim di berbagai platform. Debugger (xdebug) kami perlu terhubung kembali ke IDE di host. Di Windows dan Linux ini berfungsi 'di luar kotak' tetapi di mac pengembang kami harus mengubah file xdebug.ini untuk secara khusus menyebutkan IP lokal mereka. Tapi Dockerfile berada di bawah kendali sumber... konflik konstan antrian dan bersumpah sebagai pengembang bentrok mengedit file ini. Ya ada solusi yang dapat ditulis, tetapi mengapa docker untuk windows dan mac memiliki docker.for.win.localhost dan docker.for.mac.localhost? Ini sebagian membantu tetapi kami masih membutuhkan skrip untuk mendeteksi platform mana yang kami gunakan untuk mengatur ini dengan benar. Tampaknya jauh lebih rumit dari yang seharusnya. Harap pertimbangkan kembali fitur ini. Docker bisa menjadi kurva pembelajaran yang curam tetapi masalah seperti ini membuat pengguna Anda mencari dengan tidak percaya di google selama berjam-jam.

Memeriksa halaman https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds membantu, menggunakan docker.for.mac.localhost berhasil untuk kami :)

Baik atau buruk, docker-compose sejauh ini masih merupakan cara termudah yang saya ketahui untuk menjalankan Selenium Hub dan node grid Firefox/Chrome tanpa kepala untuk menguji server web yang berjalan pada mesin dev lokal atau di CI (peluncuran server web dalam wadah buruh pelabuhan terlalu lambat untuk menjadi nyaman untuk pengembangan). Itu sama sekali bukan tujuan Docker, tetapi Docker adalah alat terbaik untuk pekerjaan itu, dan itu adalah kesalahan Docker sendiri Kecuali satu-satunya masalah adalah dengan mudah mengetahui ip host dengan cara yang berfungsi pada OS apa pun.

@rskuipers dapatkah Anda menjelaskan apa yang sebenarnya Anda lakukan dengan docker.for.mac.localhost ? Saya mencoba membuat permintaan dari dalam wadah saya untuk diselesaikan ke mesin Host. Wadah saya berjalan di traefik yang berarti saya dapat mengaksesnya melalui domain.docker.localhost, tetapi jika saya mencoba mengakses URL yang dimulai dengan itu dari dalam wadah saya, itu tidak terselesaikan.

Saat ini yang saya lakukan, adalah saya menambahkan ini ke docker-compose.yml saya, yang menambahkan baris ke /etc/hosts sehingga domain diselesaikan dengan baik:

extra_hosts: - "domain.docker.localhost:172.18.0.1"

IP adalah IP Host dari dalam wadah saya, yang bisa saya dapatkan dengan menggunakan ip route | awk '/^default via /{print $3}' . Tetapi saya tidak ingin membuat hardcode itu jika memungkinkan ...

@jzavrl Yang saya lakukan hanyalah menggunakan docker.for.mac.localhost agar permintaan HTTP saya melalui proxy yang berjalan di Host. Saya tidak menggunakan lapisan lain selain dari docker-compose .

Itulah tepatnya yang membuat saya tertarik. Perubahan seperti apa yang harus Anda lakukan secara khusus?

@jzavrl Tidak ada :P itu hanya berhasil.

Saya tidak mengerti, lalu apa yang Anda lakukan dengan docker.for.mac.localhost ?

@jzavrl Saya menggunakan itu alih-alih IP untuk terhubung. Jadi buruh pelabuhan.for.mac. localhost:8888

Ahhhhhhh, sekarang itu mulai masuk akal sekarang. Akan mencoba ini kemudian. Semangat @rskuipers.

cukup gunakan ip "en0" di komputer Anda.

Misalnya

ssh [email protected]

'192.168.1.100' mungkin dari layanan DHCP router Anda.

@acuthbert , terima kasih atas sarannya.
docker.for.win.localhost bekerja untuk saya di Docker untuk Windows. Masih ada harapan untuk Docker dan Windows. 😣.

ada sedikit alasan teknis mengapa ini tidak dapat dilakukan dan memuaskan 90% orang di utas ini, kasus sudut dan situasi di mana itu tidak benar-benar berfungsi, orang-orang yang berkembang dalam situasi itu dapat puas dengan set sederhana dari "kasus penggunaan" yang menjelaskan skenario apa yang kemungkinan tidak berfungsi.

Ini sebagian besar hanya sampah politik dan bukan alasan teknis yang sebenarnya di sini. Saya berharap salah satu mesin kontainer lain mengambil dan saya dapat menukar kubernetes untuk menggunakannya sebagai gantinya. Maka saya tidak perlu berurusan dengan sampah ini lagi.

@NdubisiOnuora , apa jenis aplikasi Anda? aplikasi web?

Saya memiliki 2 aplikasi konsol (tcp-server di Host dan tcp-client dalam wadah).
Karena mereka menggunakan tcp, saya membutuhkan IP persis ( docker.for.win.localhost tidak cocok, karena itu domain).

Misalnya, ip:port mana yang harus saya setel di tcp-client, Jika saya menyetel ip:port 127.0.0.1:9595 di tcp-server?

Hanya menyelesaikan domain ke alamat IP?

@orf ,
Saya ingin menggunakan kode ini di C#:
IPAddress hostAddr = Dns.Resolve("docker.for.win.localhost").AddressList[0];
Tapi sebelum itu saya coba ping ke docker.for.win.localhost , tetapi tidak melihatnya, error: Ping request could not find host docker.for.win.localhost. Please check the name and try again.
File Docker saya:
FROM microsoft/windowsservercore
ADD . /
ENTRYPOINT powershell ping docker.for.win.localhost

Jika ada yang melewatkannya, saya yakin solusinya pada 18.03 adalah host.docker.internal meskipun untuk beberapa alasan ini hanya berfungsi pada Docker untuk Windows!? Mengapa tidak orang lain?

EDIT: Tidak melihat bahwa komentar diciutkan oleh Github... ️

Bekerja untuk saya:
docker run --rm -it --add-host "docker.for.localhost:$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+')" alpine:latest ping docker.for.localhost

@lukasmrtvy Itu berfungsi untuk shell, tapi bagaimana dengan docker-compose.yml ?

Saya telah membuat wadah untuk menyelesaikan masalah ini dengan cara umum yang bekerja di semua platform https://github.com/qoomon/docker-Host

Apakah halaman ini membantu?
0 / 5 - 0 peringkat