도커 네트워크

seonghwanPark·2021년 12월 19일

1. 컨테이너는 어떻게 통신하는가?

docker demon이 시작되면, docker network interface가 생성된다.

docker0

  • docker network 중 하나의 종류이다.
  • virtual ethernet bridge 로 172.17.0.0/16 값을 가진다.
  • 172.17.0.1 ip를 가지고 docker container의 gateway 역할을 수행한다.
  • network address translation(NAT) service 와 port forward 기능을 지원한다.(iptables를 통해서 지원함)
  • 모든 컨테이너는 외부 통신을 docker0를 통해 진행된다.
  • 리눅스 커넬의 L2스위칭 통신기반 이다. -> mac정보를 보고 스위칭을 함. 포트별로 대역폭이 부여됨.
  • container running 시 172.17.X.X 로 ip addres가 할당된다.(순차적으로)

컨테이너 생성 시

  • 컨테이너 내부 namespace에 할당되는 eth0 네트워크 인터페이스 생성.
  • docker0에 바인딩 되는 veth.... 이름 형식의 네트워크 인터페이스 생성.(호스트에 생성.)

결론은 컨테이너가 가지고 있는 ip 대역대와 실제 물리장비가 가지고 있는 네트워크를 연결해주는 고리 역할을 수행한다. 쉽게 말해, 컨테이너가 외부로 통신하거나, 외부 end 유저가 컨테이너로 접속할 수 있는 통로이다.

2. 포트 포워딩

  • 컨테이너 포트를 외부로 노출시켜 연결을 허용한다.

  • iptables rule을 통한 포트 노출 방식
    -p hostPort:containerPort
    -p containerPort -> 호스트의 port는 임의의 port로 설정된다.
    -P -> dockerfile 에서 expose로 정의되어 있는 포트에 맞춰 임의의 port로 설정된다.

    ex) docker run --name web -d -p 80:80 nginx:latest

참고사항

  1. 컨테이너는 동일한 포트를 사용해도 상관 없음. -> ip address가 다르게 할당됨.
    ex) 172.17.0.2:80, 172.17.0.3:80, 172.17.0.4:80 ....
  2. 호스트에서는 하나의 포트로 여러개의 컨테이너를 연결할 수 없음. -> 다르게 포트 포워딩 룰을 생성해야한다.(80, 81, 82 ....)

3. user-defined bridge network 생성방법

  • docker0 네트워크 안에 있는 네트워크는 static ip 할당이 불가하다.
  • static ip를 할당하거나, 사용자가 원하는 네트워크 대역대를 지정하고 싶을 때.
  • (docker0의 네트워크 대역대를 변경할 수 도 있음. -> 참고사항)

참고사항

  1. subnet: 하나의 네트워크가 분할되어 나눠진 작은 네트워크.(부분 네트워크망)
  2. gateway: 컴퓨터 네트워크에서 서로 다른 통신망, 프로토콜을 사용하는 네트워크 간의 통신을 가능하게 하는 컴퓨터나 소프트웨어를 의미한다. 즉, 다른 네트워크로 들어가는 '입구' 역할을 하는 네트워크.
ex) 
	1) 네트워크 생성 
	docker network create --driver bridge \
     --subnet 192.168.100.0/24 \
	 --gateway 192.168.100.254 \ 
	 mynet
	
	2) 생성 확인 
	docker network ls
	
	3) 생성한 네트워크 사용하기
	docker run -d --name app \
	 --net mynet --ip 192.168.100.100 \ (static network를 설정함. 설정 안하면, 192.168.100.1로 순차적으로 할당됨.)
	 -p 8080:8080 \ 
	 smlinux/appjs
	
	4) 통신확인 
	curl localhost:8080

4. 컨테이너간 통신 방법

  • link 옵션을 통한 연결 가능. 하지만, 도커 공식 문서에서 권장하지 않음.(추후 지원 종료 인듯.)
  • user-defined 네트워크를 생성하고 해당 네트워크를 공유하고 싶은 컨테이너를 생성 시 --network [사용자 정의 네트워크 이름]을 지정.
ex) 
 docker network create ......(상세설정) mynet
 docker run --name app -d -p 80:3000 --network mynet node:latest
 docker run --name db -d -3306:3306 --network -e MYSQL_ROOT_PASSWORD=test mysql:5.7
profile
뚜벅뚜벅 개발 일기🕺

0개의 댓글