Menghubungkan Nginx di Docker ke Localhost MySQL di Mesin Host

Menghubungkan Nginx di Docker ke Localhost MySQL di Mesin Host
Shell

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 docker network create --driver bridge hostnetwork membuat jaringan khusus ini, memungkinkan komunikasi antar kontainer di jaringan yang sama. Kami kemudian memulai container MySQL dan Nginx di jaringan 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. 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 docker exec -it nginx-container bash untuk membuka shell interaktif di wadah Nginx. Dari sini, kita dapat memulai koneksi MySQL menggunakan mysql -h $host_ip -u root -p, Di mana $host_ip 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 echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf dan muat ulang Nginx menggunakan nginx -s reload. 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 --network host 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, host.docker.internal. 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 ip Dan iptables perintah untuk merutekan lalu lintas dari jaringan kontainer ke antarmuka localhost host.

Pertanyaan Umum tentang Menghubungkan Kontainer Docker ke Layanan Host

  1. Bagaimana cara menggunakan --network host opsi di Docker?
  2. Jalankan wadah Anda dengan docker run --network host untuk berbagi tumpukan jaringan host.
  3. Apa host.docker.internal?
  4. Ini adalah nama DNS khusus yang menentukan alamat IP host, tersedia di Docker untuk Windows dan Mac.
  5. Dapatkah saya menggunakan host.docker.internal di Linux?
  6. Tidak, fitur ini tidak tersedia di Docker untuk Linux.
  7. Bagaimana cara membuat jaringan jembatan khusus?
  8. Menggunakan docker network create --driver bridge my-bridge-network untuk membuat jaringan jembatan khusus.
  9. Apa tujuan dari iptables memerintah?
  10. Ia mengelola pemfilteran paket jaringan dan aturan perutean pada sistem Linux.
  11. Bagaimana cara saya terhubung ke instance MySQL di host dari container Docker?
  12. Menggunakan mysql -h host.docker.internal -u root -p untuk Docker di Windows/Mac atau konfigurasikan perutean untuk Linux.
  13. Apa batasan penggunaan --network host?
  14. Ini mungkin mengurangi portabilitas dan tidak kompatibel dengan beberapa orkestrator seperti Kubernetes.
  15. Bisakah saya mengakses layanan lain di host selain MySQL?
  16. 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.