cloudwithbass

[Docker] 도커 네트워킹과 docker0 본문

Docker and Jenkins

[Docker] 도커 네트워킹과 docker0

여영클 2024. 7. 9. 20:02

 

 

목차

     

     

    대부분의 애플리케이션들은 다른 시스템과 네트워킹하며 실행되는 경우가 많습니다.

    이번 포스팅에선 컨테이너가 외부와 어떻게 통신하는지 알아보겠습니다.

     

    1. 외부에서 컨테이너에 접근하기

    컨테이너는 기본적으로 외부와 통신이 불가능한 상태로 생성됩니다.

    컨테이너로 들어오는 트래픽은 컨테이너의 포트를 노출(expose)해서 처리해야 합니다.

     

    1-1. 포트 매핑 실습

    테스트를 위해 먼저 웹 브라우저에서 http://localhost:8080에 접속합니다.

    웹 서버 컨테이너를 실행하지 않았으므로 아마 ERR_CONNECTION_REFUSED 에러가 발생했을 것입니다.

     

     

    이제 tomcat 컨테이너를 실행하겠습니다.

    톰캣은 Apache Software Foundation에서 개발한 오픈소스 웹 애플리케이션 서버입니다.

     

    docker run -d -p 8080:8080 tomcat
    • '-d' 옵션: 컨테이너를 백그라운드에서 실행합니다.
    • '-p' 옵션 (또는 --publish): 컨테이너의 포트를 매합니다. 첫 번째는 호스트 머신의 포트, 두 번째는 컨테이너의 포트를 의미합니다. 
    • 만약 '-P' 옵션을 사용하면 컨테이너의 모든 포트를, 호스트의 포트 중 사용하지 않는 포트로 매핑합니다.

    이를 도식으로 표현하면 위 사진과 같습니다.

     

    • 컨테이너의 8080 포트를 호스트의 8080포트와 연결해서, 호스트의 8080포트로 접근하면 컨테이너에 접근할 수 있습니다.
    • 참고로 http://localhost:8080에서 8080은 호스트 머신의 포트 번호입니다.
    • 그래서 만약 docker run -d -p 8081:8080 tomcat과 같이 컨테이너를 실행했다면 http://localhost:8081에 접속해야 합니다.

     

    이제 다시 웹 브라우저에서 http://localhost:8080에 접속하면 다음과 같은 화면을 볼 수 있습니다.

    404 에러를 반환했지만 Apache Tomcat이 정상적으로 실행되고 있습니다.


    2. 컨테이너에서 외부에 접근하기

    다음으로 컨테이너에서 외부에 접근하는 방법을 알아보겠습니다.

     

    지난 포스팅에서 ubuntu:20.04 이미지를 사용한 컨테이너를 실행하고, 별다른 설정 없이도 bash에서 apt install 등의 인터넷을 사용하는 명령을 사용했습니다. 이건 어떤 원리일까요?

     

    2-2. Docker0

    원리를 이해하기 위해 먼저 Docker0에 대해 알아보겠습니다.

    • Docker daemon이 실행되면, 도커 데몬은 docker0라는 가상 브리지 인터페이스를 생성합니다.
    • docker0는 IP 주소를 할당받습니다.
    • 컨테이너는 docker0와 통신하기 위해 veth 쌍을 사용합니다.
    • 한 veth는 컨테이너의 eth0에 바인딩되며, 다른 veth는 docker0에 바인딩됩니다.
    • docker0는 호스트의 eth0과 통신할 수 있으므로 따라서 컨테이너에서 외부 네트워크로 통신할 수 있습니다.

    2-3 실습

    이를 실습을 통해 확인해보겠습니다.ifconfig 명령으로 확인한 결과, docker0의 ip는 172.17.0.1/16입니다.

     

    참고: Docker Desktop을 이용하는 경우, Docker0는 가상 머신 내에 있기 때문에 위 호스트OS에선 이 docker0를 확인할 수 없습니다. 저는 리눅스에 docker를 설치했기 때문에 ifconfig로 docker0를 확인할 수 있습니다.

     

    이제 다시 tomcat 컨테이너를 실행하고, docker inspect 명령을 사용하겠습니다.

    docker inspect 명령은 컨테이너의 구성 내역을 JSON 형식으로 출력합니다.

     

    이를 inspect라는 파일에 저장 후 vi 에디터로 NetworkSettings 부분을 확인하면 다음과 같은 내용을 볼 수 있습니다.

    tomcat 컨테이너의 Gateway는 172.17.0.1입니다.

    즉, 이 컨테이너는 Gateway인 docker0와 통신한다는 것을 알 수 있습니다. 

     

    docker0는 호스트의 eth0와 통신할 수 있고, 호스트는 인터넷과 통신할 수 있으므로 결론적으로 컨테이너에서 인터넷 트래픽을 처리할 수 있는 것입니다.

     


    참고 문서

    Explore Networking Feautres on Docker Desktop

    Docker Networking: Basics

    How docker Network Works