Jadi saya punya Nginx yang berjalan di dalam wadah buruh pelabuhan, saya punya mysql yang berjalan di localhost, saya ingin terhubung ke MySql dari dalam Nginx saya. MySql berjalan di localhost dan tidak mengekspos port ke dunia luar, jadi terikat pada localhost, tidak terikat pada alamat ip mesin.
Apakah ada cara untuk terhubung ke MySql ini atau program lain di localhost dari dalam wadah buruh pelabuhan ini?
Pertanyaan ini berbeda dari "Bagaimana cara mendapatkan alamat IP dari host buruh pelabuhan dari dalam wadah buruh pelabuhan" karena kenyataan bahwa alamat IP dari tuan rumah buruh pelabuhan dapat berupa IP publik atau IP pribadi dalam jaringan yang mungkin atau mungkin tidak dapat dijangkau dari dalam wadah buruh pelabuhan (maksud saya IP publik jika dihosting di AWS atau sesuatu). Bahkan jika Anda memiliki alamat IP dari host buruh pelabuhan itu tidak berarti Anda dapat terhubung ke host buruh pelabuhan dari dalam wadah mengingat bahwa alamat IP sebagai jaringan Docker Anda mungkin overlay, host, bridge, macvlan, tidak ada dll yang membatasi jangkauan alamat IP itu.
network: host
Anda tidak dapat kembali dari wadah ke tuan rumah. Hanya menampung wadah. Ini adalah ideologi utama di balik wadah. Mereka terisolasi karena alasan stabilitas dan keamanan.Jawaban:
Sunting: Jika Anda menggunakan Docker-for-mac atau Docker-for-Windows 18.03+, cukup sambungkan ke layanan mysql Anda menggunakan host
host.docker.internal
(bukan127.0.0.1
dalam string koneksi Anda).Pada Docker 18.09.3, ini tidak berfungsi pada Docker-untuk-Linux. Sebuah memperbaiki telah disampaikan pada Maret 8, 2019 dan mudah-mudahan akan bergabung untuk basis kode. Sampai saat itu, solusinya adalah menggunakan wadah seperti yang dijelaskan dalam jawaban qoomon .
2020-01: beberapa kemajuan telah dibuat. Jika semuanya berjalan dengan baik, ini akan mendarat di Docker 20.04
TLDR
Gunakan
--network="host"
dalamdocker run
perintah Anda , maka127.0.0.1
dalam wadah buruh pelabuhan Anda akan menunjuk ke host buruh pelabuhan Anda.Catatan: Mode ini hanya berfungsi di Docker untuk Linux, sesuai dokumentasinya .
Catatan tentang mode jaringan wadah buruh pelabuhan
Docker menawarkan berbagai mode jaringan saat menjalankan wadah. Tergantung pada mode yang Anda pilih, Anda akan terhubung ke database MySQL Anda yang berjalan pada host buruh pelabuhan secara berbeda.
docker run --network = "bridge" (default)
Docker membuat jembatan bernama
docker0
secara default. Baik host buruh pelabuhan dan wadah buruh pelabuhan memiliki alamat IP di jembatan itu.pada host Docker, ketik
sudo ip addr show docker0
Anda akan memiliki output seperti:Jadi di sini host buruh pelabuhan saya memiliki alamat IP
172.17.42.1
padadocker0
antarmuka jaringan.Sekarang mulai wadah baru dan dapatkan shell di atasnya:
docker run --rm -it ubuntu:trusty bash
dan dalam jenis wadahip addr show eth0
untuk menemukan bagaimana antarmuka jaringan utamanya diatur:Di sini wadah saya memiliki alamat IP
172.17.1.192
. Sekarang lihat tabel routing:Jadi Alamat IP dari host buruh pelabuhan
172.17.42.1
diatur sebagai rute default dan dapat diakses dari wadah Anda.docker run --network = "host"
Atau Anda dapat menjalankan wadah buruh pelabuhan dengan pengaturan jaringan diatur ke
host
. Kontainer semacam itu akan berbagi tumpukan jaringan dengan host buruh pelabuhan dan dari sudut pandang wadah,localhost
(atau127.0.0.1
) akan merujuk pada host buruh pelabuhan.Ketahuilah bahwa port apa pun yang dibuka dalam wadah buruh pelabuhan Anda akan dibuka pada host buruh pelabuhan. Dan ini tanpa memerlukan opsi
-p
atau-P
docker run
.Konfigurasi IP pada host buruh pelabuhan saya:
dan dari wadah buruh pelabuhan dalam mode host :
Seperti yang Anda lihat, kedua buruh pelabuhan dan wadah buruh pelabuhan berbagi antarmuka jaringan yang sama persis dan karenanya memiliki alamat IP yang sama.
Menghubungkan ke MySQL dari wadah
mode jembatan
Untuk mengakses MySQL yang berjalan pada host buruh pelabuhan dari wadah dalam mode bridge , Anda perlu memastikan layanan MySQL mendengarkan koneksi pada
172.17.42.1
alamat IP.Untuk melakukannya, pastikan Anda memiliki salah satu
bind-address = 172.17.42.1
ataubind-address = 0.0.0.0
dalam file konfigurasi MySQL Anda (my.cnf).Jika Anda perlu mengatur variabel lingkungan dengan alamat IP gateway, Anda dapat menjalankan kode berikut dalam sebuah wadah:
kemudian di aplikasi Anda, gunakan
DOCKER_HOST_IP
variabel lingkungan untuk membuka koneksi ke MySQL.Catatan: jika Anda menggunakan
bind-address = 0.0.0.0
server MySQL Anda akan mendengarkan koneksi pada semua antarmuka jaringan. Itu berarti server MySQL Anda dapat dijangkau dari Internet; pastikan untuk mengatur aturan firewall yang sesuai.Catatan 2: jika Anda menggunakan
bind-address = 172.17.42.1
server MySQL Anda tidak akan mendengarkan koneksi yang dibuat127.0.0.1
. Proses yang berjalan pada host buruh pelabuhan yang ingin terhubung ke MySQL harus menggunakan172.17.42.1
alamat IP.mode tuan rumah
Untuk mengakses MySQL yang berjalan di host buruh pelabuhan dari wadah dalam mode host , Anda dapat tetap
bind-address = 127.0.0.1
menggunakan konfigurasi MySQL Anda dan yang perlu Anda lakukan hanyalah menyambung ke127.0.0.1
dari wadah Anda:Catatan: Jangan gunakan
mysql -h 127.0.0.1
dan tidakmysql -h localhost
; jika tidak, klien MySQL akan mencoba terhubung menggunakan soket unix.sumber
telnet 172.17.0.1 3306
-v /var/run/mysqld/mysqld.sock:/tmp/mysql.sock
ini.Untuk macOS dan Windows
Docker v 18.03 dan lebih tinggi (sejak 21 Maret 2018)
Gunakan alamat IP internal Anda atau sambungkan ke nama DNS khusus
host.docker.internal
yang akan menyelesaikan ke alamat IP internal yang digunakan oleh tuan rumah.Dukungan Linux tertunda https://github.com/docker/for-linux/issues/264
MacOS dengan versi Docker sebelumnya
Docker untuk Mac v 17.12 hingga v 18.02
Sama seperti di atas tetapi gunakan
docker.for.mac.host.internal
sebagai gantinya.Docker untuk Mac v 17.06 hingga v 17.11
Sama seperti di atas tetapi gunakan
docker.for.mac.localhost
sebagai gantinya.Docker untuk Mac 17.05 dan di bawah
Untuk mengakses mesin host dari wadah buruh pelabuhan Anda harus memasang alias IP ke antarmuka jaringan Anda. Anda dapat mengikat IP mana pun yang Anda inginkan, pastikan Anda tidak menggunakannya untuk hal lain.
sudo ifconfig lo0 alias 123.123.123.123/24
Kemudian pastikan server Anda mendengarkan IP yang disebutkan di atas atau
0.0.0.0
. Jika mendengarkan di localhost,127.0.0.1
itu tidak akan menerima koneksi.Kemudian arahkan saja buruh pelabuhan Anda ke IP ini dan Anda dapat mengakses mesin host!
Untuk menguji Anda dapat menjalankan sesuatu seperti
curl -X GET 123.123.123.123:3000
di dalam wadah.Alias akan mengatur ulang pada setiap reboot sehingga buat skrip start-up jika perlu.
Solusi dan dokumentasi lainnya di sini: https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds
sumber
mysql -uroot -hdocker.for.mac.localhost
docker run -e HOSTNAME= docker.for.mac.host.internal
, wadah dibuat tetapi tidak terjadi panas. Saya kemudian harus crtl + C. Dengan--net=host -e HOSTNAME=localhost
setidaknya wadah berjalan dan mengeluh bahwa itu tidak dapat menemukan layanan yang saya butuhkan (MySQL db).Saya melakukan hack mirip dengan posting di atas untuk mendapatkan IP lokal untuk memetakan ke nama alias (DNS) dalam wadah. Masalah utama adalah mendapatkan secara dinamis dengan skrip sederhana yang berfungsi baik di Linux dan OSX alamat IP host . Saya melakukan skrip ini yang berfungsi di kedua lingkungan (bahkan di distribusi Linux dengan
"$LANG" != "en_*"
konfigurasi):Jadi, menggunakan Docker Compose, konfigurasi lengkapnya adalah:
Skrip startup (docker-run.sh) :
docker-compose.yml :
Kemudian ubah
http://localhost
kehttp://dockerhost
dalam kode Anda.Untuk panduan lebih lanjut tentang cara mengkustomisasi
DOCKERHOST
skrip, lihat posting ini dengan penjelasan tentang cara kerjanya.sumber
DOCKERHOST
nilai di sini daripada "localhost" atau 0,0.0.0 dalam layanan apa pun yang harus disambungkan oleh wadah buruh pelabuhan Anda secara lokal.export DOCKERHOST=$(docker network inspect --format='{{range .IPAM.Config}}{{.Gateway}}{{end}}' <NETWORK-NAME> | awk -F "/" 'NR==1{print $1}')
Di mana <NETWORK-NAME> dapat menjembatani atau nama jaringan seperti yang didefinisikan oleh komposisi buruh pelabuhan (biasanya path-name - network_name ).dockerhost
sebagai host untuk koneksi db (biasanya ganti untuklocalhost
dalam file konfigurasi).Ini bekerja untuk saya di tumpukan NGINX / PHP-FPM tanpa menyentuh kode atau jaringan apa pun di mana aplikasi hanya berharap dapat terhubung ke
localhost
Pasang
mysqld.sock
dari host ke dalam wadah.Temukan lokasi file mysql.sock di host yang menjalankan mysql:
netstat -ln | awk '/mysql(.*)?\.sock/ { print $9 }'
Pasang file itu ke tempat yang diharapkan di buruh pelabuhan:
docker run -v /hostpath/to/mysqld.sock:/containerpath/to/mysqld.sock
Kemungkinan lokasi mysqld.sock:
sumber
Sampai
host.docker.internal
berfungsi untuk setiap platform, Anda dapat menggunakan wadah saya bertindak sebagai gateway NAT tanpa pengaturan manual:https://github.com/qoomon/docker-host
sumber
Solusi untuk Linux (kernel> = 3.6).
Ok, server localhost Anda memiliki antarmuka docker0 standar docker0 dengan alamat ip 172.17.0.1 . Wadah Anda dimulai dengan pengaturan jaringan default --net = "jembatan" .
$ sysctl -w net.ipv4.conf.docker0.route_localnet=1
$ iptables -t nat -I PREROUTING -i docker0 -d 172.17.0.1 -p tcp --dport 3306 -j DNAT --to 127.0.0.1:3306
$ iptables -t filter -I INPUT -i docker0 -d 127.0.0.1 -p tcp --dport 3306 -j ACCEPT
CREATE USER 'user'@'%' IDENTIFIED BY 'password';
Dari dokumentasi kernel :
sumber
Solusi untuk Windows 10
Edisi Komunitas Docker 17.06.0-ce-win18 2017-06-28 (stabil)
Anda dapat menggunakan nama DNS host
docker.for.win.localhost
, untuk menyelesaikan ke IP internal. (Peringatan beberapa sumber disebutkanwindows
tetapi haruswin
)Gambaran Umum
Saya perlu melakukan sesuatu yang serupa, yaitu menyambung dari wadah Docker ke localhost saya, yang menjalankan
Azure Storage Emulator
danCosmosDB Emulator
.Secara
Azure Storage Emulator
default mendengarkan pada 127.0.0.1 , sementara Anda dapat mengubah IP-nya terikat juga, saya sedang mencari solusi yang akan bekerja dengan pengaturan default.Ini juga berfungsi untuk menghubungkan dari wadah Docker saya ke
SQL Server
danIIS
, keduanya berjalan secara lokal di host saya dengan pengaturan port default.sumber
Sangat sederhana dan cepat, periksa IP host Anda dengan ifconfig (linux) atau ipconfig (windows) lalu buat
docker-compose.yml
Dengan cara ini, wadah Anda akan dapat mengakses host Anda. Saat mengakses DB Anda, ingatlah untuk menggunakan nama yang Anda tentukan sebelumnya, dalam hal ini "dockerhost" dan port host Anda di mana DB berjalan
sumber
Tidak ada jawaban yang berfungsi untuk saya ketika menggunakan Docker Toolbox di Windows 10 Home, tetapi 10.0.2.2 melakukannya, karena menggunakan VirtualBox yang mengekspos host ke VM pada alamat ini.
sumber
Ethernet adapter vEthernet (DockerNAT)
Bagi mereka yang menggunakan Windows, dengan asumsi Anda menggunakan driver jaringan jembatan, Anda harus secara spesifik mengikat MySQL ke alamat ip dari antarmuka jaringan hyper-v.
Ini dilakukan melalui file konfigurasi di bawah folder C: \ ProgramData \ MySQL yang biasanya tersembunyi.
Mengikat ke 0.0.0.0 tidak akan berfungsi. Alamat yang diperlukan juga ditampilkan dalam konfigurasi buruh pelabuhan, dan dalam kasus saya adalah 10.0.75.1.
sumber
Sunting: Saya akhirnya membuat prototip konsep di GitHub. Lihat: https://github.com/sivabudh/system-in-a-box
Pertama, jawaban saya diarahkan pada 2 kelompok orang: mereka yang menggunakan Mac, dan mereka yang menggunakan Linux.
The Host modus jaringan tidak bekerja pada Mac. Anda harus menggunakan alias IP, lihat: https://stackoverflow.com/a/43541681/2713729
Apa itu mode jaringan host? Lihat: https://docs.docker.com/engine/reference/run/#/network-settings
Kedua, bagi Anda yang menggunakan Linux (pengalaman langsung saya dengan Ubuntu 14,04 LTS dan saya segera memperbarui ke 16,04 LTS dalam produksi), ya , Anda dapat membuat layanan yang berjalan di dalam wadah Docker terhubung ke
localhost
layanan yang berjalan di Host Docker (mis. Laptop Anda).Bagaimana?
Kuncinya adalah ketika Anda menjalankan wadah Docker, Anda harus menjalankannya dengan mode host . Perintahnya terlihat seperti ini:
docker run --network="host" -id <Docker image ID>
Ketika Anda melakukan
ifconfig
(Anda perluapt-get install net-tools
wadah Andaifconfig
agar dapat dipanggil) di dalam wadah Anda, Anda akan melihat bahwa antarmuka jaringan sama dengan yang ada pada host Docker (mis. Laptop Anda).Penting untuk dicatat bahwa saya adalah pengguna Mac, tetapi saya menjalankan Ubuntu di bawah Parallels, jadi menggunakan Mac bukanlah kerugian. ;-)
Dan ini adalah bagaimana Anda menghubungkan wadah NGINX ke MySQL yang berjalan pada a
localhost
.sumber
--network="host"
, bagaimana seseorang terhubung ke host mysql misalnya?localhost
. Lihat kode sumber GitHub saya: github.com/sivabudh/system-in-a-box/blob/master/dj_host_docker/… . Cari'HOST'
, Anda akan melihat 127.0.0.1 untuk terhubung ke Postgresql.Solusi paling sederhana untuk Mac OSX
Cukup gunakan alamat IP Mac Anda. Di Mac jalankan ini untuk mendapatkan alamat IP dan menggunakannya dari dalam wadah:
Selama server berjalan secara lokal di Mac Anda atau di wadah buruh pelabuhan lain mendengarkan 0.0.0.0, wadah buruh pelabuhan akan dapat menjangkau di alamat itu.
Jika Anda hanya ingin mengakses wadah buruh pelabuhan lain yang mendengarkan pada 0.0.0.0 Anda dapat menggunakan 172.17.0.1
sumber
docker.for.mac.host.internal
nama host sekarang.Ini bukan jawaban untuk pertanyaan aktual. Beginilah cara saya memecahkan masalah serupa. Solusinya benar-benar berasal dari: Tentukan Docker Container Networking sehingga Kontainer dapat Berkomunikasi . Terima kasih kepada Nic Raboy
Meninggalkan ini di sini untuk orang lain yang mungkin ingin melakukan panggilan REST antara satu wadah dan lainnya. Menjawab pertanyaan: apa yang harus digunakan sebagai pengganti localhost di lingkungan buruh pelabuhan?
Dapatkan seperti apa jaringan Anda
docker network ls
Buat jaringan baru
docker network create -d my-net
Mulai wadah pertama
docker run -d -p 5000:5000 --network="my-net" --name "first_container" <MyImage1:v0.1>
Periksa pengaturan jaringan untuk wadah pertama
docker inspect first_container
. "Jaringan": harus memiliki 'my-net'Mulai wadah kedua
docker run -d -p 6000:6000 --network="my-net" --name "second_container" <MyImage2:v0.1>
Periksa pengaturan jaringan untuk wadah kedua
docker inspect second_container
. "Jaringan": harus memiliki 'my-net'ssh ke wadah kedua Anda
docker exec -it second_container sh
ataudocker exec -it second_container bash
.Di dalam wadah kedua, Anda dapat melakukan ping wadah pertama
ping first_container
. Selain itu, panggilan kode Anda sepertihttp://localhost:5000
dapat digantikan olehhttp://first_container:5000
sumber
Untuk windows,
Saya telah mengubah url basis data dalam konfigurasi pegas:
spring.datasource.url=jdbc:postgresql://host.docker.internal:5432/apidb
Kemudian bangun gambar dan jalankan. Ini berhasil untuk saya.
sumber
Saya tidak setuju dengan jawaban dari Thomasleveil.
Membuat mysql mengikat ke 172.17.42.1 akan mencegah program lain menggunakan database pada host untuk mencapainya. Ini hanya akan berfungsi jika semua pengguna basis data Anda di-dock.
Membuat mysql bind ke 0.0.0.0 akan membuka db ke dunia luar, yang bukan hanya merupakan hal yang sangat buruk untuk dilakukan, tetapi juga bertentangan dengan apa yang ingin dilakukan oleh pertanyaan asli. Dia secara eksplisit mengatakan "MySql berjalan di localhost dan tidak mengekspos port ke dunia luar, jadi terikat pada localhost"
Untuk menjawab komentar dari ivant
Ini tidak mungkin. Dokumentasi mysql / mariadb secara eksplisit mengatakan tidak mungkin untuk mengikat ke beberapa antarmuka. Anda hanya dapat mengikat ke 0, 1, atau semua antarmuka.
Sebagai kesimpulan, saya belum menemukan cara untuk mencapai database (localhost saja) pada host dari wadah buruh pelabuhan. Itu jelas terlihat seperti pola yang sangat umum, tetapi saya tidak tahu bagaimana melakukannya.
sumber
172.17.42.1
alamat tersebut. Tetapi catatan Anda benar sebaliknya. Aso, saya mengedit jawaban saya denganhost
mode jaringan yang memungkinkan untuk menjaga server MySQL terikat127.0.0.1
sementara memungkinkan wadah untuk terhubung0.0.0.0
dan kemudian membuat firewall sehingga db tidak dapat diakses dari internet.Inilah solusi saya: ini berfungsi untuk kasus saya
atur server mysql lokal ke akses publik dengan komentar
#bind-address = 127.0.0.1
di /etc/mysql/mysql.conf.drestart server mysql
sudo /etc/init.d/mysql restart
jalankan perintah berikut untuk membuka akses root pengguna host apa pun
mysql -uroot -proot GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; FLUSH PRIVILEGES;
buat skrip sh: run_docker.sh
dijalankan dengan buruh pelabuhan-komposer
sumber
Beberapa solusi muncul dalam pikiran:
Alasan ini tidak berhasil di luar kotak adalah bahwa kontainer berjalan dengan namespace jaringan mereka sendiri secara default. Itu berarti localhost (atau 127.0.0.1 menunjuk ke antarmuka loopback) adalah unik per kontainer. Menghubungkan ke ini akan terhubung ke wadah itu sendiri, dan bukan layanan yang berjalan di luar buruh pelabuhan atau di dalam wadah buruh pelabuhan yang berbeda.
Opsi 1 : Jika ketergantungan Anda dapat dipindahkan ke wadah, saya akan melakukan ini terlebih dahulu. Itu membuat tumpukan aplikasi Anda portabel karena orang lain mencoba menjalankan wadah Anda di lingkungan mereka sendiri. Dan Anda masih dapat menerbitkan port di host Anda di mana layanan lain yang belum dimigrasi masih dapat mencapainya. Anda bahkan dapat mempublikasikan port ke antarmuka localhost pada host buruh pelabuhan Anda agar tidak diakses secara eksternal dengan sintaksis seperti:
-p 127.0.0.1:3306:3306
untuk port yang dipublikasikan.Opsi 2 : Ada berbagai cara untuk mendeteksi alamat IP host dari dalam wadah, tetapi masing-masing memiliki sejumlah skenario di mana mereka bekerja (misalnya membutuhkan Docker untuk Mac). Opsi paling portabel adalah menyuntikkan IP host Anda ke dalam wadah dengan sesuatu seperti variabel lingkungan atau file konfigurasi, misalnya:
Ini memang mengharuskan layanan Anda mendengarkan pada antarmuka eksternal itu, yang bisa menjadi masalah keamanan. Untuk metode lain untuk mendapatkan alamat IP host dari dalam wadah, lihat posting ini .
Opsi 3 : Berjalan tanpa isolasi jaringan, yaitu berjalan dengan
--net host
, berarti aplikasi Anda berjalan di namespace jaringan host. Ini lebih sedikit isolasi untuk wadah, dan itu berarti Anda tidak dapat mengakses wadah lain melalui jaringan buruh pelabuhan bersama dengan DNS (sebagai gantinya, Anda perlu menggunakan port yang diterbitkan untuk mengakses aplikasi kontainer lainnya). Tetapi untuk aplikasi yang perlu mengakses layanan lain pada host yang hanya mendengarkan pada127.0.0.1
host, ini bisa menjadi pilihan termudah.Opsi 4 : Berbagai layanan juga memungkinkan akses melalui soket berbasis sistem file. Soket ini dapat dipasang ke wadah sebagai pengikat volume yang terpasang, memungkinkan Anda untuk mengakses layanan host tanpa melalui jaringan. Untuk akses ke mesin buruh pelabuhan, Anda sering melihat contoh pemasangan
/var/run/docker.sock
ke wadah (memberikan akses root wadah ke host). Dengan mysql, Anda dapat mencoba sesuatu seperti-v /var/run/mysqld/mysqld.sock:/var/run/mysqld/mysql.sock
dan kemudian terhubung kelocalhost
yang dikonversi mysql ke menggunakan soket.sumber
Anda bisa mendapatkan ip host menggunakan gambar alpine
Ini akan lebih konsisten karena Anda selalu menggunakan alpine untuk menjalankan perintah.
Mirip dengan jawaban Mariano, Anda dapat menggunakan perintah yang sama untuk mengatur variabel lingkungan
sumber
Untuk Linux, tempat Anda tidak dapat mengubah antarmuka, layanan localhost mengikat
Ada dua masalah yang harus kita pecahkan
Masalah pertama dapat dipecahkan dengan menggunakan image docker-host qoomon , seperti yang diberikan oleh jawaban lain.
Anda harus menambahkan wadah ini ke jaringan jembatan yang sama dengan wadah Anda yang lain sehingga Anda dapat mengaksesnya. Buka terminal di dalam wadah Anda dan pastikan Anda dapat melakukan ping
dockerhost
.Sekarang, masalah yang semakin sulit, membuat layanan dapat diakses oleh buruh pelabuhan.
Kita dapat menggunakan telnet untuk memeriksa apakah kita dapat mengakses port pada host (Anda mungkin perlu menginstal ini).
Masalahnya adalah bahwa wadah kami hanya akan dapat mengakses layanan yang mengikat semua antarmuka, seperti SSH:
Tetapi layanan yang hanya terikat pada localhost tidak akan dapat diakses:
Solusi yang tepat di sini adalah untuk mengikat layanan ke jaringan jembatan buruh pelabuhan. Namun, jawaban ini mengasumsikan bahwa Anda tidak dapat mengubahnya. Jadi kita malah akan menggunakan
iptables
.Pertama, kita perlu mencari nama jaringan jembatan yang digunakan buruh pelabuhan
ifconfig
. Jika Anda menggunakan jembatan tanpa nama, ini hanya akan menjadidocker0
. Namun, jika Anda menggunakan jaringan bernama Anda akan memiliki jembatan dimulai denganbr-
buruh pelabuhan itu akan menggunakan sebagai gantinya. Milik sayabr-5cd80298d6f4
.Setelah kami memiliki nama jembatan ini, kami perlu mengizinkan perutean dari jembatan ini ke localhost. Ini dinonaktifkan secara default karena alasan keamanan:
Sekarang untuk mengatur
iptables
aturan kami . Karena kontainer kami hanya dapat mengakses port pada jaringan bridge docker, kami akan berpura-pura bahwa layanan kami sebenarnya terikat pada port pada jaringan ini.Untuk melakukan ini, kami akan meneruskan semua permintaan
<docker_bridge>:port
kelocalhost:port
Misalnya, untuk layanan saya di port 1025
Anda sekarang harus dapat mengakses layanan Anda dari wadah:
sumber
sysctl -w net.ipv4.conf.docker0.route_localnet=1
daniptables -t nat -A PREROUTING -p tcp -i docker0 --dport 1025 -j DNAT --to-destination 127.0.0.1:1025
Anda harus tahu gateway ! Solusi saya dengan server lokal adalah mengeksposnya di bawah
0.0.0.0:8000
, kemudian jalankan buruh pelabuhan dengan subnet dan jalankan wadah seperti:Jadi, sekarang Anda dapat mengakses loopback melalui
http://172.35.0.1:8000
sumber
Coba ini:
Mendapatkan
192.168.1.202
, gunakanifconfig
Ini berhasil untuk saya. Semoga bantuan ini!
sumber
CGroups dan Namespaces memainkan peran utama dalam Container Ecosystem.
Namespace menyediakan lapisan isolasi. Setiap kontainer berjalan di namespace terpisah dan aksesnya terbatas pada namespace itu. Cgroups mengontrol pemanfaatan sumber daya dari setiap wadah, sedangkan Namespace mengontrol apa yang dapat dilihat oleh suatu proses dan mengakses sumber daya masing-masing.
Inilah pemahaman dasar pendekatan solusi yang bisa Anda ikuti,
Gunakan Network Namespace
Ketika sebuah wadah memunculkan gambar, antarmuka jaringan didefinisikan dan dibuat. Ini memberikan wadah alamat IP dan antarmuka yang unik.
Dengan mengubah namespace menjadi host, jaringan cotainers tidak tetap terisolasi ke antarmuka, proses akan memiliki akses ke antarmuka jaringan mesin host.
Jika proses mendengarkan pada port, mereka akan mendengarkan pada antarmuka host dan dipetakan ke wadah.
Gunakan Namespace PID Dengan mengubah Namespace Pid memungkinkan wadah untuk berinteraksi dengan proses lain di luar ruang lingkup normal.
Kontainer ini akan berjalan di namespace-nya sendiri.
Dengan mengubah namespace menjadi host, wadah juga dapat melihat semua proses lain yang berjalan pada sistem.
Berbagi Namespace
Ini adalah praktik buruk untuk melakukan ini dalam produksi karena Anda keluar dari model keamanan wadah yang mungkin terbuka untuk kerentanan, dan akses mudah ke penyadap. Ini hanya untuk alat debugging dan mengecilkan celah dalam keamanan kontainer.
Kontainer pertama adalah server nginx. Ini akan membuat jaringan baru dan proses namespace. Kontainer ini akan mengikat dirinya ke port 80 dari antarmuka jaringan yang baru dibuat.
Wadah lain sekarang dapat menggunakan kembali namespace ini,
Juga, wadah ini dapat melihat antarmuka dengan proses dalam wadah bersama.
Ini akan memungkinkan Anda memberi lebih banyak hak istimewa kepada wadah tanpa mengubah atau memulai ulang aplikasi. Dengan cara yang sama Anda dapat terhubung ke mysql di host, jalankan dan debug aplikasi Anda. Tapi, itu tidak merekomendasikan untuk pergi dengan cara ini. Semoga ini bisa membantu.
sumber
Untuk Mesin Windows: -
Jalankan perintah di bawah ini untuk Mengekspos port buruh pelabuhan secara acak selama waktu pembuatan
Dalam daftar kontainer di atas Anda dapat melihat port ditetapkan sebagai 32768. Coba akses
Anda dapat melihat halaman mediawiki
sumber
Sampai perbaikan tidak digabung menjadi
master
cabang, untuk mendapatkan host IP jalankan dari dalam wadah:(seperti yang disarankan oleh @Money di sini ).
sumber
Saya menyelesaikannya dengan membuat pengguna di MySQL untuk ip penampung:
Kemudian pada wadah:
jdbc:mysql://<b>172.17.0.1</b>:3306/database_name
sumber
Cara saya melakukannya adalah melewatkan IP host sebagai variabel lingkungan ke wadah. Kontainer kemudian mengakses host oleh variabel itu.
sumber