Docker의 Nginx를 호스트 시스템의 Localhost MySQL에 연결

Docker의 Nginx를 호스트 시스템의 Localhost MySQL에 연결
Shell

Docker 컨테이너에서 Localhost 서비스에 액세스

호스트 시스템의 MySQL 인스턴스에 연결해야 하는 동안 Docker 컨테이너 내에서 Nginx를 실행하는 것은 어려울 수 있으며, 특히 MySQL이 localhost에만 바인딩된 경우 더욱 그렇습니다. 이 설정은 컨테이너가 표준 네트워킹 방법을 사용하여 MySQL 서비스에 직접 액세스하는 것을 방지합니다.

이 기사에서는 이러한 격차를 해소하여 호스트의 로컬 호스트에서 실행되는 Docker 컨테이너와 서비스 간의 원활한 연결을 허용하는 다양한 솔루션을 살펴봅니다. 일반적인 방법이 부족한 이유를 논의하고 원하는 연결을 달성하기 위한 실용적인 단계를 제공합니다.

명령 설명
docker network create --driver bridge hostnetwork 컨테이너가 동일한 네트워크 내에서 통신할 수 있도록 브리지 드라이버를 사용하여 사용자 지정 Docker 네트워크를 만듭니다.
host_ip=$(ip -4 addr show docker0 | grep -oP '(? 컨테이너에서 호스트 서비스로 연결하는 데 사용되는 호스트 docker0 인터페이스의 IP 주소를 추출합니다.
docker exec -it nginx-container bash 직접적인 명령줄 액세스를 위해 실행 중인 Nginx 컨테이너 내에서 대화형 bash 셸을 실행합니다.
mysql -h $host_ip -u root -p 추출된 IP 주소를 사용하여 호스트 시스템에서 실행 중인 MySQL 서버에 연결하기 위해 Nginx 컨테이너 내부에서 사용되는 명령입니다.
networks: hostnetwork: external: true 외부에서 생성된 Docker 네트워크를 사용하도록 Docker Compose를 구성합니다.
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 요청을 호스트 시스템에 프록시하기 위해 새로운 Nginx 구성을 작성합니다.
nginx -s reload 새로운 구성 변경 사항을 적용하기 위해 Nginx 서비스를 다시 로드합니다.

호스트 서비스에 액세스하도록 Docker 및 Nginx 구성

Nginx 컨테이너를 호스트에서 실행 중인 MySQL 인스턴스에 연결하려면 먼저 네트워크 브리지를 설정해야 합니다. 명령 docker network create --driver bridge hostnetwork 이 커스텀 네트워크를 생성하여 동일한 네트워크에 있는 컨테이너 간의 통신을 가능하게 합니다. 그런 다음 다음을 사용하여 이 네트워크에서 MySQL 및 Nginx 컨테이너를 시작합니다. docker run --name mysql-container --network hostnetwork -e MYSQL_ROOT_PASSWORD=root -d mysql:latest 그리고 docker run --name nginx-container --network hostnetwork -d nginx:latest, 각각. 이 설정을 통해 컨테이너는 서로를 검색하고 통신할 수 있습니다. Nginx에서 MySQL에 연결하려면 호스트의 IP 주소가 필요합니다. . 이 명령은 호스트에 있는 docker0 인터페이스의 IP 주소를 캡처합니다.

다음으로 우리는 docker exec -it nginx-container bash Nginx 컨테이너에서 대화형 셸을 엽니다. 여기에서 다음을 사용하여 MySQL 연결을 시작할 수 있습니다. mysql -h $host_ip -u root -p, 어디 $host_ip 호스트의 IP 주소입니다. 또는 Docker Compose를 사용하면 YAML 파일에 서비스와 네트워크를 정의하여 프로세스가 단순화됩니다. 그만큼 networks: hostnetwork: external: true 구성을 통해 서비스는 외부에서 생성된 네트워크를 사용합니다. 마지막으로 MySQL 요청을 프록시하도록 Nginx를 구성하기 위해 구성 파일을 다음과 같이 업데이트합니다. echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf 다음을 사용하여 Nginx를 다시 로드합니다. nginx -s reload. 이 설정을 통해 Nginx는 호스트에서 실행 중인 MySQL 인스턴스로 요청을 전달할 수 있습니다.

네트워크 브리지를 통해 Docker 컨테이너를 호스트의 MySQL에 연결

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

Docker Compose를 사용하여 Nginx와 호스트의 MySQL 연결

Docker Compose 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

Docker 네트워크를 사용하여 호스트 MySQL에 연결하도록 Nginx 구성

Nginx 구성 및 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

Docker 컨테이너를 호스트 로컬 서비스에 연결

Docker 컨테이너에서 애플리케이션을 실행할 때 호스트의 로컬 호스트에 바인딩된 서비스에 액세스하는 것은 네트워크 격리로 인해 어려울 수 있습니다. 효과적인 접근 방식 중 하나는 Docker의 호스트 네트워킹 모드를 사용하는 것입니다. 컨테이너를 시작하여 --network host 옵션을 사용하면 컨테이너는 호스트의 네트워크 스택을 공유하여 로컬 호스트 바인딩 서비스에 직접 액세스할 수 있습니다. 그러나 이 모드는 이식성이 떨어지며 Docker Swarm 또는 Kubernetes와 같은 모든 환경에서 제대로 작동하지 않을 수 있습니다.

또 다른 접근 방식은 Docker에 내장된 DNS 확인자를 사용하는 것입니다. host.docker.internal. 이 특수 DNS 이름은 호스트의 IP 주소로 확인되어 컨테이너가 호스트의 서비스와 통신할 수 있게 해줍니다. 이 방법은 간단하며 네트워크 관리의 복잡성을 방지합니다. 그러나 Linux에서는 사용할 수 없고 Windows 및 Mac용 Docker에서만 사용할 수 있습니다. Linux 사용자의 경우 사용자 지정 브리지 네트워크를 만들고 라우팅 규칙을 수동으로 구성하는 것이 실행 가능한 솔루션입니다. 여기에는 ip 그리고 iptables 컨테이너 네트워크에서 호스트의 localhost 인터페이스로 트래픽을 라우팅하는 명령입니다.

Docker 컨테이너를 호스트 서비스에 연결하는 방법에 대한 일반적인 질문

  1. 어떻게 사용하나요? --network host Docker의 옵션?
  2. 다음을 사용하여 컨테이너를 실행하세요. docker run --network host 호스트의 네트워크 스택을 공유합니다.
  3. 무엇인가요 host.docker.internal?
  4. Windows 및 Mac용 Docker에서 사용할 수 있는 호스트의 IP 주소로 확인되는 특수 DNS 이름입니다.
  5. 사용해도 되나요 host.docker.internal 리눅스에서?
  6. 아니요, 이 기능은 Linux용 Docker에서는 사용할 수 없습니다.
  7. 맞춤형 브리지 네트워크를 생성하려면 어떻게 해야 합니까?
  8. 사용 docker network create --driver bridge my-bridge-network 사용자 정의 브리지 네트워크를 생성합니다.
  9. 의 목적은 무엇입니까? iptables 명령?
  10. Linux 시스템에서 네트워크 패킷 필터링 및 라우팅 규칙을 관리합니다.
  11. Docker 컨테이너에서 호스트의 MySQL 인스턴스에 어떻게 연결합니까?
  12. 사용 mysql -h host.docker.internal -u root -p Windows/Mac의 Docker용 또는 Linux용 라우팅을 구성합니다.
  13. 사용의 제한은 무엇입니까 --network host?
  14. 이식성이 저하될 수 있으며 Kubernetes와 같은 일부 오케스트레이터와 호환되지 않습니다.
  15. MySQL 외에 호스트의 다른 서비스에 액세스할 수 있나요?
  16. 예, 동일한 방법을 사용하여 호스트에서 실행되는 모든 서비스에 연결할 수 있습니다.

Docker에서 호스트 서비스 액세스에 대한 최종 생각

Nginx 컨테이너에서 호스트의 MySQL 인스턴스에 연결하려면 다양한 방법이 필요하며 각각 고유한 이점과 제한 사항이 있습니다. 호스트 네트워킹, 특수 DNS 이름 또는 사용자 정의 네트워크 브리지를 사용하면 간격을 효과적으로 메워 Docker 컨테이너와 호스트 서비스 간의 원활한 통신을 보장할 수 있습니다. 이러한 전략을 이해하고 구현하면 네트워크 격리 문제를 극복하고 Dockerized 환경에서 강력한 연결을 유지할 수 있습니다.