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
- nasıl kullanırım --network host Docker'da seçenek?
- Konteynerinizi şununla çalıştırın: docker run --network host ana bilgisayarın ağ yığınını paylaşmak için.
- Nedir host.docker.internal?
- Bu, Windows ve Mac için Docker'da bulunan, ana bilgisayarın IP adresine çözümlenen özel bir DNS adıdır.
- Kullanabilirmiyim host.docker.internal Linux'ta mı?
- Hayır, bu özellik Linux için Docker'da mevcut değildir.
- Özel bir köprü ağını nasıl oluşturabilirim?
- Kullanmak docker network create --driver bridge my-bridge-network özel bir köprü ağı oluşturmak için.
- Amacı nedir? iptables emretmek?
- Linux sistemlerinde ağ paketi filtreleme ve yönlendirme kurallarını yönetir.
- Docker kapsayıcısından ana bilgisayardaki MySQL örneğine nasıl bağlanırım?
- 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.
- Kullanmanın sınırlamaları nelerdir? --network host?
- Taşınabilirliği azaltabilir ve Kubernetes gibi bazı orkestratörlerle uyumlu değildir.
- Ana makinedeki MySQL dışında diğer hizmetlere de erişebilir miyim?
- 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.