Docker'daki Nginx'i Ana Makinedeki Localhost MySQL'e Bağlama

Docker'daki Nginx'i Ana Makinedeki Localhost MySQL'e Bağlama
Shell

Localhost Hizmetlerine Docker Konteynerlerinden Erişmek

Ana makinedeki bir MySQL örneğine bağlanmaya ihtiyaç duyulurken Nginx'i bir Docker kapsayıcısı içinde çalıştırmak, özellikle MySQL yalnızca localhost'a bağlı olduğunda zorlayıcı olabilir. Bu kurulum, konteynerin standart ağ oluşturma yöntemlerini kullanarak doğrudan MySQL hizmetine erişmesini engeller.

Bu makalede, Docker kapsayıcıları ile ana bilgisayarın yerel ana bilgisayarında çalışan hizmetler arasında kesintisiz bağlantıya olanak tanıyarak bu boşluğu doldurmaya yönelik çeşitli çözümler araştırılmaktadır. Yaygın yöntemlerin neden yetersiz kalabileceğini tartışacağız ve istenen bağlantıya ulaşmak için pratik adımlar sunacağız.

Emretmek Tanım
docker network create --driver bridge hostnetwork Köprü sürücüsüyle özel bir Docker ağı oluşturarak konteynerlerin aynı ağ içinde iletişim kurmasına olanak tanır.
host_ip=$(ip -4 addr show docker0 | grep -oP '(? Konteynerden ana bilgisayar hizmetlerine bağlanmak için kullanılan ana bilgisayarın docker0 arayüzünün IP adresini çıkarır.
docker exec -it nginx-container bash Doğrudan komut satırı erişimi için çalışan Nginx kapsayıcısının içinde etkileşimli bir bash kabuğu yürütür.
mysql -h $host_ip -u root -p Çıkarılan IP adresini kullanarak ana makinede çalışan MySQL sunucusuna bağlanmak için Nginx kapsayıcısının içinde kullanılan komut.
networks: hostnetwork: external: true Harici olarak oluşturulmuş bir Docker ağını kullanmak için Docker Compose'da yapılandırma.
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 MySQL isteklerini ana makineye proxy olarak göndermek için yeni bir Nginx yapılandırması yazar.
nginx -s reload Yeni yapılandırma değişikliklerini uygulamak için Nginx hizmetini yeniden yükler.

Docker ve Nginx'i Ana Bilgisayar Hizmetlerine Erişecek Şekilde Yapılandırma

Bir Nginx kapsayıcısını ana makinede çalışan bir MySQL örneğine bağlamak için öncelikle bir ağ köprüsü kurmamız gerekir. Komuta docker network create --driver bridge hostnetwork bu özel ağı oluşturarak aynı ağdaki konteynerler arasında iletişimi sağlar. Daha sonra bu ağda MySQL ve Nginx konteynerlerini kullanarak başlatıyoruz. docker run --name mysql-container --network hostnetwork -e MYSQL_ROOT_PASSWORD=root -d mysql:latest Ve docker run --name nginx-container --network hostnetwork -d nginx:latest, sırasıyla. Bu kurulum, konteynerlerin birbirlerini keşfetmesine ve iletişim kurmasına olanak tanır. Nginx'ten MySQL'e bağlanmak için ana bilgisayarın IP adresine ihtiyacımız var. host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'). Bu komut, ana bilgisayardaki docker0 arayüzünün IP adresini yakalar.

Daha sonra kullanıyoruz docker exec -it nginx-container bash Nginx kapsayıcısında etkileşimli bir kabuk açmak için. Buradan MySQL bağlantısını kullanarak başlatabiliriz. mysql -h $host_ip -u root -p, Neresi $host_ip ana bilgisayarın IP adresidir. Alternatif olarak Docker Compose'un kullanılması, hizmetleri ve ağları bir YAML dosyasında tanımlayarak süreci basitleştirir. networks: hostnetwork: external: true yapılandırma, hizmetlerin harici olarak oluşturulan bir ağı kullanmasını sağlar. Son olarak, Nginx'i MySQL isteklerine proxy yapacak şekilde yapılandırmak için yapılandırma dosyasını şu şekilde güncelliyoruz: echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf ve kullanarak Nginx'i yeniden yükleyin nginx -s reload. Bu kurulum, Nginx'in istekleri ana makinede çalışan MySQL örneğine iletmesine olanak tanır.

Docker Container'ı Ağ Köprüsü Aracılığıyla Ana Bilgisayarın MySQL'ine Bağlama

Docker Ağ Kurulumu için Kabuk Komut Dosyası

# 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

Nginx ve Host'un MySQL'ini Bağlamak için Docker Compose'u Kullanma

Docker YAML Yapılandırmasını Oluştur

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

Docker Ağını Kullanarak Nginx'i Ana MySQL'e Bağlanacak Şekilde Yapılandırma

Nginx Yapılandırması ve Docker Ağ Komutu

# 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

Docker Konteynerlerini Yerel Hizmetleri Barındırmaya Bağlama

Uygulamaları Docker kapsayıcılarında çalıştırırken, ana bilgisayarın yerel ana bilgisayarına bağlı hizmetlere erişim, ağ izolasyonu nedeniyle zorlayıcı olabilir. Etkili bir yaklaşım Docker'ın ana bilgisayar ağ modunu kullanmaktır. İle bir konteyner başlatarak --network host seçeneğinde, konteyner ana bilgisayarın ağ yığınını paylaşarak yerel ana bilgisayara bağlı hizmetlere doğrudan erişmesine olanak tanır. Ancak bu mod daha az taşınabilirdir ve Docker Swarm veya Kubernetes gibi tüm ortamlarda iyi çalışmayabilir.

Diğer bir yaklaşım ise Docker'ın yerleşik DNS çözümleyicisini kullanmaktır. host.docker.internal. Bu özel DNS adı, ana bilgisayarın IP adresine çözümlenerek kapsayıcıların ana bilgisayardaki hizmetlerle iletişim kurmasını sağlar. Bu yöntem basittir ve ağ yönetiminin karmaşıklığını ortadan kaldırır. Ancak yalnızca Windows ve Mac için Docker'da mevcuttur, Linux'ta mevcut değildir. Linux kullanıcıları için özel bir köprü ağı oluşturmak ve yönlendirme kurallarını manuel olarak yapılandırmak uygun bir çözümdür. Bu, aşağıdakilerin kullanılmasını içerir: ip Ve iptables Trafiği konteyner ağından ana bilgisayarın localhost arayüzüne yönlendirmek için komutlar.

Docker Konteynerlerini Ana Bilgisayar Hizmetlerine Bağlama Hakkında Sık Sorulan Sorular

  1. nasıl kullanırım --network host Docker'da seçenek?
  2. Konteynerinizi şununla çalıştırın: docker run --network host ana bilgisayarın ağ yığınını paylaşmak için.
  3. Nedir host.docker.internal?
  4. Bu, Windows ve Mac için Docker'da bulunan, ana bilgisayarın IP adresine çözümlenen özel bir DNS adıdır.
  5. Kullanabilirmiyim host.docker.internal Linux'ta mı?
  6. Hayır, bu özellik Linux için Docker'da mevcut değildir.
  7. Özel bir köprü ağını nasıl oluşturabilirim?
  8. Kullanmak docker network create --driver bridge my-bridge-network özel bir köprü ağı oluşturmak için.
  9. Amacı nedir? iptables emretmek?
  10. Linux sistemlerinde ağ paketi filtreleme ve yönlendirme kurallarını yönetir.
  11. Docker kapsayıcısından ana bilgisayardaki MySQL örneğine nasıl bağlanırım?
  12. Kullanmak mysql -h host.docker.internal -u root -p Windows/Mac'te Docker için veya Linux için yönlendirmeyi yapılandırın.
  13. Kullanmanın sınırlamaları nelerdir? --network host?
  14. Taşınabilirliği azaltabilir ve Kubernetes gibi bazı orkestratörlerle uyumlu değildir.
  15. Ana makinedeki MySQL dışında diğer hizmetlere de erişebilir miyim?
  16. Evet, aynı yöntemleri kullanarak ana makinede çalışan herhangi bir hizmete bağlanabilirsiniz.

Docker'dan Ana Bilgisayar Hizmetlerine Erişim Hakkında Son Düşünceler

Ana bilgisayardaki bir MySQL örneğine bir Nginx kapsayıcısından bağlanmak, her birinin kendi yararları ve sınırlamaları olan çeşitli yöntemler içerir. Ana bilgisayar ağını, özel DNS adlarını veya özel ağ köprülerini kullanmak, boşluğu etkili bir şekilde kapatabilir ve Docker konteynerleri ile ana bilgisayar hizmetleri arasında sorunsuz iletişim sağlar. Bu stratejileri anlayıp uygulayarak, ağ izolasyonu zorluklarının üstesinden gelebilir ve Dockerlı ortamınızda güçlü bağlantıları koruyabilirsiniz.