도커 네트워크
- 도커는 각 컨테이너에 외부와의 네트워크를 제공하기 위해 컨테이너마다 가상 네트워크 인터페이스를 호스트에 생성
- 이 인터페이스의 이름은 veth로 시작한다.
- veth 인터페이스는 직접 생성할 필요는 없으며 컨테이너가 생성될 때 도커 엔진이 자동으로 생성한다.
- docker() 브리지 : 각 veth 인터페이스와 바인딩돼 호스트의 eth() 인터페이스와 이어주는 역할
- 도커 컨테이너 > (eth()) > (veth) > docker() > eth0
- eth0 인터페이스는 호스트의 veth라는 인터페이스와 연결됐으며
- veth 인터페이스는 docker() 브리지와 바인딩돼 외부와 통신할 수 있다.
ex) brctl show docker0 : docker() 브리지에 veth이 실제로 바인딩됐는지 알 수 있다.
도커 네트워크 드라이버 : bridge, host, none, container, overlay,
- third-party 플러그인 솔루션 : weave, flannel, openvswich
브리지 네트워크 : docker()이 아닌 사용자 정의 브리지를 새로 생성해 각 컨테이너에 연결하는 네트워크 구조
- 컨테이너는 연결된 브리지를 통해 외부와 통신할 수 있다.
--net-alias : 특정 호스트 이름으로 컨테이너 여러 개에 접근 할 수 있다.
Bridge Network의 --net-alias와 도커 DNS 작동 구조
- 1. (사용자) ping alicek106
- 2. (사용자)에서 (도커 내장 DNS)로 alicek106 호스트 이름 변환 요청
- 3. (도커 내장 DNS)에서 (사용자)에게 IP 목록 반환
- 4. (사용자) 에서 (컨테이너)에게 ping을 요청
호스트 네트워크 : 호스트의 네트워크 환경을 그대로 사용한다.
- Host Driver의 네트워크는 별도로 생성할 필요 없이 기존의 host라는 이름의 네트워크를 사용한다.
- 컨테이너 내부의 어플리케이션을 별도의 포트 포워딩 없이 바로 서비스 할 수 있다.
논 네트워크 : None 즉, 아무런 네트워크를 쓰지 안흔 것
컨테이너 네트워크 : 다른 컨테이너의 네트워크 네임스페이스 환경을 공유할 수 있다.
- 내부 IP, 네트워크 인터페이스의 (MAC) 주소 등이 공유된다.
$ docker run -i -t --name myvolume_2 \
-v myvolume:/root/ \
ubuntu:14.04
window > docker run -i -t --name myvolume_2 -v myvolume:/root/ ubuntu:14.04
- myvolume 이름의 볼륨 호스트와 /root/ 경로의 컨테이너를 연결한다.
$ docker inspect --type volume myvolume
- myvolume 볼륨이 실제로 어디에 저장되어 있는지 알 수 있다.
$ docker run -i -t --name volume_auto \
-v /root \
ubuntu:14.04
window > docker run -i -t --name volume_auto -v /root ubuntu:14.04
- 볼륨을 생성하지않고 -v 옵션을 입력할 때
- 컨테이너에서 공유할 디렉터리 위치만 입력하면 디렉터리에 대한 볼륨을 자동으로 생성한다.
- $ docker volume ls 명령어로 확인하면 이름이 무작위의 16진수 형태로 자동 생성된다.
$ docker container inspect volume_auto
- volume_auto 컨테이너의 상세한 정보를 출력한다.
- "Mounts" : [] 에서 볼륨 마운트에 대한 정보를 확인할 수 있다.
- "Mounts"."Source" : 컨테이너 내부에 마운트된 볼륨위치를 나타낸다.
$ docker volume prune
- 사용되고있지 않는 볼륨을 한번에 삭제한다.
$ docker run -i -t --name mount_option_2 \
--mount type=bind,source=/home/wordpress/db,target=/home/testdir \
ubuntu:14.04
window > docker run -i -t --name mount_option_2 --mount type=bind,source="c:\ddocker",target=/home/testdir ubuntu:14.04
- 호스트의 디렉터리를 컨테이너 내부에 마운트 하는 경우 type을 bind로 지정한다.
- source : 호스트의 디렉터리 경로를 지정
$ docker network ls
- 도커의 네트워크 목록을 출력하는 명령어
- bridge, host, none 네트워크가 존재한다.
- bridge : 컨테이너를 생성할 때 자동으로 연결되는 docker0 bridge를 활용하도록 설정돼 있다.
- 이 네트워크는 172.17.0.x IP대역을 컨테이너에 순차적으로 할당한다.
$ docker network inspect
- 네트워크의 자세한 정보를 살펴볼 수 있다.
ex ) docker inspect --type network : 동일한 출력 결과를 볼 수 있다.
$ docker netowrk inspect bridge
- "Config" 항목의 "Subnet"과 "Gateway"가 172.17.0.0/16, 172.17.0.1로 설정되어있다.
- "Containers" : 브리지 네트워크를 사용 중인 컨테이너의 목록을 출력
- Default 설정은 자동으로 docker() 브리지를 사용한다.
$ docker network create --driver bridge mybridge
- bridge 타입의 mybridge라는 네트워크를 생성
$ docker run -i -t --name mynetwork_container --net mybridge ubuntu:14.04
- mybridge 네트워크를 사용하는 컨테이너를 생성한다.
- docker run 또는 create 명령어에 --net 값을 설정해 네트워크를 사용하도록 설정
- Docker 내부에서 $ ifconfig 사용시 172.20. 대역의 내부 IP를 할당된다. (대역은 랜덤)
$ docker network disconnect mybridge mynetwork_container
$ docker network connect mybridge mynetwork_container
- mynetwork_container에 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
window > 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
- Subnet, IP할당범위, Gateway를 172.72.0.0 과 같이 임의로 설정
- my_custom_network 이름을 가진 bridge 네트워크를 생성
- --subnet과 --ip-range 는 같은 대역이여야한다.
$ docker run -i -t --name network_host --net host ubuntu:14.04
- --net을 host로 설정해 호스트 네트워크를 설정
- 컨테이너의 호스트 이름도 무작위 16진수가 아닌 Docker가 설치된 호스트 머신의 호스트 이름으로 설정
$ docker run -i -t --name network_none --net none ubuntu:14.04
- --net을 none 으로 설정해 네트워크를 연결하지 않는다.
- 내부에서 $ ifconfig를 사용할 때 lo 외에는 다른 네트워크가 존재하지 않는다.
$ 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
- -i, -t, -d 옵션을 함께 사용하면 컨티어네 내부에서 Shell을 실행하지만 내부로 들어가지 않으며 컨테이너도 종료하지 않음
- 테스트용으로 Container를 생성할때 자주 사용
- 컨테이너 네트워크를 사용해 network_container_1의 네트워크 환경을 공유한다.
- 내부 IP를 새로 할당받지 않으며 호스트에 veth로 시작하는 가상 네트워크 인터페이스도 생성되지 않는다.
$ docker run -i -t -d --name network_alias_container1 \
--net mybridget \
--net-alias alicek106 ubuntu:14.04
$ docker run -i -t -d --name network_alias_container2 \
--net mybridget \
--net-alias alicek106 ubuntu:14.04
$ docker run -i -t -d --name network_alias_container3 \
--net mybridget \
--net-alias alicek106 ubuntu:14.04
window > docker run -i -t -d --name network_alias_container1 --net mybridge --net-alias alicek106 ubuntu:14.04
window > docker run -i -t -d --name network_alias_container2 --net mybridge --net-alias alicek106 ubuntu:14.04
window > docker run -i -t -d --name network_alias_container3 --net mybridge --net-alias alicek106 ubuntu:14.04
- bridge 네트워크인 mybridge 이용해 컨테이너를 생성한다.
- --net-alias 를 alicek106으로 설정
- 다른 컨테이너에서 alicek106이라는 호스트 이름으로 3개의 컨테이너에 접근할 수 있다.
$ docker inspect network_alias_container1
$ docker inspect network_alias_container2
$ docker inspect network_alias_container3
- 생성한 Ubuntu:14.04 컨테이너의 이름인 network_alias_container1의 정보를 출력한다.
- "IPAddress" : 172.19.0.2 ~ 172.19.0.4 까지 정의 되어있다.
- IPAddress가 순서대로 정의되었다.
$ docker run -i -t --name network_alias_ping \
--net mybridge \
ubuntu:14.04
window > docker run -i -t --name network_alias_ping --net mybridge ubuntu:14.04
- 브리지 네트워크를 mybridge로 연결한 ubuntu:14.04 컨테이너를 생성한다.
- 위에 생성한 network_alias_container1, 2, 3 컨테이너와 --net-alias가 alicek106으로 동일하게 설정되어있다.
ex) # ping -c 1alicek106
- alicek106이라는 호스트 이름으로 ping 요청을 보낸다.
- 컨테이너 3개의 IP로 각각 ping이 전송된다.
- 도커 엔진에 내장된 DNS가 Round-robin 방식으로 호스트이름을 설정한 컨테이너로 변환 하기 때문에 사용이 가능하다.
'항해99 > 필기노트' 카테고리의 다른 글
[필기노트] HTTPS, 테스트코드 고려사항 (0) | 2021.08.10 |
---|---|
[필기노트] Kakao Map API, MySQL DATE 검색 SQL (0) | 2021.08.08 |
[필기노트] Docker Volume, SQL (0) | 2021.08.05 |
[필기노트] PROCEDURE, 인증메일 구성방법 (0) | 2021.08.04 |
[필기노트] Docker, 실전 프로젝트 SQL (0) | 2021.08.03 |