4 분 소요

도커 네트워크

1. 브릿지 네트워크

brctl show docker0
docker network ls
docker network create --driver bridge mybridge
docker run -i -t --name mynetwork_container --net mybridge ubuntu:14.04
docker network inspect mybridge => 172.18.0.0/16 임을 확인.
docker network ls => mybridge 를 확인할 수 있음  // 브릿지는 docker0와 연결되어있고 docker0는 veth와 연결되어 있다.
docker network disconnect mybridge mynetwork_container
docker network connect mybridge mynetwork_container
docker exec mynetwork_container ifconfig => docker에 attach 하지않아도 설정을 확인할 수 있음. docker exec [docker name] [실행 명령어]
docker network connect mybridge mynetwork_container
docker exec mynetwork_container ifconfig => 다시 연결된 mybridge를 확인할 수 있음
docker network create --driver=bridge --subnet=172.72.0.0/16 --ip-range=172.72.0.0/24 --gateway=172.72.0.1 my_custom_network
docker network inspect my_custom_network =>만든 상세내용을 확인할 수 있음
2. 호스트 네트워크 : 네트워크를 호스트로 설정하면 호스트의 네트워크 환경을 그대로 쓸 수 있다.

docker run -i -t --name network_host --net host ubuntu:14.04

=> 컨테이너의 네트워크를 호스트 모드로 설정하면 컨테이너 내부의 애플리케이션을 별도의 포트 포워딩 없이 바로 서비스 할 수 있다
3. 논 네트워크 : non은  말  그대로  아무런  네트워크를  사용하지  않는  것을  뜻한다.    다음과  같이  컨테이너를 생성하면 외부와 연결이 단절된다

docker run -i -t --name network_host --net host ubuntu:14.04

=> 어플리케이션 자체 테스트를할때 만들어 사용한다.
4. 컨테이너 네트워크 : --net 옵션으로 container를 입력하면 다른 컨테이너의 네트워크 네임스페이스 환경을 공유할 수 있다.   형식은 container:[다른컨테이너의 ID] 와 같다.ㅇ

docker run -i -t -d --name network_container_1 ubuntu:14.04
docker run -i -t -d --name network_container_2 --net container:network_container_1 ubuntu:14.04
docker exec network_container_1 ifconfig 
docker exec network_container_1 ifconfig => 똑같은 ip 대역으로 공유됨을 확인할 수 있다.
5. 브리지 네트워크와 --net-alias : 브리지 타입의 네트워크와 run 명령어의 —net-alias 옵션을 함께 쓰면 특정 호스트 이름으로 컨테이너 여러 개에 접근할 수 있다.

docker network create --driver bridge mybridge 
docker run -i -t -d --name net_kang_con1 --net mybridge --net-alias kangK ubuntu:14.04 =
docker run -i -t -d --name net_kang_con2 --net mybridge --net-alias kangK ubuntu:14.04
docker run -i -t -d --name net_kang_con3 --net mybridge --net-alias kangK ubuntu:14.04 
docker run -i -t --name net_alias_ping --net mybridge ubuntu:14.04 
ping kangK => 172.18.0.2 ~4 핑을 확인할 수 있다. 접근순서는 라운드로빈 방식
apt-get update
apt-get install dnsutils
dig kangK
=> DNS로 도메인 이름에 대응하는 IP를 조회하는 dia 도구로 조회된 ip를 확인할 수 있다.
6. MacVLAN 네트워크

- 물리  NIC을  가상화해  컨테이너에게  호스트의  네트워크  대역의  IP  주소를  제공하며  가상 MAC 주소도 가진다.
- MacVLAN  네트워크를  사용하는  컨테이너는  기본적으로  호스트와  통신이  불가능하다. 
- 아래 예시에서 서버1의 컨테이너는 서버2와 그 부속 컨테이너와 통신할 수 있지만 정작 자신이 속 한 서버와는 통신이 불가하다. 
- 컨테이너와 통신하면서 host와도 통신하는 효과를 보려고함.
- 자기 host node에 lan카드를 복제했기때문에 접근할 수 있다.


docker network create -d macvlan --subnet=192.168.0.0/24 --ip-range=192.168.0.64/28 --gateway=192.168.0.1 -o macvlan_mode=bridge  -o parent=ens32 my_macvlan
docker network create -d macvlan --subnet=192.168.0.0/24 --ip-range=192.168.0.128/28 --gateway=192.168.0.1 -o macvlan_mode=bridge -o parent=ens32 my_macvlan
-d : 네트워크 드라이버로 macvlan을 사용한다는 것을 명시 
-o : 옵션
docker run -it --name c1 --hostname c1 --network my_macvlan ubuntu:14.04
ip a
docker run -it --name c2 --hostname c2 --network my_macvlan ubuntu:14.04
ip a
c1# ping 192.168.0.128 –c 1 => ping 성공 확인할 수 있다.

image

# 캐드바이저
- 컨테이너인데 구글에서 만든 모니터링 도구이다.
- 컨테이너 별 실시간 자원 사용량을 알 수가 있다. 

docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:ro --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --volume=/dev/disk/:/dev/disk:ro --publish=8080:8080 --detach=true --name=cadvisor google/cadvisor:latest
# 컨테이너 자원 할당 제한

- 컨테이너를 생성하는 run, craeate 명령어에서 컨테이너의 자원 할당량을 조정하도록 옵션을 정할 수 있다. 
- 아무런 옵션을 입력하지 않으면 컨테이너는 호스트의 자원을 제한 없이 쓸 수 있다. 
- 현재 컨테이너에 설정된 자원 제한을 확인하기 위해 다음과 같이 한다.

1. 컨테이너 메모리 제한
docker run -d --memory=“1g” --name memory_1g nginx 
docker inspect memory_1g | grep Memory => 메모리 사용량을 1GB로 제한됨을 확인할 수 있다.
=>컨테이너 내에서 동작하는 프로세스가 컨테이너에 할당된 메모리를 초과하면 컨테이너는 자동으로 종료된다.

기본적으로 컨테이너의 Swap 메모리는 호스트메모리의 2배로 설정되지만 별도로 지정할 수 있다.
# docker run -it --name swap_500m --memory=200m --memory-swap=500m ubuntu:14.0


2. 컨테이너 CPU 제한
--cpu-shares 옵션 : 컨테이너에 가중치를 설정해 해당 컨테이너가 CPU를 상대적으로 얼마나 사용할 수 있는지를 나타낸다. 
-- cpuset-cpus=? : cpu를 몇개를 사용할지 정할 수 있다.

docker run -d --name cpuset_2 --cpuset-cpus=2 moon682/stress stress --cpu 1
yum -y install htop
yum -y install epel-release && yum -y install htop
htop => CPU별로 사용량을 확인할 수 있는 htop 도구로 확인할 수 있다. 

* quota 는 period 중에 얼마를 쓸건지를 나타내는 옵션이다. 25000이라하면 1/4. // 100000 = 100ms
docker run -d --name quota_1_1 --cpu-period=100000 --cpu-quota=100000 moon682/stress stress --cpu 1 => 100% 사용량을 확인할 수 있다.
htop
docker rm -f quota_1_1
docker run -d --name quota_1_1 --cpu-period=100000 --cpu-quota=25000 moon682/stress stress --cpu 1 => 25% 사용량을 확인할 수 있다.
htop
docker run -d --name cpuset_0_2 --cpuset-cpus="0,2" moon682/stress stress --cpu 2 => cpu를 총2개를 사용하는데 첫 번째, 두 번째 것을 사용해라. 


* [--cpus]
--cpus  옵션은  --cpu-period,  --cpu-quota와  동일한  기능을  하지만 좀 더 직관적으로 CPU의 개수를 직접 지정한다는 점에서 다르다

docker run -d --name cpus_container --cpus=0.5 moon682/stress stress --cpu 1
htop => 50% 확인할 수 있다.

과제]
메모리 1G / CPU 코어 1,2,3번을 사용하는 임의의 컨테이너를 생성하세요.
docker run -d --memory="1g" --name cpuset_0-2 --cpuset-cpus="0-2" moon682/stress stress --cpu 3

태그:

카테고리:

업데이트:

댓글남기기