Mengakses Perkhidmatan Localhost daripada Docker Containers
Menjalankan Nginx di dalam bekas Docker semasa perlu menyambung ke contoh MySQL pada mesin hos boleh mencabar, terutamanya apabila MySQL terikat hanya kepada localhost. Persediaan ini menghalang bekas daripada mengakses terus perkhidmatan MySQL menggunakan kaedah rangkaian standard.
Artikel ini meneroka pelbagai penyelesaian untuk merapatkan jurang ini, membenarkan ketersambungan yang lancar antara bekas dan perkhidmatan Docker yang dijalankan pada hos tempatan hos. Kami akan membincangkan sebab kaedah biasa mungkin gagal dan menyediakan langkah praktikal untuk mencapai ketersambungan yang diingini.
Perintah | Penerangan |
---|---|
docker network create --driver bridge hostnetwork | Mencipta rangkaian Docker tersuai dengan pemacu jambatan, membenarkan bekas untuk berkomunikasi dalam rangkaian yang sama. |
host_ip=$(ip -4 addr show docker0 | grep -oP '(? | Mengekstrak alamat IP antara muka docker0 hos, yang digunakan untuk menyambung daripada bekas ke perkhidmatan hos. |
docker exec -it nginx-container bash | Melaksanakan shell bash interaktif di dalam bekas Nginx yang sedang berjalan untuk akses baris arahan langsung. |
mysql -h $host_ip -u root -p | Perintah yang digunakan di dalam bekas Nginx untuk menyambung ke pelayan MySQL yang berjalan pada mesin hos menggunakan alamat IP yang diekstrak. |
networks: hostnetwork: external: true | Konfigurasi dalam Docker Compose untuk menggunakan rangkaian Docker yang dibuat secara luaran. |
echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" >echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf | Menulis konfigurasi Nginx baharu untuk memproksi permintaan MySQL kepada mesin hos. |
nginx -s reload | Muat semula perkhidmatan Nginx untuk menggunakan perubahan konfigurasi baharu. |
Mengkonfigurasi Docker dan Nginx untuk Mengakses Perkhidmatan Hos
Untuk menyambungkan bekas Nginx ke contoh MySQL yang dijalankan pada hos, kita perlu mewujudkan jambatan rangkaian terlebih dahulu. Perintah itu docker network create --driver bridge hostnetwork mencipta rangkaian tersuai ini, membolehkan komunikasi antara bekas pada rangkaian yang sama. Kami kemudian memulakan bekas MySQL dan Nginx pada rangkaian ini menggunakan docker run --name mysql-container --network hostnetwork -e MYSQL_ROOT_PASSWORD=root -d mysql:latest dan docker run --name nginx-container --network hostnetwork -d nginx:latest, masing-masing. Persediaan ini membolehkan bekas menemui dan berkomunikasi antara satu sama lain. Untuk menyambung ke MySQL dari Nginx, kami memerlukan alamat IP hos, yang boleh diperolehi dengan host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'). Perintah ini menangkap alamat IP antara muka docker0 pada hos.
Seterusnya, kita gunakan docker exec -it nginx-container bash untuk membuka cangkerang interaktif dalam bekas Nginx. Dari sini, kita boleh memulakan sambungan MySQL menggunakan mysql -h $host_ip -u root -p, di mana $host_ip ialah alamat IP hos. Sebagai alternatif, menggunakan Docker Compose memudahkan proses dengan mentakrifkan perkhidmatan dan rangkaian dalam fail YAML. The networks: hostnetwork: external: true konfigurasi memastikan bahawa perkhidmatan menggunakan rangkaian yang dibuat secara luaran. Akhir sekali, untuk mengkonfigurasi Nginx kepada proksi permintaan MySQL, kami mengemas kini fail konfigurasinya dengan echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf dan muat semula Nginx menggunakan nginx -s reload. Persediaan ini membolehkan Nginx memajukan permintaan kepada contoh MySQL yang dijalankan pada hos.
Menyambungkan Docker Container ke Hos MySQL melalui Jambatan Rangkaian
Skrip Shell untuk Persediaan Rangkaian Docker
# Create a Docker network
docker network create --driver bridge hostnetwork
# Run MySQL container with the created network
docker run --name mysql-container --network hostnetwork -e MYSQL_ROOT_PASSWORD=root -d mysql:latest
# Run Nginx container with the created network
docker run --name nginx-container --network hostnetwork -d nginx:latest
# Get the host machine's IP address
host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
# Connect to MySQL from within the Nginx container
docker exec -it nginx-container bash
mysql -h $host_ip -u root -p
Menggunakan Docker Compose untuk Memautkan Nginx dan MySQL Hos
Docker Compose Konfigurasi YAML
version: '3.8'
services:
nginx:
image: nginx:latest
container_name: nginx-container
networks:
- hostnetwork
mysql:
image: mysql:latest
container_name: mysql-container
environment:
MYSQL_ROOT_PASSWORD: root
networks:
- hostnetwork
networks:
hostnetwork:
external: true
Mengkonfigurasi Nginx untuk Menyambung ke Hos MySQL Menggunakan Rangkaian Docker
Konfigurasi Nginx dan Perintah Rangkaian Docker
# Create a bridge network
docker network create bridge-network
# Run Nginx container with bridge network
docker run --name nginx-container --network bridge-network -d nginx:latest
# Run MySQL container on the host network
docker run --name mysql-container --network host -e MYSQL_ROOT_PASSWORD=root -d mysql:latest
# Update Nginx configuration to point to MySQL host
docker exec -it nginx-container bash
echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf
nginx -s reload
Menyambungkan Bekas Docker ke Hos Perkhidmatan Tempatan
Apabila menjalankan aplikasi dalam bekas Docker, mengakses perkhidmatan yang terikat kepada hos tempatan hos boleh menjadi mencabar kerana pengasingan rangkaian. Satu pendekatan yang berkesan ialah menggunakan mod rangkaian hos Docker. Dengan memulakan bekas dengan --network host pilihan, bekas berkongsi timbunan rangkaian hos, membenarkannya mengakses perkhidmatan terikat localhost secara langsung. Walau bagaimanapun, mod ini kurang mudah alih dan mungkin tidak berfungsi dengan baik dalam semua persekitaran, seperti Docker Swarm atau Kubernetes.
Pendekatan lain ialah menggunakan penyelesai DNS terbina dalam Docker, host.docker.internal. Nama DNS khas ini diselesaikan kepada alamat IP hos, membolehkan bekas untuk berkomunikasi dengan perkhidmatan pada hos. Kaedah ini mudah dan mengelakkan kerumitan pengurusan rangkaian. Walau bagaimanapun, ia hanya tersedia pada Docker untuk Windows dan Mac, bukan pada Linux. Untuk pengguna Linux, mencipta rangkaian jambatan tersuai dan mengkonfigurasi peraturan penghalaan secara manual ialah penyelesaian yang berdaya maju. Ini melibatkan penggunaan ip dan iptables arahan untuk menghalakan trafik dari rangkaian kontena ke antara muka localhost hos.
Soalan Biasa tentang Menyambungkan Bekas Docker ke Perkhidmatan Hos
- Bagaimana saya menggunakan --network host pilihan dalam Docker?
- Jalankan bekas anda dengan docker run --network host untuk berkongsi susunan rangkaian hos.
- Apa itu host.docker.internal?
- Ia adalah nama DNS khas yang menetapkan alamat IP hos, tersedia pada Docker untuk Windows dan Mac.
- Boleh saya guna host.docker.internal pada Linux?
- Tidak, ciri ini tidak tersedia pada Docker untuk Linux.
- Bagaimanakah saya boleh membuat rangkaian jambatan tersuai?
- guna docker network create --driver bridge my-bridge-network untuk mencipta rangkaian jambatan tersuai.
- Apakah tujuan iptables perintah?
- Ia menguruskan penapisan paket rangkaian dan peraturan penghalaan pada sistem Linux.
- Bagaimanakah saya boleh menyambung ke contoh MySQL pada hos dari bekas Docker?
- guna mysql -h host.docker.internal -u root -p untuk Docker pada Windows/Mac atau konfigurasikan penghalaan untuk Linux.
- Apakah batasan penggunaan --network host?
- Ia mungkin mengurangkan kemudahalihan dan tidak serasi dengan sesetengah orkestra seperti Kubernetes.
- Bolehkah saya mengakses perkhidmatan lain pada hos selain MySQL?
- Ya, menggunakan kaedah yang sama, anda boleh menyambung ke mana-mana perkhidmatan yang dijalankan pada hos.
Pemikiran Akhir tentang Mengakses Perkhidmatan Hos daripada Docker
Menyambung ke contoh MySQL pada hos dari bekas Nginx melibatkan pelbagai kaedah, masing-masing dengan faedah dan batasannya sendiri. Menggunakan rangkaian hos, nama DNS khas atau jambatan rangkaian tersuai boleh merapatkan jurang dengan berkesan, memastikan komunikasi lancar antara bekas Docker dan perkhidmatan hos. Dengan memahami dan melaksanakan strategi ini, anda boleh mengatasi cabaran pengasingan rangkaian dan mengekalkan sambungan yang teguh dalam persekitaran Dockerized anda.