본문 바로가기

AWS 교육/Docker-AWS (월)

241007_Docker Network 브릿지, namespaces, DNS서버, 지정

728x90

09. Docker network.pdf
1.00MB

 

먼저 버츄얼 박스의 도커를 헤드리스 시작하고 모바X텀을 실행

docker container에 대한 예시 그림

 

◈리눅스 브릿지

 ㄴ커널 내부의 물리적 스위치를 가상으로 구현한 OSI Layer 2 Device이다.

스위치 => 2계층 장비 => 사용하는 주소 : mac address

라우터 => 3계층 장비 => 사용하는 주소 : ip address

 

bridge network의 기본 대역은

1) 172.{17-31}.0.0/16 (65536개)

2) 192.168.{0-240}.0/20 (4096개)

 

veth는 OSI 2계층 서비스로 컨테이너 내부에 제공되는 네트워크 인터페이스 eth0와 한쌍(pair)으로 제공되어 docker0와 가상의 “터널 링 네트워크”를 제공한다

ㄴveth와 eth가 한쌍으로 만들어진다

S.MAC D.MAC S.zp D.zp S.Port D.Port
||||||||||||||||||||||||||   |||||||||||||||||||||||||| ping 172.17.0.3 ||||||||||||||||||||||||||  

 

S : 출발지(이미 알고 있기에 |||표기 ,  D : 도착지

 

ping 입력 시 동일 네트워크에서 해당 IP가 있는 장소 도착 후 스위치가 알고 있는 주소(mac address)를 입력하여 연결

mac을 모르면 가서 물어볼 수 없음 -> 누군가 해당 mac을 알려줘야 확인 가능

mac은 동일 네트워크에서만 사용가능

 

ping 8.8.8.8 실행 시 스위치로 먼저 이동 후 라우터로 이동, 벗어날 시 외부 네트워크

외부네트워크 이동 전 쓰는 게 mac이기에 외부로 이동 시 해당 라우터 mac을 입력

mac address = 랜카드가 가진 고유의 주소

스위치는 랜카드가 없어서 mac이 없음(포트만 존재)

int f0/0 = FastEthernet(=랜카드)

 

게이트웨이의 mac어드레스 확인

172.16.0.0 에게 물어봐서 확인 => cmd에서 route print 게이트웨이 IP확인 후 arp -a 을 통해 Mac address 확인

얻은 mac address를 D.Mac에 입력

해당 정보들을 스위치에 전송하면 스위치에 표가 존재하는데 포트번호와 맥주소가 있어서

해당 맥주소의 포트번호의 라우터로 전송

라우터에서 맥주소와 IP가 맞는 지 확인

 

라우터 = 라우팅 알고리즘 설정하는 기계

라우팅 알고리즘 => 경로설정 하기 위해 사용(static, rip, eigrp 등)

 ㄴprerouting = 라우팅 하기 전

ip를 라우팅 알고리즘에 입력하여 방향성 결정(postrouting)

확인 후 출발지 mac과 다음 도착지 mac을 설정 후 다음 라우터로 이동

이런 식으로 출발지 mac과 도착지 mac이 계속 바뀜

 

같은 네트워크면 mac어드레스를 붙이고

다른 네트워크면 mac어드레스를 떼고 ip로 라우팅 한 후 해당 네트워크에서 게이트웨이 mac을 붙임

이런 식으로 mac어드레스가 뗐다 붙였다 함

 

브릿지, 호스트 컨테이너를 만들어진 내용 확인 가능

 

브릿지

컨테이너 마다 별도의 네트워크를 구성

 

호스트

컨테이너의 ip가 없음

우분투 컴퓨터의 ip를 같이 사용

호스트 ip를 치면 컨테이너로 들어감

 

null

네트워크 x, 외부 통신x

 

◇브릿지 네트워크 컨테이너

브릿지 네트워크 확인 명령어

포트를 입력하지 않는 이유 : 우분투로 이용하기 때문에 OS로 외부접속(OSI 4~7계층 범위)이 필요없기에 넣을 필요가 없음

이미지라 레이어가 3개만 다운됨

사용된 이미지(우분투14.04) : 커맨드 = 셀을 실행(운영체제는 셀이 작동되고 있어야 함) : 컨테이너 이름

외부에서 컨테이너로 들어가서 ip 확인하는 법

모든 컨테이너에는 라우팅 테이블이 존재하기에 확인 하는 방법

Linux에서는 route 로 확인

docker0 를 통해 연결된 점 확인됨

 

docker0 (172.17.0.1) -------bridge-------------- my-ubuntu (172.17.0.2)

                                          veth32686e6         eth0@if6 (인터페이스 6번과 연결됨)

                                         (brctl show통해 확인)   (ip a입력 시 맨 앞에 표기되는 index번호 = 인터페이스 번호)

6번과 5번이 연결된 점 확인 가능

이후 컨테이너 추가 시 연결된 인터페이스를 확인 가능

 

브릿지 네트워크 상세정보 확인

~$ docker network inspect bridge

브릿지의 게이트웨이와 소속 컨테이너의 mac과 ip 등을 확인 가능

 

 

◆veth(virtual ethernet device)

 두 네트워크 네임스페이스 사이의 연결선으로 동작하는 리눅스 네트워킹 인터페이스

 veth는 각 네임스페이스에 단일 인터페이스가 있는 전이중 링크

 한 인터페이스의 트래픽을 다른 인터페이스로 전달

 도커 네트워크를 만들 때 도커 네트워크 드라이버는 veth를 사용하여 네임스페이스 간에 명시적인 연결을 제공

 컨테이너가 도커 네트워크에 연결되면 veth의 한쪽 끝은 컨테이너 내부에 배치되며 (일반적으로 ethN 인터페이스로 표시) 다른쪽은 도커 네트워크에 연결된다

 

반 가상화(Half Hypervisor) : 윈도우 실행한 후 가상화프로그램을 실행하는 것

전 가상화(Pull Hypervisor)  : 내 컴퓨터에 윈도우를 설치하지 않고 바로 가상머신 프로그램을 실행하는 것  (ESXI 등)

 ㄴ(컴퓨터 2대가 필요)웹으로 접속하여 가상머신 구성하여 실행

 

리눅스 컨테이너 기술의 등장으로 반가상화 및 전가상화가 죽어가게 됨

ㄴ가상머신이라는 말보다는 스냅샷이라하여 격리된 공간 안에 Application을 돌리는 것

 

◇namespaces  : VM에서 각 게스트 머신별로 독립적인 공간 제공 및 서로 충돌 방지 기능을 가진 역할과 동일

 mnt(파일시스템 마운트)  : 호스트 파일 시스템에 구애받지 않고 독립적 파일시스템을 마운트하거나 언마운트 가능

                                           (USB의 연결을 잇거나 끊는 것을 마운트, 언마운트라고 함)

 pid(프로세스ID)  : 독립적인 프로세스 공간을 할당 (프로세스 충돌 시 컴퓨터가 동작을 안하기 때문)

 net(네트워크)  : namespace간에 network 충돌 방지 (중복 포트 바인딩 등)

 ipc(SystemV IPC)  : 프로세스 간 독립적인 통신통로 할당

 uts(hostname)  : 독립적인 hostname 할당

 user(UID)  : 독립적인 사용자 할당

 

윈도우에도 파티션 분할 등 위와 동일한 독립적 공간 제공 기능 존재 (D드라이브, F드라이브 등)

 ㄴ윈도우만 드라이브라는 이름으로 연결하나 다른 OS(Linux 등)는 폴더와 연결

 

veth는 각 네임스페이스에 단일 인터페이스가 있는 전이중 링크

 양방향으로 통신하려면 선이 2개가 있어야 하기에 이중 링크이며

 하나가 있으면 보내고 끊고 받고 하는 형식(무전기)

컨테이너를 하나 더 제작 후 브릿지 확인 시 한개 더 추가된 점 확인 가능

 

이후 ~$ docker network inspect bridge 입력 시 컨테이너가 2개가 된 점을 확인 가능 및

5,6 번이 my-ubuntu

7,8 번이 test1과 연결된 점을 확인 가능

 

방화벽의 규칙 확인

-t  nat  : nat table을 보는것 (사설 ip를 외부 ip로 바꿔주는 것 = nat)

prerouting = 라우팅 전

postrouting = 라우팅 후

172.17.0.0으로 시작하면 도착지가 어디든지 진짜 랜카드로 넘겨줘라는 내용(Chain POSTROUTING)

 

 

◈DNS 서버  (개념을 명확하게 알고 있어야 함)

  ㄴ사람이 읽을 수 있는 도메인 이름을 IP 주소로 변환할 수 있게 해주는 인터넷의 핵심 구성 요소

  ㄴ사용자가 URL을 입력하거나 링크를 클릭할 때 장치와 컴퓨터가 올바른 웹사이트나 서비스를 찾을 수 있도록 도와주는        인터넷 전화번호부 역할

전세계 ip를 모아둔 것

모든 ip를 외울 수 없어서 도메인을 외움

도메인을 입력 시 dns서버로 보내서 해당 특정 ip를 확인하여 송수신

cmd에서 DHCP(유동 IP) 내용 확인

 

◆로드밸런스  : 들어오는 클라이언트들을 각 서버별로 나눠주는 역할

                    (web서버가 4개일때 1곳으로 몰리면 부하가 심하기에 분배 필요)

 ㄴ부하 분산  : 부하가 걸리지 않도록 흩어지게 하는 것

 클라이언트는 게이트웨이 주소를 알게됨

 

게이트웨이 IP를 dns서버에 등록해야 하며 로드밸런스 ip를 등록하면 안됨(보안상의 이유)

내 사이트에 있는 dns서버 = 네임서버(=NS)

 

컨테이너 dns 설정

우분투 계열의 dns서버 이름이 nameserver

해당 컴퓨터의 my-ubuntu의 dns서버 ip 확인 가능 (같은 이미지로 만들었다 해도 컨테이너 별로 다를 수 있음)

 

특정 dns서버로 등록하는 방법

bash  : 만든 컨테이너에 바로 접속

--dns=*.*.*.*  : dns 서버 ip 등록

 ㄴ이미지 이름에 버전 미입력 시 가장 마지막 버전으로 다운 

 

bash로 들어갔다가 exit로 나오게 되면 해당 컨테이너가 멈추게 됨

그러나 컨테이너를 만든 후 exec ~* *~ bash를 주면 멈추지 않음

run 명령어 입력 시 bash로 접속하면 나중에 exit 입력 시 멈추게 되기에 멈추는 게 싫다면 만들고 나서 exec로 접속해야함

 

컨테이너에 mac어드레스를 임의로 주고싶다면

--mac-address=[MAC Address]  : 로 설정 가능

~$ docker run -it -d --mac-address="92:d0:c6:0a:29:33" centos:7

 

[root@330a733eca0d /]# cat /etc/hosts     : bash로 접속 후

 ㄴetc 밑에 호스트즈 라는 곳에 아이디와 도메인을 넣어둠

 

도메인 서버로 호스트즈파일 사용하지 않는 게 기본 권고 사항(보안때문에)

ㄴ도메인 ip 변경을 통한 해킹 위험 존재(화면은 부산은행이나 해킹서버로 접속하게 하여 정보 추출)

클라우드 환경의 클러스트 제작 시에 일부 사용

 

컨테이너를 하나 만드는 데 myweb이라는 이름으로 호스트포트는 랜덤에 40001포트를 열고 nginx를 다운하여 적용

expose  : 외부에 오픈하는 포트

-P  : 호스트 포트를 랜덤으로 지정 (-p 는 특정 포트를 지정)

 

ls와 ps는 똑같은 명령어 (ls는 요즘, ps는 옛날 명령어)

192.168.56.10:32768~9를 웹에 입력 시 80포트로 연결된 포트는 접속이 되나 40001포트는 접속이 되지 않음

nginx의 history를 확인 시 80포트에는 서비스가 있으나 40001포트에는 서비스가 없기에 접속되지 않음

~$ docker port myweb  : 해당 컨테이너의 포트만 출력

 

docker-proxy 와 port 확인 명령어를 자료에서 확인 가능

 

 

◆docker network: overlay

다른 컴퓨터에 있는 컨테이너끼리 네트워크 통신하는 것

 

~$ docker inspect bridge  : 브릿지 상 현재 컨테이너의 수 및 ip 확인

ㄴ같은 네트워크 임

 

 

◇사용자 정의 docker network

 docker는 기본적으로 Host OS와 bridge 연결을 하며 —net 옵션을 통해 네트워크 설정 가능

 docker network create로 “사용자 정의 bridge network” 생성

 사용자 정의 네트워크에 연결하면 Container는 Container의 이름이나 IP주소로 서로 통신 가능

 Overlay network(docker swarm)나 커스텀 플러그인 사용 시 multi-host 연결 가능

driver = 네트워크 종류

docker network create --net=[옵션] <네트워크 이름>

 

네트워크를 호스트로 지정했기에 따로 포트 미지정하여도 포트번호 미입력으로 192.168.56.10만 입력해도 접속됨

 

원래는 80:80에서 도커프록시가 관리하며 브릿지를 연결하여 포트로 접속 가능하도록 하는 데

네트워크를 호스트로 만듬으로 컨테이너와 호스트를 곂치게 되어 리눅스(root)가 관리

호스트와 같은 네트워크를 사용하기에 컨테이너 ip가 필요없음

ㄴdocker0를 이용하지 않음

 

-p 옵션으로 포트를 연결한 경우에는 docker-proxy가 관리

 

~$ docker container ls   : 에는 컨테이너가 3개가 확인되나

~$ ip a                           : 입력 시 2개의 2개의 가상인터페이스(veth)만 확인된다

 

◆네트워크 제작 및 특정 내용 등록

docker network create [-d(--driver) bridge] mynet

 ㄴ네트워크 중 bridge를 이용하여 mynet이라는 네트워크를 만든다

 ㄴbridge는 기본옵션이기에 생략 가능

br-* = 브릿지로 됨

 

모바X텀 > (왼쪽)Session > 192.168.56.10 더블클릭 하여 2, 3번째 터미널 접속

 

~$ docker inspect mynet    : 통해 2개의 컨테이너가 mynet 네트워크에 작동중임을 확인 가능

각 컨테이너로 ping 전송 시 정상작동 됨

ip주소 뿐아니라 컨테이너 이름으로도 가능

run * * bash 하고 exit하면 컨테이너가 정지하지만

Ctrl + p , q 를 입력 시 컨테이너를 중지하지 않고 우분투로 나올 수 있다

 

 

\  <= 명령어를 이어서 작성 할 때 사용 (\ 입력 후 Enter 사용하여 단락으로 구분가능)

 ㄴ이전 명령어에 오타가 있는 경우 Ctrl + c 로 중지하고 새로 작성 필요

 

~$ docker network create \

--driver=bridge \

--subnet=172.30.1.0/24 \

--ip-range 172.30.1.0/24 \

--gateway=172.30.1.1 vswitch-net

새 네트워크를 제작 후

특정 ip를 지정하여 컨테이너 생성

728x90

'AWS 교육 > Docker-AWS (월)' 카테고리의 다른 글

241021_Docker Volume  (0) 2024.10.21
241014_connect 명령어, 프록시  (0) 2024.10.14
240930_Docker 컨테이너, 네트워크  (0) 2024.09.30
240925_네트워크 축약  (0) 2024.09.25
240923_Docker image 기본  (0) 2024.09.23