Docker Network

Vorhandenheit ·2022년 2월 23일
0

Docker

목록 보기
7/7

Docker Network

도커 네트워크 구조를 간단히 도식화한 그림입니다.

1. Docker0 interface

(1) 특징

  • IP는 자동으로 172.17.42.1로 설정되며 16bit netmask(255.255.0.0)으로 설정됩니다.
  • 이 IP는 DHCP를 통해 할당 받는 게 아니라, docker 내부 로직에 의해 자동 할당받는 것입니다.
  • docker0는 일반적인 interface가 아니라, virtual ethernet bridge입니다.

docker0는 container와 통신하기 위한 가상 linux bridge입니다. 이 bridge는 기본적으로 L2통신 기반입니다. 도커가 설치되면 이 docker0라는 bridge가 생성되고 container가 외부로 통신할 때는 무조건 이 docker0 interface를 지나야합니다.

2. Iptables

리눅스에서 기본적으로 제공되는 iptables는 Docker에서 외부 네트워크와 통신하는데 중요한 역할을 합니다. Docker pakage설치시 iptables에 자동으로 등록됩니다.
리눅스 방화벽의 역할을 수행하고, 패킷 필터링과 NAT 역할을 수행합니다.

3. Container network

docker를 설치했으니 이제 container를 만들면, 컨테이너는 Linux Namespace기술을 이용해 각자 격리된 네트워크 공간을 할당받게 됩니다.

container가 생성되면, pari(peer) interface 생성되게 되고 한쪽은 container의 내부 namespace에 ethO라는 이름으로 할당되고 나머지 한쪽은 vethXXXX(가상 이더넷포트)라는 이름으로 docker0 bridge에 binding됩니다.

(1) Container Port외부 노출

container를 생성하면 기본적으로 외부와 통신이 불가능한 상태입니다. 따라서 외부와 통신하기 위해서는 외부로 노출할 Port를 지정해줘야합니다.

docker run -d -p 8080:80 --name [컨테이너]

이 명령어를 실행할 경우, 8080포트를 listen하고 있는 프로세스는 docker-proxy라는 프로세스입니다.

(2) docker-proxy

docker-proxy는 docker host가 iptables의 NAT를 사용하지 못하는 경우, 그 역할을 대신합니다.

(3) iptables 이용한 DNAT

3. 네트워크 명령어

(1) 네트워크 조회

현재 생성되어 있는 Docker 네트워크 목록을 조회할 수 있습니다.

docker network ls

bridge, host, none은 Docker 데몬이 실행되면서 디폴트로 생성되는 네트워크입니다.

  • bridge : 외부 네트워크와 연결되어있는 네트워크

(2) 네트워크 생성

docker network create

(3) 네트워크 상세정보

docker network inspect

(4) 네트워크 컨테이너 연결

docker network connect [네트워크] [컨테이너]

(5) 네트워크로부터 컨테이너 연결 해제

docker network disconnenct [네트워크] [컨테이너]

(6) 두번째 컨테이너 연결

docker run --name [컨테이너] --network [다른 네트워크]
  • -d : 컨테이너를 백그라운드로 기동
  • --name 컨테이너명 : 컨테이너에 이름 부여
  • --network 네트워크명 : 접속하는 컨테이너 네트워크명을 지정
  • -e 환경변수=설정값 : 컨테이너 안에 환경 변수를 지정, 여러 개 기술 가능

(7) 네트워크 제거

docker network rm [네트워크]

(8) 네트워크 청소

docker network prune

2. 네트워크 종류

(1) BRIDGE

docker의 기본 network 방식입니다.
docker daemon을 실행하면 docker0라는 bridge가 생성되고, 컨테이너를 생성하면 network namespace 영역이 하나씩 생성되고 docker0 bridge에 container의 인터페이스들이 하나씩 binding되는 구조입니다.

docker network inspect bridge를 통해 확인할 수 있습니다.

(2) HOST

host방식으로 컨테이너를 생성하면, 컨테이너가 독립적인 네트워크 영역을 갖지 않고 host와 네트워크를 함께 사용하게됩니다.

컨테이너 생성시 --net=host 옵션을 사용하면 됩니다. host옵션으로 생성된 컨테이너의 경우 bridge를 사용하지않으므로 docker0에 바인딩되지않습니다.

이 방식으로 생성된 컨테이너는 기존에 존재하는 다른 컨테이너의 network환경을 공유하게 됩니다

(3) NONE

--net=none옵션으로 컨테이너를 생성하면 격리된 네트워크 영역을 갖게되지만, 인터페이스가 없는 상태로 컨테이너를 생성하게됩니다.

출처

https://www.daleseo.com/docker-networks/
https://jonnung.dev/docker/2020/02/16/docker_network/
https://bluese05.tistory.com/15
https://youngmind.tistory.com/entry/%EB%8F%84%EC%BB%A4-%EA%B0%95%EC%A2%8C-3-%EB%8F%84%EC%BB%A4-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-1

profile
읽고 기록하고 고민하고 사용하고 개발하자!

0개의 댓글

관련 채용 정보