Docker 네트워킹 – 컨테이너가 서로 통신하는 방법 탐색



컨테이너 네트워크 모델에 대한 이해와 실습으로 구현하여 Docker 네트워킹 기능에 대해 모두 알아보세요.

오늘날 기업은 컨테이너 아키텍처를 적절하게 구성하기 위해 강력한 네트워킹 기술이 필요한 컨테이너화에 열광하고 있으며, 이에 따라 Docker 네트워킹 개념이 도입되었습니다.

예제와 함께 pl SQL 자습서

Docker Networking에 대한이 블로그에서는 다음 주제를 다룹니다.





Docker 란?

Docker를 이해하려면 이전에 애플리케이션이 배포 된 방식과 지금 컨테이너를 사용하여 애플리케이션이 배포되는 방식에 대한 기록을 알아야합니다.

기존 방식과 새로운 방식으로 애플리케이션 배포-Docker Networking-Edureka



위의 다이어그램에서 볼 수 있듯이 이전 방식은 호스트에 애플리케이션이있었습니다.따라서 n 개의 애플리케이션이 해당 운영 체제에있는 라이브러리를 공유합니다.그러나 컨테이너화를 통해 운영 체제는 모든 애플리케이션간에 공통적 인 유일한 커널을 갖게됩니다.따라서 응용 프로그램은 서로의 라이브러리에 액세스 할 수 없습니다.

그래서, Docker 간단히 말해서 응용 프로그램을 개발, 제공 및 실행하기위한 개방형 플랫폼으로, 사용자는 다음의 도움을 받아 인프라에서 응용 프로그램을 분리 할 수 ​​있습니다. 용기 소프트웨어를 신속하게 제공합니다.

그렇다면 이러한 컨테이너는 다양한 상황에서 어떻게 서로 통신합니까?



음, Docker 네트워킹을 통해 제공됩니다.

Docker 네트워킹

Docker Networking에 대해 자세히 알아보기 전에 Docker의 워크 플로를 보여 드리겠습니다.

위의 다이어그램에서 볼 수 있듯이. 개발자는 쓰기 쉬운 Docker 파일에 애플리케이션 요구 사항 또는 종속성을 규정하는 코드를 작성하고이 Docker 파일은 Docker 이미지를 생성합니다. 따라서 특정 애플리케이션에 필요한 모든 종속성이이 이미지에 있습니다.

이제 Docker 컨테이너는 Docker Image의 런타임 인스턴스에 불과합니다. 이러한 이미지는 공용 / 개인 저장소가 포함 된 Docker Hub (Docker 이미지 용 Git 저장소)에 업로드됩니다.

따라서 공용 리포지토리에서 이미지를 가져올 수도 있고 Docker Hub에 자신의 이미지를 업로드 할 수 있습니다. 그런 다음 Docker Hub에서 품질 보증 또는 프로덕션 팀과 같은 다양한 팀이 해당 이미지를 가져와 자체 컨테이너를 준비합니다. 이러한 개별 컨테이너는 필요한 작업을 수행하기 위해 네트워크를 통해 서로 통신하며 이는 Docker 네트워킹에 불과합니다.

따라서 Docker 네트워킹을 모든 격리 된 컨테이너가 다양한 상황에서 서로 통신하여 필요한 작업을 수행하는 통신 통로로 정의 할 수 있습니다.

Docker Networking의 목표는 무엇이라고 생각하십니까?

Docker 네트워킹의 목표

적응성 – Docker는 다양한 플랫폼의 여러 애플리케이션이 서로 통신 할 수 있도록하여 유연성을 제공합니다.

교차 플랫폼 – Docker는 Docker Swarm 클러스터의 도움으로 다양한 서버에서 작동하는 크로스 플랫폼에서 쉽게 사용할 수 있습니다.

확장 성 – Docker는 성능을 보장하면서 애플리케이션을 개별적으로 확장 및 확장 할 수있는 완전 분산 네트워크입니다.

탈 중앙화 – Docker는 분산 형 네트워크를 사용하므로 애플리케이션을 분산하고 고 가용성을 유지할 수 있습니다. 컨테이너 또는 호스트가 리소스 풀에서 갑자기 누락 된 경우 추가 리소스를 가져 오거나 여전히 사용 가능한 서비스로 전달할 수 있습니다.

사용자 – 친화적 – Docker를 사용하면 서비스 배포를 쉽게 자동화하여 일상 생활에서 쉽게 사용할 수 있습니다.

지원하다 – Docker는 기본 지원을 제공합니다. 따라서 Docker Enterprise Edition을 사용하고 모든 기능을 매우 쉽고 간단하게 얻을 수있는 능력은 Docker 플랫폼을 매우 쉽게 사용할 수 있도록합니다.

위의 목표를 달성하려면 컨테이너 네트워크 모델이라는 것이 필요합니다.

다양한 DevOps 단계를 탐색하고 싶으십니까?

컨테이너 네트워크 모델 (CNM)

컨테이너 네트워크 모델이 정확히 무엇인지 말하기 전에 CNM을 이해하기 전에 필요한 Libnetwork에 대해 간략히 설명하겠습니다.

Libnetwork는 CNM을 구성하는 모든 핵심 개념을 구현하는 오픈 소스 Docker 라이브러리입니다.

그래서, 컨테이너 네트워크 모델 (CNM) 여러 네트워크 드라이버를 사용하는 컨테이너에 네트워킹을 제공하는 데 필요한 단계를 표준화합니다. CNM은 네트워크 구성을 저장하기 위해 콘솔과 같은 분산 키-값 저장소가 필요합니다.

CNM에는 IPAM 플러그인 및 네트워크 플러그인을위한 인터페이스가 있습니다.

IPAM 플러그인 API는 주소 풀을 생성 / 삭제하고 컨테이너 IP 주소를 할당 / 해제하는 데 사용되는 반면, 네트워크 플러그인 API는 네트워크를 생성 / 삭제하고 네트워크에서 컨테이너를 추가 / 제거하는 데 사용됩니다.

CNM은 주로 네트워크 컨트롤러, 드라이버, 네트워크, 엔드 포인트 및 샌드 박스의 5 개 개체를 기반으로합니다.

컨테이너 네트워크 모델 개체

네트워크 컨트롤러 : 네트워크를 할당하고 관리하기 위해 Docker Engine에 대한 간단한 API를 노출하는 Libnetwork에 대한 진입 점을 제공합니다. Libnetwork는 여러 내장 및 원격 드라이버를 지원하므로 Network Controller를 사용하면 사용자가 특정 드라이버를 주어진 네트워크에 연결할 수 있습니다.

운전사: 네트워크를 소유하고 다양한 사용 사례 및 배포 시나리오를 충족하기 위해 여러 드라이버가 참여하도록하여 네트워크 관리를 담당합니다.

회로망: 동일한 네트워크에 속하고 나머지와 격리 된 엔드 포인트 그룹 간의 연결을 제공합니다. 따라서 네트워크가 생성되거나 업데이트 될 때마다 해당 드라이버에게 이벤트 알림이 전송됩니다.

끝점 : 네트워크의 컨테이너가 제공하는 서비스와 네트워크의 다른 컨테이너가 제공하는 다른 서비스에 대한 연결을 제공합니다. 엔드 포인트는 서비스를 나타내며 반드시 특정 컨테이너는 아닙니다. 엔드 포인트는 클러스터 내에서도 전역 범위를 갖습니다.

모래 상자: 사용자가 네트워크에서 엔드 포인트 생성을 요청할 때 생성됩니다. 샌드 박스에는 IP 주소, MAC 주소, 경로, DNS와 같은 컨테이너의 네트워크 구성을 나타내는 여러 네트워크에 연결된 여러 엔드 포인트가있을 수 있습니다.

그래서 CNM의 5 대 주요 대상이었습니다.

이제 Docker 네트워킹과 관련된 다양한 네트워크 드라이버에 대해 설명하겠습니다.

DevOps 학습을 한 단계 더 높이고 싶으십니까?

네트워크 드라이버

주로 5 개의 네트워크 드라이버가 있습니다 : Bridge, Host, None, Overlay, Macvlan

다리: 브리지 네트워크는 호스트의 Docker에 의해 생성 된 사설 기본 내부 네트워크입니다. 따라서 모든 컨테이너는 내부 IP 주소를 가지며 이러한 컨테이너는이 내부 IP를 사용하여 서로 액세스 할 수 있습니다. Bridge 네트워크는 일반적으로 애플리케이션이 통신해야하는 독립 실행 형 컨테이너에서 실행될 때 사용됩니다.

주최자 :이 드라이버는 Docker 호스트와 Docker 컨테이너 간의 네트워크 격리를 제거하여 호스트의 네트워킹을 직접 사용합니다. 따라서이 포트는 이제 호스트 네트워크의 모든 컨테이너에 공통되는 포트이므로 동일한 호스트에서 여러 웹 컨테이너를 실행할 수 없습니다.

없음 : 이러한 종류의 네트워크에서 컨테이너는 네트워크에 연결되지 않으며 외부 네트워크 또는 기타 컨테이너에 대한 액세스 권한이 없습니다. 따라서이 네트워크는컨테이너에서 네트워킹 스택을 완전히 비활성화하려는 경우루프백 장치 만 만듭니다.

위에 까는 것 : 스웜 클러스터에 참여하는 모든 노드에 걸쳐있는 내부 사설 네트워크를 생성합니다. 따라서 오버레이 네트워크는 스웜 서비스와 독립형 컨테이너 간 또는 서로 다른 Docker 데몬에있는 두 개의 독립형 컨테이너 간의 통신을 용이하게합니다.

Macvlan : MAC 주소를 컨테이너에 할당하여 네트워크에서 물리적 장치로 표시 할 수 있습니다. 그런 다음 Docker 데몬은 MAC 주소별로 트래픽을 컨테이너로 라우팅합니다. Macvlan 드라이버는 Docker 호스트의 네트워크 스택을 통해 라우팅되지 않고 물리적 네트워크에 직접 연결될 것으로 예상되는 경우 최상의 선택입니다.

자, 이것이 Docker 네트워킹을 이해하는 데 필요한 모든 이론이었습니다. 이제 계속해서 네트워크가 생성되고 컨테이너가 서로 통신하는 방법을 실제로 보여 드리겠습니다.

실습

따라서 여러분 모두가 시스템에 Docker를 설치했다고 가정하고 보여줄 시나리오가 있습니다.

웹 애플리케이션이 필요한 코스 이름과 코스 ID를 저장한다고 가정합니다. 기본적으로 웹 애플리케이션 용 컨테이너가 하나 필요하고 백엔드 용 MySQL로 컨테이너가 하나 더 필요합니다. 해당 MySQL 컨테이너는 웹 애플리케이션 컨테이너에 연결되어야합니다.

위에서 언급 한 예제를 실제로 실행하는 것은 어떻습니까?

관련 단계 :

  • Docker Swarm을 초기화하여 Swarm 클러스터를 형성합니다.
  • 오버레이 네트워크 만들기
  • 웹 애플리케이션과 MySQL 모두를위한 서비스 생성
  • 네트워크를 통해 애플리케이션 연결

시작하자!

1 단계: 머신에서 Docker Swarm을 초기화합니다.

docker swarm init --advertise-addr 192.168.56.101

–advertise-addr 플래그는 주소를 192.168.56.101로 게시하도록 관리자 노드를 구성합니다. 스웜의 다른 노드는 IP 주소에서 관리자에 액세스 할 수 있어야합니다.

2 단계: 이제이 관리자 노드를 작업자 노드에 조인하려면 작업자 노드에서 스웜을 초기화 할 때 얻은 링크를 복사하십시오.
3 단계 : 오버레이 네트워크를 만듭니다.

도커 네트워크 생성 -d 오버레이 myoverlaynetwork

myoverlay는 네트워크 이름이고 -d는 Docker Daemon이 백그라운드에서 실행되도록합니다.

4.1 단계 : 서비스 webapp1을 생성하고 생성 한 네트워크를 사용하여이 서비스를 swarm 클러스터에 배포합니다.

docker service create --name webapp1 -d --network myoverlaynetwork -p 8001 : 80 hshar / webapp

어디 -p포트 포워딩을위한 것입니다.hsharDocker Hub의 계정 이름이고 webapp은 Docker Hub에 이미있는 웹 애플리케이션의 이름입니다.

4.2 단계 : 이제 서비스가 생성되었는지 확인하십시오.

도커 서비스 ls

5.1 단계 : 이제 서비스 MySQL을 생성하고 생성 한 네트워크를 사용하여 swarm 클러스터에 서비스를 배포합니다.

docker service create --name mysql -d --network myoverlaynetwork -p 3306 : 3306 hshar / mysql : 5.5


5.2 단계 : 이제 서비스가 생성되었는지 확인하십시오.

도커 서비스 ls

6.1 단계 : 그런 다음 마스터 노드에서 실행중인 컨테이너를 확인하고 hshar / webapp 컨테이너로 이동합니다.

도커 PS

6.2 단계 : 따라서 webapp 서비스 만 관리자 노드에 있음을 알 수 있습니다. 따라서 webapp 컨테이너로 이동하십시오.

docker exec -it container_id bash nano var / www / html / index.php

docker ps 명령은 각 컨테이너 ID와 함께 두 컨테이너를 모두 나열합니다. 두 번째 명령은 해당 컨테이너를 대화 형 모드로 활성화합니다.

7 단계 : 이제 $ servername을 localhost에서 mysql로, $ password를 '' '에서'edureka '로 변경하고 필요한 데이터베이스 세부 정보를 모두 채우고 키보드 단축키 Ctrl + x를 사용하여 index.php 파일을 저장 한 후 y를 저장하고 Enter를 누르십시오.

8 단계 : 이제 다른 노드에서 실행중인 mysql 컨테이너로 이동합니다.

docker exec -it container_id bash

9 단계 : mysql 컨테이너에 들어가면 아래 명령을 입력하여 MySQL에서 데이터베이스를 사용합니다.

9.1 단계 : mysql 컨테이너를 사용할 수있는 액세스 권한을 얻습니다.

mysql -u root -pedureka

여기서 -u는 사용자를 나타내고 -p는 시스템의 암호입니다.

9.2 단계 : webapp1에서 데이터를 가져 오는 데 사용할 mysql에 데이터베이스를 만듭니다.

데이터베이스 실습 생성

9.3 단계 : 생성 된 데이터베이스를 사용합니다.

HandsOn 사용

단계 9.4 : webapp1에서 데이터를 가져 오는 데 사용할이 데이터베이스에 테이블을 만듭니다.

CREATE TABLE course_details (course_name VARCHAR (10), course_id VARCHAR (11))

단계 9.5 : 이제 명령을 사용하여 MySQL과 컨테이너도 종료하십시오. 출구 .

10 단계 : 브라우저로 이동하여 주소를 다음과 같이 입력하십시오. localhost : 8001 / index.php . 웹 애플리케이션이 열립니다. 이제 코스의 세부 정보를 입력하고 쿼리 제출 .

11 단계 : 쿼리 제출을 클릭하면 MySQL 서비스가 실행중인 노드로 이동 한 다음 컨테이너 내부로 이동합니다.

docker exec -it container_id bash mysql -u root -pedureka USE HandsOn SHOW tables select * from course_details

세부 정보를 입력 한 모든 과정의 출력이 표시됩니다.

여기에서 Docker Networking 블로그를 종료합니다. 이 게시물을 즐기 셨기를 바랍니다. 당신은 확인할 수 있습니다 다른 블로그 이 시리즈에서도 Docker의 기본 사항을 다룹니다.

이 Docker Container 블로그와 관련이있는 경우 전 세계에 450,000 명 이상의 만족 한 학습자 네트워크를 보유한 신뢰할 수있는 온라인 학습 회사 인 Edureka가 작성했습니다. Edureka DevOps 인증 교육 과정은 학습자가 SDLC의 여러 단계를 자동화하기 위해 Puppet, Jenkins, Docker, Nagios, Ansible 및 GIT와 같은 다양한 DevOps 프로세스 및 도구에 대한 전문 지식을 습득하는 데 도움이됩니다.

DevOps에서 인증을 찾고 계십니까?

질문이 있으십니까? 댓글 섹션에 언급 해 주시면 다시 연락 드리겠습니다.