Mengakses Layanan Localhost dari Docker Containers
Menjalankan Nginx di dalam container Docker sambil terhubung ke instance MySQL di mesin host dapat menjadi tantangan, terutama ketika MySQL hanya terikat ke localhost. Pengaturan ini mencegah kontainer mengakses layanan MySQL secara langsung menggunakan metode jaringan standar.
Artikel ini mengeksplorasi berbagai solusi untuk menjembatani kesenjangan ini, memungkinkan konektivitas tanpa batas antara kontainer Docker dan layanan yang berjalan di localhost host. Kami akan membahas mengapa metode umum mungkin gagal dan memberikan langkah-langkah praktis untuk mencapai konektivitas yang diinginkan.
Memerintah | Keterangan |
---|---|
docker network create --driver bridge hostnetwork | Membuat jaringan Docker khusus dengan driver jembatan, memungkinkan container berkomunikasi dalam jaringan yang sama. |
host_ip=$(ip -4 addr show docker0 | grep -oP '(? | Mengekstrak alamat IP antarmuka docker0 host, yang digunakan untuk terhubung dari kontainer ke layanan host. |
docker exec -it nginx-container bash | Mengeksekusi shell bash interaktif di dalam container Nginx yang sedang berjalan untuk akses baris perintah langsung. |
mysql -h $host_ip -u root -p | Perintah yang digunakan di dalam wadah Nginx untuk terhubung ke server MySQL yang berjalan pada mesin host menggunakan alamat IP yang diekstrak. |
networks: hostnetwork: external: true | Konfigurasi di Docker Compose untuk menggunakan jaringan Docker yang dibuat secara eksternal. |
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 baru untuk memproksi permintaan MySQL ke mesin host. |
nginx -s reload | Muat ulang layanan Nginx untuk menerapkan perubahan konfigurasi baru. |
Mengonfigurasi Docker dan Nginx untuk Mengakses Layanan Host
Untuk menghubungkan container Nginx ke instance MySQL yang berjalan di host, pertama-tama kita perlu membuat jembatan jaringan. Perintah membuat jaringan khusus ini, memungkinkan komunikasi antar kontainer di jaringan yang sama. Kami kemudian memulai container MySQL dan Nginx di jaringan ini menggunakan Dan , masing-masing. Penyiapan ini memungkinkan container untuk menemukan dan berkomunikasi satu sama lain. Untuk terhubung ke MySQL dari Nginx, kita memerlukan alamat IP host, yang dapat diperoleh dengan menggunakan host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'). Perintah ini menangkap alamat IP antarmuka docker0 pada host.
Selanjutnya kita gunakan untuk membuka shell interaktif di wadah Nginx. Dari sini, kita dapat memulai koneksi MySQL menggunakan , Di mana adalah alamat IP host. Alternatifnya, menggunakan Docker Compose menyederhanakan proses dengan mendefinisikan layanan dan jaringan dalam file YAML. Itu networks: hostnetwork: external: true konfigurasi memastikan bahwa layanan menggunakan jaringan yang dibuat secara eksternal. Terakhir, untuk mengonfigurasi Nginx ke proksi permintaan MySQL, kami memperbarui file konfigurasinya dengan dan muat ulang Nginx menggunakan . Pengaturan ini memungkinkan Nginx meneruskan permintaan ke instance MySQL yang berjalan di host.
Menghubungkan Docker Container ke MySQL Host melalui Network Bridge
Skrip Shell untuk Pengaturan Jaringan 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 Menautkan Nginx dan Host MySQL
Konfigurasi YAML Tulis Docker
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
Mengonfigurasi Nginx untuk Terhubung ke Host MySQL Menggunakan Jaringan Docker
Konfigurasi Nginx dan Perintah Jaringan 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
Menghubungkan Kontainer Docker ke Host Layanan Lokal
Saat menjalankan aplikasi di container Docker, mengakses layanan yang terikat ke localhost host dapat menjadi tantangan karena isolasi jaringan. Salah satu pendekatan yang efektif adalah dengan menggunakan mode jaringan host Docker. Dengan memulai sebuah wadah dengan pilihan, kontainer berbagi tumpukan jaringan host, memungkinkannya mengakses layanan yang terikat dengan host lokal secara langsung. Namun, mode ini kurang portabel dan mungkin tidak berfungsi dengan baik di semua lingkungan, seperti Docker Swarm atau Kubernetes.
Pendekatan lain adalah dengan menggunakan penyelesai DNS bawaan Docker, . Nama DNS khusus ini disesuaikan dengan alamat IP host, sehingga memungkinkan container berkomunikasi dengan layanan di host. Metode ini mudah dan menghindari kerumitan manajemen jaringan. Namun, ini hanya tersedia di Docker untuk Windows dan Mac, bukan di Linux. Untuk pengguna Linux, membuat jaringan jembatan khusus dan mengonfigurasi aturan perutean secara manual adalah solusi yang tepat. Ini melibatkan penggunaan Dan perintah untuk merutekan lalu lintas dari jaringan kontainer ke antarmuka localhost host.
Pertanyaan Umum tentang Menghubungkan Kontainer Docker ke Layanan Host
- Bagaimana cara menggunakan opsi di Docker?
- Jalankan wadah Anda dengan untuk berbagi tumpukan jaringan host.
- Apa ?
- Ini adalah nama DNS khusus yang menentukan alamat IP host, tersedia di Docker untuk Windows dan Mac.
- Dapatkah saya menggunakan di Linux?
- Tidak, fitur ini tidak tersedia di Docker untuk Linux.
- Bagaimana cara membuat jaringan jembatan khusus?
- Menggunakan untuk membuat jaringan jembatan khusus.
- Apa tujuan dari memerintah?
- Ia mengelola pemfilteran paket jaringan dan aturan perutean pada sistem Linux.
- Bagaimana cara saya terhubung ke instance MySQL di host dari container Docker?
- Menggunakan untuk Docker di Windows/Mac atau konfigurasikan perutean untuk Linux.
- Apa batasan penggunaan ?
- Ini mungkin mengurangi portabilitas dan tidak kompatibel dengan beberapa orkestrator seperti Kubernetes.
- Bisakah saya mengakses layanan lain di host selain MySQL?
- Ya, dengan menggunakan metode yang sama, Anda dapat terhubung ke layanan apa pun yang berjalan di host.
Pemikiran Terakhir tentang Mengakses Layanan Host dari Docker
Menghubungkan ke instance MySQL di host dari container Nginx melibatkan berbagai metode, yang masing-masing memiliki kelebihan dan keterbatasannya sendiri. Menggunakan jaringan host, nama DNS khusus, atau jembatan jaringan khusus dapat menjembatani kesenjangan secara efektif, memastikan kelancaran komunikasi antara container Docker dan layanan host. Dengan memahami dan menerapkan strategi ini, Anda dapat mengatasi tantangan isolasi jaringan dan mempertahankan koneksi yang kuat di lingkungan Docker Anda.