[LG CNS AM Inspire Camp 1기] Docker (6) - Docker Network

정성엽·7일 전
1

LG CNS AM Inspire 1기

목록 보기
52/53
post-thumbnail

INTRO

이전 포스팅에서 wordpress와 MySQL DB를 Bind mount하는 예제를 살펴봤었다.

그 과정에서 --link 옵션을 사용하여 MySQL 컨테이너와 wordpress 컨테이너를 연결했는데, 실제로는 docker network 기능을 사용하여 연결하는 것이 더 적절하다고 한다.

따라서, 이번 포스팅에서는 Docker Network 관련 내용을 한번 정리해보자 👀


1. Docker Network 드라이버 이해하기

도커를 처음 배우다 보면 네트워크 개념이 조금 헷갈릴 수 있다.

왜냐하면, VirtualBox에서 말하는 브릿지와 도커의 브릿지는 전혀 다른 개념이기 때문이다.

VirtualBox에서 브릿지라고 하면 호스트와 동일한 네트워크를 사용할 수 있는 것을 의미한다.

반면 NAT는 호스트와 다른 IP 대역을 사용하는 로컬 네트워크를 의미한다.

그런데 Docker에서 bridge 드라이버는 오히려 VirtualBox의 NAT와 비슷한 개념으로 동작한다.

즉, bridge 드라이버는 도커 컨테이너가 기본적으로 연결되는 서브 네트워크를 의미하며, 내부 IP 주소를 할당받고 컨테이너 간 통신을 지원하는 네트워크인 것이다!

💡 Docker network 확인

Docker network를 확인해보면 다음과 같은 모습을 볼 수 있다.

Result View

보다시피 bridge, host, null 등을 확인할 수 있다.

여기서 각 네트워크 드라이버의 특징을 정리해보면 다음과 같다.

네트워크 드라이버 정리

  • bridge: 기본 네트워크 드라이버로, 대부분의 컨테이너가 사용한다.
  • host: 호스트의 네트워크 스택을 직접 사용한다.
  • none: 네트워크를 완전히 격리하는 드라이버이다.

여기서 host는 호스트의 네트워크 스택을 직접 사용한다고 정리했는데, 이 내용을 조금 더 자세히 설명하면 다음과 같다.

💡 Host Network 드라이버 이해하기

bridge 네트워크가 컨테이너를 위한 별도의 네트워크 공간을 만든다면, host 네트워크는 컨테이너가 호스트의 네트워크를 직접 사용하게 하는 것이다.

Sample Code
docker run --network host nginx


--network : 네트워크 연결 드라이버를 지정하는 옵션이다.

이렇게 nginx를 host 방식으로실행하면 어떻게 될까?

호스트의 네트워크 인터페이스를 직접 사용하기 때문에 포트 매핑(-p) 옵션이 필요없게 된다.

예를 들어 nginx의 기본 포트인 80을 사용한다면, 별도의 포트 매핑 없이 바로 호스트의 80 포트로 접근할 수 있는 것이다.

하지만 여기서 주의할 점이 있다

host network driver는 호스트의 포트를 직접 사용하므로 포트 충돌이 발생할 수 있다.

또한, 보안상 호스트의 모든 네트워크 기능에 접근할 수 있다는 특징이 있다!

따라서, 실제로 host 네트워크는 특별한 경우에만 사용하는 것이 좋다는 것을 기억하자!
(네트워크 성능이 중요한 경우, 호스트의 네트워크 기능을 모두 사용해야 하는 경우 등등...)


2. Bridge 네트워크 살펴보기

아마도 우리가 자주 사용할 Bridge 네트워크 드라이버를 인스펙션 해보자

◉ 커맨드 - Bridge 네트워크 인스펙션
docker network inspect bridge


Result View

필자의 노트북 IP를 확인해보면 192.168.35.xxx를 사용하고 있다.

반면, Brdige 네트워크를 인스펙션해보면 172.17.0.0의 네트워크 대역폭을 사용하고 있는 모습을 볼 수 있다.

즉, 완전히 다른 네트워크 대역을 사용하고 있는 것이다.

(동일한 대역폭에 있는 네트워크를 LAN(Local Area Network)라고 하며, 서로 다른 대역폭에 있는 서로 다른 네트워크를 연결한 망을 WAN(Wide Area Network)라고 한다.)

이는 도커가 의도적으로 만든 서브 네트워크이며, 이를 통해 컨테이너들이 안전하게 격리된 환경에서 통신할 수 있게 된다.


3. Bridge 네트워크 사용해보기

이제 네트워크를 생성해서 한번 사용해보자

💡 네트워크 생성 및 컨테이너 연결

◉ 커맨드 - 네트워크 생성
docker network create --driver=bridge my-web-network


다음으로 컨테이너를 실행할 때, 네트워크를 우리가 생성한 my-web-network 로 지정해보자

◉ 커맨드 - ubuntu 컨테이너 실행
docker run -it --name test --network my-web-network ubuntu


docker container inspect test


Result View

ubuntu 컨테이너는 메인 프로세스가 바로 종료되기 때문에 가상 터미널을 실행시키도록 -it 옵션을 줘야한다.

다음으로 Ctrl + p + q 를 눌러서 컨테이너가 종료되지 않게 detach 모드로 변경한 후 컨테이너를 인스펙션하면 사진과 같이 확인된다.

우리가 생성한 my-web-network 의 대역폭을 갖는 네트워크가 연결된 모습을 볼 수 있다!

◉ 커맨드 - 컨테이너와 네트워크 연결
docker network connect my-web-network test

물론 이미 생성되어있는 컨테이너에 대해서도 위와 같은 명령어로 네트워크를 연결시킬 수 있다는 걸 기억하자!

💡 다른 컨테이너와 통신 테스트

그렇다면 동일한 대역폭의 네트워크를 사용하는 컨테이너끼리 통신이 가능한지를 확인해보려고 한다.

이전에 생성한 my-web-network 네트워크를 사용하는 새로운 컨테이너인 test2 를 만들어본다.

다음으로 기존에 생성했던 test 컨테이너에서 가상 터미널로 접속하여 test2 쪽으로 핑을 날려보자

Result View

참고로 핑 테스트를 하기 위해서는 ubuntu 가상터미널에서 apt-get update, apt-get install iputils-ping 으로 핑 도구를 설치해야 한다.

사진과 같이 test 컨테이너에서 test2 컨테이너로 핑이 정상적으로 나가는 모습을 볼 수 있다!

💡 사용 예시

위에서 따로따로 정리한 내용을 한번에 정리하면 다음과 같다.

사용 예시

  1. 네트워크 생성
    docker network create app-network

  1. DB 서버 실행
    docker run -d --name db --network app-network mysql:5.7

  1. 웹 서버 실행
    docker run -d --name web --network app-network my-web-app

이처럼 네트워크를 설정해서 사용할 수 있구나 정도를 알아두면 좋을 것 같다.


OUTRO

Docker Network는 처음에는 복잡해 보일 수 있지만, 실제로 사용해보면 컨테이너 간의 통신을 쉽게 처리할 수 있도록 도와준다.

특히 사용자 정의 네트워크를 활용하면, 마치 실제 네트워크를 구성하는 것처럼 컨테이너들을 효율적으로 관리할 수 있다.

네트워크 연결하는 부분은 다 알아두자 👊

profile
코린이

0개의 댓글

관련 채용 정보