본문 바로가기
개발/정리

[Docker] 도커 네트워크 (Docker Network)

by parkkingcar 2023. 4. 12.

 

 

도커 네트워크

도커 네트워크는 격리된 컨테이너들 사이의 통신을 돕는 가상 인터페이스입니다. 이를 통해 가상 네트워크 토폴로지를 구축할 수 있습니다. 

 

 

도커는 각 컨테이너에 172.17.0.X 의 IP를 순차적으로 할당합니다. 이 IP는 내부 IP이기 때문에 컨테이너 내부에서만 사용할 수 있습니다.

 

이때, 호스트에서 ifconfig명령을 실행해보면 veth라는 네트워크 인터페이스가 있습니다. 이것이 바로 도커가 생성하는 가상 인터페이스 입니다.

 

 

 

 

도커 데몬을 실행하면 다음과 같은 네트워크들이 기본적으로 생성됩니다.

 

$  docker network ls 를 통해 현재 생성되어있는 네트워크 목록확인할 수 있습니다.

 

컨테이너를 실행할 때 따로 옵션을 설정하지 않는다면 기본적으로 디폴트 브릿지 네트워크에 자동 연결됩니다. 

도커 컨테이너는 격리된 환경에서 동작하기 때문에 기본적으로는 다른 컨테이너와 통신이 불가능합니다.

 

 

 

 

 

도커 네트워크의 디폴트 브릿지를 기준으로 구조를 그림으로 살펴보겠습니다.

도커 데몬을 실행하면 기본적으로 docker0이라는 도커 브릿지 가상 인터페이스가 추가됩니다.

 

새로운 컨테이너를 실행할 때마다 해당 컨테이너와 연결하기 위한 가상 인터페이스(veth)가 호스트 네트워크 스택에 추가됩니다.


격리된 네트워크 환경을 지닌 컨테이너는 내부에 개인 인터페이스(eth)를 가지고 veth와 연결됩니다. 

 

다시 veth들은 docker0이라는 브릿지에 연결이되고 이 docker0은 호스트의 eth0, 즉 호스트의 네트워크 인터페이스에 연결됩니다. 

 

 

 

 

도커 네트워크 드라이버

네트워크 드라이버는 여러 종류가 있습니다. 기본 생성 네트워크처럼 초기에는 bridge, host드라이버를 사용합니다.

 

  • bridge

디폴트 네트워크 드라이버로 실행되는 컨테이너 간의 통신을 위해 사용합니다.

 

 

  • host

컨테이너에서 호스트의 네트워크 환경을 직접 사용합니다.

 

 

  • none

컨테이너 네트워킹을 불가능하게 만듭니다.

 

 

이외에 overlay, ipvlan, macvlan 드라이버가 있습니다 아래 문서에서 내용을 확인할 수 있습니다.

Docker 공식 문서

 

 

 

 

예시

아래 예시를 통해 도커 네트워크를 직접 지정하고 컨테이너 간 통신을 진행하겠습니다.

 

ELK stack 과 mysql을 연동합니다.

 

 

 

네트워크 생성

우선 이름이 elk이고 드라이버 종류가 브릿지인 네트워크를 생성합니다.

 

$ docker network create elk 

추가된 네트워크는 docker network ls 커맨드로 확인할 수 있습니다. -d 옵션을 사용하지 않았기 때문에 기본값인 bridge 네트워크로 생성된 것을 볼 수 있습니다.

 

 

 

 

 

 

docker compose를 이용하여 실행한 컨테이너와 이미지 빌드로 컨테이너 실행 시 도커 네트워크 옵션을 설정하는 두 가지 방법을 다루기 위해 아래와 같이 진행하였습니다.

 

먼저 docker compose를 통해 elk stack을 구축하고 실행한 컨테이너와, 이미지를 pull하여 직접 명령어로 실행한 mysql 컨테이너를 연동하면서 mysql의 데이터를 logstash에서 수집한 뒤 출력합니다.

 

 

 

 

네트워크 인터페이스는 아래와 같습니다.

 

MySQL 컨테이너

mysql 컨테이너를 실행하기 위해, mysql 이미지가 필요합니다.

 

$ docker pull mysql 명령을 통해 mysql 이미지를 다운받습니다.

$ docker pull mysql

Using default tag: latest
latest: Pulling from library/mysql
f003217c5aae: Pull complete
65d94f01a09f: Pull complete
43d78aaa6078: Pull complete
a0f91ffbdf69: Pull complete
59ee9e07e12f: Pull complete
04d82978082c: Pull complete
70f46ebb971a: Pull complete
db6ea71d471d: Pull complete
c2920c795b25: Pull complete
26c3bdf75ff5: Pull complete
9ec1f1f78b0e: Pull complete
4607fa685ac6: Pull complete
Digest: sha256:1c75ba7716c6f73fc106dacedfdcf13f934ea8c161c8b3b3e4618bcd5fbcf195
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest

 

 

 

 

이제 아래 명령을 입력하면 mysql-container라는 이름을 가진 컨테이너를 3306번 포트에서 백그라운드 실행을 할 수 있습니다. 

 

docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=(설정하고자하는비밀번호) -d -p 3306:3306 --network elk mysql

--network elk 옵션을 통해 컨테이너 실행 시 네트워크 연결을 함께 수행합니다.

 

 

 

이후 $ docker network inspect elk 명령을 실행하여 elk 브릿지 상세 정보를 확인합니다.

 

Containers 항목에 mysql 컨테이너가 포함된 것을 확인할 수 있습니다.

 

 

 

 

 

 

 

 

 

ELK stack 컨테이너

docker compose를 통해 ELK stack 컨테이너를 실행합니다. ELK stack에 관한 내용은 아래 문서를 확인해주세요.

 

ELK Stack: Elasticsearch의 개발자들이 제공합니다

ELK Stack이란 무엇인가요? ELK Stack은 널리 알려진 세 개의 오픈 소스 프로젝트인 E=Elasticsearch(Lucene 기반), L=Logstash, K=Kibana의 머리글자를 합친 것입니다. Beats가 추가되어 이제 ELK Stack을 Elastic Stack이

www.elastic.co

 

 

ELK stack 구축과 mysql 연동은 내용이 길어 추후 글을 작성하여 파일 내용과 함께 설명하겠습니다. 

 

 

 

 

우선 클론한 docker-elk 폴더에 docker-compose.yml을 확인합니다.

 

 

docker-compose.yml

version: '3.7'

services:

	...
    
    
    elasticsearch:
    
    	...
        
        networks:
      		- elk
    	
        ...
        
    kibana:
    
    	...
        
        networks:
      		- elk
    	
        ...
        
        
    logstash:
    
    	...
        
        networks:
      		- elk
    	
        ...
    	
        
        
    networks:
  		elk:
			driver: bridge
            
    ...

 

위와 같이 네트워크 옵션만 보면 elk로 이미 작성되어있는데 파일 101번 줄 즉, 맨 아래 networks: 부분이 networks 옵션을 정의합니다. 위와 같이 그냥 정의하면 디렉토리 이름 + 작성한 이름의 새 network 가 생성됩니다.

 

 


이미 mysql 컨테이너가 elk 이름을 가진 도커 네트워크에 연결되어있기 때문에 맨 아래 networks:  부분을 다음과 같이 수정합니다.

networks:
	elk:
		external: true

이때 external 옵션을 사용하면 해당 이름의 새 네트워크 생성이 아닌 기존에 생성된 network를 활용하게 해줄 수 있습니다.

 

 

이제 mysql을 연동하는 logstash.conf파일을 작성한 뒤, $ docker-compose build && docker-compose up -d 명령을 실행하여 한번에 컨테이너를 실행합니다.

 

 

 

이후 $ docker network inspect elk 명령을 실행하여 elk 브릿지 상세 정보를 확인합니다.

 

Containers 항목에 elk stack 컨테이너가 포함된 것을 확인할 수 있습니다.

 

 

 

 

로그스태시 컨테이너 로그를 확인하면 ELK_test 데이터베이스의 USER 테이블의 데이터가 잘 나오는것을 확인할 수 있습니다.

 

 

 

 

 

 

 

 

 

 

참고자료:

 

GitHub - deviantony/docker-elk: The Elastic stack (ELK) powered by Docker and Compose.

The Elastic stack (ELK) powered by Docker and Compose. - GitHub - deviantony/docker-elk: The Elastic stack (ELK) powered by Docker and Compose.

github.com

 

Docker 네트워크 사용법

Engineering Blog by Dale Seo

www.daleseo.com

 

0부터 시작하는 Docker 공부 - Docker Compose - Network & Volume 정의하기

Docker Compose - Network 정의하기 / VOLUME 지정 / expose 옵션 / 이미지 정의 ( 22.08.22 )

velog.io

 

Docker Network

<br /><br />

junhyunny.github.io

도커 네트워크 공식 문서

댓글