Bisakah Anda menguraikan bagaimana Anda ingin menggunakan informasi ini? Anda mengatakan "host docker" - apakah Anda menjalankan Docker di lebih dari satu host? Setelah wadah Anda mengetahui alamat IP dari host dan portmap, apa yang akan dilakukannya?
Andy
Cara paling sederhana untuk mengirimkan alamat IP host buruh pelabuhan ke wadah buruh pelabuhan, saya pikir Anda harus membuat panggilan di dalam wadah menggunakan 'buruh pelabuhan kontainer exec'. Misalkan Anda ingin melakukan ping host dari dalam wadah busybox, gunakan misalnya: $ IP = '8.8.8.8' && docker container busybox ping $ IP 'Cara untuk mengetahui IP host, gunakan yang Anda suka lebih banyak.
SauloAlessandre
Jawaban:
314
/sbin/ip route|awk '/default/ { print $3 }'
Seperti @MichaelNeale perhatikan, tidak ada gunanya menggunakan metode ini dalam Dockerfile(kecuali ketika kita membutuhkan IP ini selama waktu pembangunan saja), karena IP ini akan di-hardcode selama waktu pembuatan.
Ketika Anda menggunakan jembatan buruh pelabuhan (default) untuk kontainer, ini akan menampilkan IP jembatan seperti 172.17.42.1 daripada IP host seperti 192.168.1.x (Saya berasumsi host Anda menggunakan NAT di rumah). Menggunakan @Magno Torres mungkin jawaban yang diinginkan orang dalam situasi seperti itu jika Anda menginginkan alamat 192.168.1.x.
Programster
2
bahwa RUN tidak akan berfungsi seperti yang Anda harapkan - itu hanya akan menghitung IP saat membangun - dan selamanya akan statis setelah itu, dan tidak berguna. Ini akan menjadi IP host build.
Michael Neale
7
@Programster, saya dapat berasumsi orang menginginkan koneksi antara host docker dan container, itulah yang dapat diberikan oleh bridge IP Anda (tentu saja dalam instalasi "home" stndard). Mengapa ada orang yang membutuhkan IP host "nyata" jika bisa bahkan di luar jembatan buruh pelabuhan dan dapat diakses? Ini adalah solusi untuk semua orang yang baru saja memasang buruh pelabuhan dan ingin bermain dengannya dalam waktu singkat.
spinus
1
@MichaelNeale, seperti sebelumnya, saya akan berasumsi bahwa kebanyakan orang yang memulai dengan buruh pelabuhan memerlukan koneksi antara host dan container mereka, itu saja. Jika seseorang melakukan penyebaran yang "tepat", mungkin dia tidak menggunakan docker bridge, dia menggunakan jaringan khusus dan daripada mungkin dia mengetahui semua kebiasaan jaringan atau mereka memiliki pengaturan DNS (atau penemuan apa pun).
spinus
1
@spinus - tetapi ini hanya akan valid jika berjalan pada host tempat ia dibangun - dalam hal ini - Anda hanya dapat mengkodekannya - atau mencarinya - Saya pikir itu bukan jawaban yang membantu dan akan banyak menyesatkan orang - sarankan Anda menghapusnya. (Bit RUN)
Michael Neale
182
Pada versi 18.03, Anda dapat menggunakan host.docker.internalsebagai IP host.
Bekerja di Docker untuk Mac , Docker untuk Windows , dan mungkin platform lain juga.
Ini adalah pembaruan dari Mac-spesifik docker.for.mac.localhost, tersedia sejak versi 17.06, dan docker.for.mac.host.internal, tersedia sejak versi 17.12, yang mungkin juga masih bekerja pada platform itu.
Catatan, seperti dalam dokumentasi Mac dan Windows , ini hanya untuk tujuan pengembangan.
Misalnya, saya menetapkan variabel lingkungan di host saya:
MONGO_SERVER=host.docker.internal
Dalam docker-compose.ymlfile saya , saya punya ini:
@allanberry sayangnya orang-orang Docker memilih untuk tidak memberi kami cara platform-independen untuk melakukan ini karena mereka lebih suka untuk tidak merangkul kasus penggunaan yang tidak diinginkan (seperti mengakses layanan apa pun pada mesin lokal dari wadah buruh pelabuhan)
Andy
21
Saya diperkenalkan ke Docker seperti Bangun sekali, jalankan di mana-mana. Tapi ini benar-benar salah karena Anda selalu harus mengkonfigurasi sistem host juga. Jadi docker.for.mac..tidak ada gunanya karena dalam kebanyakan kasus Anda tidak memiliki lingkungan Linux atau Mac-satunya di perusahaan Anda. Ini campuran, Anda memiliki pengembang menggunakan Linux dan Mac dan Windows. Domain ini tidak masuk akal karena di 99% itu adalah lingkungan OS Host campuran. Saya tidak mengembangkan wadah di bawah macOS dan menyebarkannya ke server macOS. Saya menyebarkannya ke Linux. Inilah yang dilakukan semua orang. Jadi, apa gunanya docker.for.mac..?
TheFox
1
@allanberry docker.for.mac.host.internaltidak masalah apakah Anda menggunakan Docker dengan atau tanpa docker-compose. Saya ingin menggunakan host tetap dalam file konfigurasi. IDK, misalnya,, docker.host.internalyang selalu menunjuk ke alamat IP host. Terlepas dari sistem host mana yang saya gunakan. Ini adalah inti dari menggunakan Docker sama sekali: Saya ingin mandiri. Saya mengerti bahwa ini lebih rumit pada macOS karena Anda memiliki lapisan lain antara sistem host dan wadah. Tapi bagaimanapun, menurut saya docker.for.mac.host.internaltidak ada gunanya jika Anda hanya dapat menggunakannya untuk macOS.
ini berfungsi dengan baik, saya punya buruh pelabuhan untuk windows dan menjalankan jenkins di salah satu wadah. Saya ingin menjalankan perintah buruh pelabuhan dalam jenkins tetapi buruh pelabuhan tidak dapat terhubung saat menambahkan langkah cloud, saya menggunakan tcp ini: //host.docker.internal: 2375 dan mengaktifkan 'expose daemon on localhost: 2375' dan berfungsi. menghemat banyak waktu. Terima kasih!
Vikash
84
Pembaruan: Pada Docker untuk Mac , pada versi 18.03, Anda dapat menggunakan host.docker.internal sebagai IP host. Lihat jawaban allanberry . Untuk versi Docker untuk Mac sebelumnya, jawaban berikut mungkin masih berguna:
Di Docker untuk Mac, docker0jembatan tidak ada, jadi jawaban lain di sini mungkin tidak berfungsi. Semua lalu lintas keluar, dialihkan melalui host induk Anda, jadi selama Anda mencoba menyambungkan ke IP yang dikenali sebagai dirinya sendiri (dan wadah buruh pelabuhan tidak menganggapnya sendiri) Anda harus dapat terhubung. Misalnya jika Anda menjalankan ini dari mesin induk jalankan:
ipconfig getifaddr en0
Ini akan menunjukkan IP Mac Anda pada jaringan saat ini dan buruh pelabuhan Anda harus dapat terhubung ke alamat ini juga. Ini tentu saja menyebalkan jika alamat IP ini pernah berubah, tetapi Anda dapat menambahkan IP loopback khusus ke Mac Anda yang tidak dianggap wadah dengan melakukan sesuatu seperti ini di mesin induk:
sudo ifconfig lo0 alias 192.168.46.49
Anda kemudian dapat menguji koneksi dari dalam wadah buruh pelabuhan dengan telnet. Dalam kasus saya, saya ingin terhubung ke server xdebug jarak jauh:
telnet 192.168.46.49 9000
Sekarang ketika lalu lintas masuk ke Mac Anda yang ditujukan untuk 192.168.46.49 (dan semua lalu lintas yang meninggalkan kontainer Anda melewati Mac Anda) Mac Anda akan menganggap bahwa IP itu sendiri. Ketika Anda selesai menggunakan IP ini, Anda dapat menghapus alias loopback seperti ini:
sudo ifconfig lo0 -alias 192.168.46.49
Satu hal yang perlu diperhatikan adalah wadah buruh pelabuhan tidak akan mengirimkan lalu lintas ke host induk jika menganggap tujuan lalu lintas itu sendiri. Jadi periksa antarmuka loopback di dalam wadah jika Anda memiliki masalah:
sudo ip addr show lo
Dalam kasus saya, ini menunjukkan inet 127.0.0.1/8yang berarti saya tidak dapat menggunakan IP apa pun dalam 127.*kisaran. Itu sebabnya saya menggunakan 192.168.*contoh di atas. Pastikan IP yang Anda gunakan tidak bertentangan dengan sesuatu di jaringan Anda sendiri.
Ini adalah metode yang sangat nyaman bagi mereka yang menggunakan AWS. Saya menggunakan ini untuk mengonfigurasi klien Konsul agen dan alamat mengikat. Ini ideal saat Anda berada dalam situasi di mana Anda tidak dapat menggunakan jaringan host (seperti menempatkan kontainer di Elastic Beanstalk dan ECS).
Richard Clayton
Ini adalah penyelamat, terima kasih. Saya mengalami kesulitan mencari tahu bagaimana menangani komunikasi antara kontainer di kluster ECS saya.
Brennan
Pada basimage Phusion (berdasarkan ubuntu), saya harus mengubah sedikit perintah Anda:ifconfig eth0 | grep -oP 'inet \K\S+'
Meuoi
25
Satu-satunya cara menyampaikan informasi host sebagai lingkungan saat Anda membuat wadah
Lebih khusus lagi, alamat IP jembatan dapat diteruskan dengan menggunakan opsi baris perintah seperti: -e "DOCKER_HOST=$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+')"(menggunakan jawaban yang diterima dari unix.stackexchange.com/questions/87468/… )
ncoghlan
7
Saya pikir itu tidak berfungsi di Docker untuk Mac / Windows. (IP jembatan)
zx1986
22
The --add-hostbisa menjadi solusi yang bersih lebih (tapi tanpa bagian pelabuhan, hanya tuan rumah dapat ditangani dengan solusi ini). Jadi, dalam docker runperintah Anda , lakukan sesuatu seperti:
Saya mengatakan "dibuat untuk ini" ketika orang lain menginginkan entri di / etc / hosts; dalam pertanyaan ini tidak sepenuhnya benar. OP juga meminta "host dan portmaps" dan Anda hanya membahas host.
Bryan
Baik. Saya agak bingung karena solusi yang diterima hanya mencakup bagian host juga. Dan saya pikir solusi Anda lebih unggul daripada spinus.
Augunrik
ini tidak berfungsi jika Anda ingin menggunakan dind - docker-in-docker. Docker dalam akan memiliki ip berbeda
berisik
12
Praktik terbaik standar untuk sebagian besar aplikasi yang ingin melakukan ini secara otomatis adalah: Anda tidak . Sebaliknya Anda meminta orang yang menjalankan wadah menyuntikkan nama host / alamat ip eksternal sebagai konfigurasi, misalnya sebagai variabel lingkungan atau file konfigurasi. Mengizinkan pengguna menyuntikkan ini memberi Anda desain yang paling portabel.
Mengapa ini begitu sulit? Karena wadah akan, dengan desain, mengisolasi aplikasi dari lingkungan host. Jaringan dinamai hanya untuk wadah itu secara default, dan rincian host dilindungi dari proses yang berjalan di dalam wadah yang mungkin tidak sepenuhnya dipercaya.
Ada beberapa opsi tergantung pada situasi spesifik Anda:
Jika kontainer Anda berjalan dengan jaringan host, maka Anda dapat melihat tabel routing pada host secara langsung untuk melihat rute default keluar. Dari pertanyaan ini, yang berikut berfungsi untuk saya, misalnya:
ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'
Contoh yang menunjukkan ini dengan jaringan host dalam wadah terlihat seperti:
docker run --rm --net host busybox /bin/sh -c \
"ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'"
Untuk beberapa versi Docker Desktop, mereka menyuntikkan entri DNS ke VM tertanam:
Jika Anda ingin alamat eksternal / internet, Anda dapat meminta layanan jarak jauh seperti:
curl ifconfig.co
Masing-masing memiliki keterbatasan dan hanya berfungsi dalam skenario tertentu. Opsi yang paling portabel adalah masih menjalankan wadah Anda dengan alamat IP yang disuntikkan sebagai konfigurasi, misalnya inilah opsi yang menjalankan ipperintah sebelumnya pada host dan menyuntikkannya sebagai variabel lingkungan:
export HOST_IP=$(ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p')
docker run --rm -e HOST_IP busybox printenv HOST_IP
Tuan rumah memiliki alamat IP yang berubah (atau tidak ada jika Anda tidak memiliki akses jaringan). Dari 18,03 dan seterusnya, rekomendasi kami adalah untuk terhubung ke nama DNS khusus host.docker.internal, yang memutuskan ke alamat IP internal yang digunakan oleh tuan rumah. Ini untuk tujuan pengembangan dan tidak akan berfungsi di lingkungan produksi di luar Docker untuk Windows.
Saya mencoba solusi Anda dan tampaknya perintah nslookup tidak dapat ditemukan
Sergey
@Sergey Apakah gambar Anda berdasarkan Alpine Linux? Jika tidak maka periksa setara untuk spesifik Anda linux distribution.
Kamil Witkowski
Tidak, saya menggunakan perintah Anda - docker run -it nginx / bin / ash
Sergey
Ok - jika Anda berada di windows, maka saya beralih ke linux containersdan saya tidak menggunakan windows containers. Anda dapat melakukannya dengan mengklik kanan docker icondan memilih Switch to Linux containers. Saya pikir itu bisa menjadi penting ketika Anda mengunduh gambar. Jika Anda telah windows containermemeriksa apakah menghapus nginxgambar lama dan mengunduhnya lagi akan memberi Anda wadah lain. Jika masih tidak bekerja untuk Anda - daripada Anda dapat mencoba menginstal nslookupdi ash.
Kamil Witkowski
Jika Anda tidak dapat melakukan nslookup, lakukan saja ping. Ini akan menampilkan IP yang diselesaikan. Bagi saya jawaban ini berfungsi, dan saya hanya menggunakan nama host ini ( host.docker.internal) dari dalam wadah
Dmitry Minkovsky
7
TLDR untuk Mac dan Windows
docker run -it --rm alpine nslookup host.docker.internal
... mencetak alamat IP host ...
nslookup: can't resolve '(null)': Name does not resolve
Name: host.docker.internal
Address 1: 192.168.65.2
Detail
Di Mac dan Windows , Anda dapat menggunakan nama DNS khusus host.docker.internal.
Tuan rumah memiliki alamat IP yang berubah (atau tidak ada jika Anda tidak memiliki akses jaringan). Dari 18,03 dan seterusnya, rekomendasi kami adalah untuk terhubung ke nama DNS khusus host.docker.internal, yang memutuskan ke alamat IP internal yang digunakan oleh tuan rumah. Ini untuk tujuan pengembangan dan tidak akan berfungsi di lingkungan produksi di luar Docker Desktop untuk Mac.
Tolong jangan tambahkan jawaban yang sama untuk beberapa pertanyaan . Jawab yang terbaik dan tandai sisanya sebagai duplikat, setelah Anda mendapatkan reputasi yang cukup. Jika ini bukan duplikat, sesuaikan pos dengan pertanyaan dan beri tanda penghapusan.
Bhargav Rao
6
Docker untuk Mac
Saya ingin terhubung dari sebuah wadah ke layanan di host
Tuan rumah memiliki alamat IP yang berubah (atau tidak ada jika Anda tidak memiliki akses jaringan). Dari 18,03 dan seterusnya, rekomendasi kami adalah untuk terhubung ke nama DNS khusus host.docker.internal, yang memutuskan ke alamat IP internal yang digunakan oleh tuan rumah.
Jika Anda mengaktifkan API jarak jauh buruh pelabuhan (via-Htcp://0.0.0.0:4243 misalnya) dan mengetahui nama host atau alamat IP mesin host, ini dapat dilakukan dengan banyak bash.
Baris kedua mengambil ID kontainer dari lokal Anda /proc/self/cgroup file .
Baris ketiga meringkuk ke mesin host (dengan asumsi Anda menggunakan 4243 sebagai port docker) kemudian menggunakan node untuk mengurai JSON yang dikembalikan untuk DESIRED_PORT.
Berikut adalah opsi lain bagi mereka yang menjalankan Docker di AWS. Opsi ini menghindari penggunaan apk untuk menambahkan paket ikal dan menghemat ruang 7mb yang berharga. Gunakan wget bawaan (bagian dari biner BusyBox monolitik):
AFAIK, dalam hal Docker untuk Linux (distribusi standar), alamat ip host akan selalu172.17.0.1 .
Cara termudah untuk mendapatkannya adalah melalui ifconfig(interface docker0) dari tuan rumah:
ifconfig
Dari dalam buruh pelabuhan, perintah berikut dari buruh pelabuhan: ip -4 route show default | cut -d" " -f3
Anda dapat menjalankannya dengan cepat di buruh pelabuhan dengan baris perintah berikut:
# 1. Run an ubuntu docker
# 2. Updates dependencies (quietly)
# 3. Install ip package (quietly)
# 4. Shows (nicely) the ip of the host
# 5. Removes the docker (thanks to `--rm` arg)
docker run -it --rm ubuntu:19.10 bash -c "apt-get update && apt-get install iproute2 -y && ip -4 route show default | cut -d' ' -f3"
Blok kode pertama akan mengambil IP kontainer dan bukan IP host
Ari
mandoc of hostname -Imemperingatkan untuk tidak "membuat asumsi tentang urutan output."
can't_mutably_borrow
1
Ini adalah implementasi minimalis di Node.js untuk siapa yang menjalankan host pada instance AWS EC2 , menggunakan instance Metadata EC2 yang disebutkan sebelumnya
const cp = require('child_process');
const ec2 = function (callback) {
const URL = 'http://169.254.169.254/latest/meta-data/local-ipv4';
// we make it silent and timeout to 1 sec
const args = [URL, '-s', '--max-time', '1'];
const opts = {};
cp.execFile('curl', args, opts, (error, stdout) => {
if (error) return callback(new Error('ec2 ip error'));
else return callback(null, stdout);
})
.on('error', (error) => callback(new Error('ec2 ip error')));
}//ec2
Jika Anda menjalankan wadah Windows pada kluster Fabric Layanan, alamat IP host tersedia melalui variabel lingkungan Fabric_NodeIPOrFQDN. Variabel lingkungan Fabric Layanan
Inilah cara saya melakukannya. Dalam hal ini, ia menambahkan entri host ke / etc / hosts di dalam gambar buruh pelabuhan yang menunjuk taurus-host ke IP mesin lokal saya::
Kemudian, dari dalam wadah Docker, skrip dapat menggunakan nama host taurus-host untuk keluar ke mesin lokal saya yang menampung kontainer buruh pelabuhan.
Ini mengambil IP dari mesin virtual yang menjalankan kontainer buruh pelabuhan, bukan IP host yang menjalankan kontainer.
Spencer Williams
2
Ini hanya berlaku untuk buruh pelabuhan yang berjalan di mesin buruh pelabuhan. Buruh pelabuhan baru untuk mac tidak berjalan di mesin buruh pelabuhan.
Jawaban:
Seperti @MichaelNeale perhatikan, tidak ada gunanya menggunakan metode ini dalam
Dockerfile
(kecuali ketika kita membutuhkan IP ini selama waktu pembangunan saja), karena IP ini akan di-hardcode selama waktu pembuatan.sumber
Pada versi 18.03, Anda dapat menggunakan
host.docker.internal
sebagai IP host.Bekerja di Docker untuk Mac , Docker untuk Windows , dan mungkin platform lain juga.
Ini adalah pembaruan dari Mac-spesifik
docker.for.mac.localhost
, tersedia sejak versi 17.06, dandocker.for.mac.host.internal
, tersedia sejak versi 17.12, yang mungkin juga masih bekerja pada platform itu.Catatan, seperti dalam dokumentasi Mac dan Windows , ini hanya untuk tujuan pengembangan.
Misalnya, saya menetapkan variabel lingkungan di host saya:
Dalam
docker-compose.yml
file saya , saya punya ini:sumber
docker.for.mac..
tidak ada gunanya karena dalam kebanyakan kasus Anda tidak memiliki lingkungan Linux atau Mac-satunya di perusahaan Anda. Ini campuran, Anda memiliki pengembang menggunakan Linux dan Mac dan Windows. Domain ini tidak masuk akal karena di 99% itu adalah lingkungan OS Host campuran. Saya tidak mengembangkan wadah di bawah macOS dan menyebarkannya ke server macOS. Saya menyebarkannya ke Linux. Inilah yang dilakukan semua orang. Jadi, apa gunanyadocker.for.mac..
?docker.for.mac.host.internal
tidak masalah apakah Anda menggunakan Docker dengan atau tanpadocker-compose
. Saya ingin menggunakan host tetap dalam file konfigurasi. IDK, misalnya,,docker.host.internal
yang selalu menunjuk ke alamat IP host. Terlepas dari sistem host mana yang saya gunakan. Ini adalah inti dari menggunakan Docker sama sekali: Saya ingin mandiri. Saya mengerti bahwa ini lebih rumit pada macOS karena Anda memiliki lapisan lain antara sistem host dan wadah. Tapi bagaimanapun, menurut sayadocker.for.mac.host.internal
tidak ada gunanya jika Anda hanya dapat menggunakannya untuk macOS.host.docker.internal
tidak berfungsi pada Docker untuk Windows juga, setidaknya pada saat menulis komentar ini.Pembaruan: Pada Docker untuk Mac , pada versi 18.03, Anda dapat menggunakan host.docker.internal sebagai IP host. Lihat jawaban allanberry . Untuk versi Docker untuk Mac sebelumnya, jawaban berikut mungkin masih berguna:
Di Docker untuk Mac,
docker0
jembatan tidak ada, jadi jawaban lain di sini mungkin tidak berfungsi. Semua lalu lintas keluar, dialihkan melalui host induk Anda, jadi selama Anda mencoba menyambungkan ke IP yang dikenali sebagai dirinya sendiri (dan wadah buruh pelabuhan tidak menganggapnya sendiri) Anda harus dapat terhubung. Misalnya jika Anda menjalankan ini dari mesin induk jalankan:Ini akan menunjukkan IP Mac Anda pada jaringan saat ini dan buruh pelabuhan Anda harus dapat terhubung ke alamat ini juga. Ini tentu saja menyebalkan jika alamat IP ini pernah berubah, tetapi Anda dapat menambahkan IP loopback khusus ke Mac Anda yang tidak dianggap wadah dengan melakukan sesuatu seperti ini di mesin induk:
Anda kemudian dapat menguji koneksi dari dalam wadah buruh pelabuhan dengan telnet. Dalam kasus saya, saya ingin terhubung ke server xdebug jarak jauh:
Sekarang ketika lalu lintas masuk ke Mac Anda yang ditujukan untuk 192.168.46.49 (dan semua lalu lintas yang meninggalkan kontainer Anda melewati Mac Anda) Mac Anda akan menganggap bahwa IP itu sendiri. Ketika Anda selesai menggunakan IP ini, Anda dapat menghapus alias loopback seperti ini:
Satu hal yang perlu diperhatikan adalah wadah buruh pelabuhan tidak akan mengirimkan lalu lintas ke host induk jika menganggap tujuan lalu lintas itu sendiri. Jadi periksa antarmuka loopback di dalam wadah jika Anda memiliki masalah:
Dalam kasus saya, ini menunjukkan
inet 127.0.0.1/8
yang berarti saya tidak dapat menggunakan IP apa pun dalam127.*
kisaran. Itu sebabnya saya menggunakan192.168.*
contoh di atas. Pastikan IP yang Anda gunakan tidak bertentangan dengan sesuatu di jaringan Anda sendiri.sumber
Bagi mereka yang menjalankan Docker di AWS, instance meta-data untuk host masih tersedia dari dalam wadah.
Sebagai contoh:
sumber
ifconfig eth0 | grep -oP 'inet \K\S+'
Satu-satunya cara menyampaikan informasi host sebagai lingkungan saat Anda membuat wadah
sumber
-e "DOCKER_HOST=$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+')"
(menggunakan jawaban yang diterima dari unix.stackexchange.com/questions/87468/… )The
--add-host
bisa menjadi solusi yang bersih lebih (tapi tanpa bagian pelabuhan, hanya tuan rumah dapat ditangani dengan solusi ini). Jadi, dalamdocker run
perintah Anda , lakukan sesuatu seperti:(Dari https://stackoverflow.com/a/26864854/127400 )
sumber
Praktik terbaik standar untuk sebagian besar aplikasi yang ingin melakukan ini secara otomatis adalah: Anda tidak . Sebaliknya Anda meminta orang yang menjalankan wadah menyuntikkan nama host / alamat ip eksternal sebagai konfigurasi, misalnya sebagai variabel lingkungan atau file konfigurasi. Mengizinkan pengguna menyuntikkan ini memberi Anda desain yang paling portabel.
Mengapa ini begitu sulit? Karena wadah akan, dengan desain, mengisolasi aplikasi dari lingkungan host. Jaringan dinamai hanya untuk wadah itu secara default, dan rincian host dilindungi dari proses yang berjalan di dalam wadah yang mungkin tidak sepenuhnya dipercaya.
Ada beberapa opsi tergantung pada situasi spesifik Anda:
Jika kontainer Anda berjalan dengan jaringan host, maka Anda dapat melihat tabel routing pada host secara langsung untuk melihat rute default keluar. Dari pertanyaan ini, yang berikut berfungsi untuk saya, misalnya:
Contoh yang menunjukkan ini dengan jaringan host dalam wadah terlihat seperti:
Untuk beberapa versi Docker Desktop, mereka menyuntikkan entri DNS ke VM tertanam:
Jika Anda berjalan di lingkungan cloud, Anda dapat memeriksa layanan metadata dari penyedia cloud, misalnya AWS:
Jika Anda ingin alamat eksternal / internet, Anda dapat meminta layanan jarak jauh seperti:
Masing-masing memiliki keterbatasan dan hanya berfungsi dalam skenario tertentu. Opsi yang paling portabel adalah masih menjalankan wadah Anda dengan alamat IP yang disuntikkan sebagai konfigurasi, misalnya inilah opsi yang menjalankan
ip
perintah sebelumnya pada host dan menyuntikkannya sebagai variabel lingkungan:sumber
curl ifconfig.co
Perintah yang sangat membantu .. Terima kasih :)Jika Anda ingin
IP
alamat asli (bukan jembatanIP
)Windows
dan Anda memiliki buruh pelabuhan18.03
(atau yang lebih baru) lakukan hal berikut:Jalankan bash on container dari host tempat nama gambar berada
nginx
(berfungsiAlpine Linux distribution
):Kemudian jalankan di dalam wadah
192.168.65.2
adalah IP host - bukan IP jembatan seperti dispinus
jawaban yang diterima.Saya menggunakan di sini host.docker.internal :
sumber
Alpine Linux
? Jika tidak maka periksa setara untuk spesifik Andalinux distribution
.linux containers
dan saya tidak menggunakanwindows containers
. Anda dapat melakukannya dengan mengklik kanandocker icon
dan memilihSwitch to Linux containers
. Saya pikir itu bisa menjadi penting ketika Anda mengunduh gambar. Jika Anda telahwindows container
memeriksa apakah menghapusnginx
gambar lama dan mengunduhnya lagi akan memberi Anda wadah lain. Jika masih tidak bekerja untuk Anda - daripada Anda dapat mencoba menginstalnslookup
diash
.host.docker.internal
) dari dalam wadahTLDR untuk Mac dan Windows
... mencetak alamat IP host ...
Detail
Di Mac dan Windows , Anda dapat menggunakan nama DNS khusus
host.docker.internal
.sumber
Docker untuk Mac Saya ingin terhubung dari sebuah wadah ke layanan di host
Tuan rumah memiliki alamat IP yang berubah (atau tidak ada jika Anda tidak memiliki akses jaringan). Dari 18,03 dan seterusnya, rekomendasi kami adalah untuk terhubung ke nama DNS khusus host.docker.internal, yang memutuskan ke alamat IP internal yang digunakan oleh tuan rumah.
Gateway juga dapat dijangkau sebagai gateway.docker.internal. https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds
sumber
Jika Anda mengaktifkan API jarak jauh buruh pelabuhan (via
-H
tcp://0.0.0.0:4243
misalnya) dan mengetahui nama host atau alamat IP mesin host, ini dapat dilakukan dengan banyak bash.Di dalam pengguna kontainer saya
bashrc
:Baris kedua mengambil ID kontainer dari lokal Anda
/proc/self/cgroup
file .Baris ketiga meringkuk ke mesin host (dengan asumsi Anda menggunakan 4243 sebagai port docker) kemudian menggunakan node untuk mengurai JSON yang dikembalikan untuk
DESIRED_PORT
.sumber
HostPort
bisa menjadi informasi yang berguna di sini, sayangnyaHostIp
mungkin0.0.0.0
Saya punya Ubuntu 16.03. Untuk saya
tidak TIDAK bekerja (ip yang salah menghasilkan)
Solusi kerja saya adalah:
sumber
Berikut adalah opsi lain bagi mereka yang menjalankan Docker di AWS. Opsi ini menghindari penggunaan apk untuk menambahkan paket ikal dan menghemat ruang 7mb yang berharga. Gunakan wget bawaan (bagian dari biner BusyBox monolitik):
sumber
AFAIK, dalam hal Docker untuk Linux (distribusi standar), alamat ip host akan selalu
172.17.0.1
.Cara termudah untuk mendapatkannya adalah melalui
ifconfig
(interface docker0) dari tuan rumah:Dari dalam buruh pelabuhan, perintah berikut dari buruh pelabuhan:
ip -4 route show default | cut -d" " -f3
Anda dapat menjalankannya dengan cepat di buruh pelabuhan dengan baris perintah berikut:
Saya harap ini membantu.
sumber
Di linux Anda bisa menjalankan
Di macOS mesin host Anda bukan host Docker. Docker akan menginstal host OS-nya di VirtualBox.
sumber
hostname -I
memperingatkan untuk tidak "membuat asumsi tentang urutan output."Ini adalah implementasi minimalis di Node.js untuk siapa yang menjalankan host pada instance AWS EC2 , menggunakan instance Metadata EC2 yang disebutkan sebelumnya
dan digunakan sebagai
sumber
Jika Anda menjalankan wadah Windows pada kluster Fabric Layanan, alamat IP host tersedia melalui variabel lingkungan
Fabric_NodeIPOrFQDN
. Variabel lingkungan Fabric Layanansumber
Inilah cara saya melakukannya. Dalam hal ini, ia menambahkan entri host ke / etc / hosts di dalam gambar buruh pelabuhan yang menunjuk taurus-host ke IP mesin lokal saya::
Kemudian, dari dalam wadah Docker, skrip dapat menggunakan nama host taurus-host untuk keluar ke mesin lokal saya yang menampung kontainer buruh pelabuhan.
sumber
Mungkin wadah yang saya buat bermanfaat juga https://github.com/qoomon/docker-host
Anda cukup menggunakan wadah nama dns untuk mengakses sistem host misalnya curl http: // dockerhost: 9200 , jadi tidak perlu repot dengan alamat IP.
sumber
Solusi yang saya gunakan didasarkan pada "server" yang mengembalikan alamat eksternal host Docker ketika menerima permintaan http.
Di "server":
1) Mulai jwilder / nginx-proxy
2) Mulai wadah ipify
Sekarang ketika sebuah kontainer mengirimkan permintaan http ke server, mis
alamat IP host Docker dikembalikan oleh ipify melalui tajuk http "X-Forwarded-For"
Contoh (server ipify memiliki nama "ipify.example.com" dan berjalan pada port 80, host buruh pelabuhan memiliki IP 10.20.30.40):
Di dalam wadah sekarang Anda dapat memanggil:
sumber
Coba ini
sumber
Di Ubuntu,
hostname
perintah dapat digunakan dengan opsi berikut:-i
,--ip-address
alamat untuk nama host-I
,--all-ip-addresses
semua alamat untuk tuan rumahSebagai contoh:
Untuk menetapkan variabel, one-liner berikut dapat digunakan:
sumber
Dengan https://docs.docker.com/machine/install-machine/
a) $ mesin docker ip
b) Dapatkan alamat IP dari satu atau lebih mesin.
sumber