도커 네트워크 구조
기본값
- 기본적으로 도커는 컨테이너에 172.17.0.x의 IP를 순차적으로 할당함
- 이 IP들은 내부 IP로 아무런 설정을 하지 않았다면 외부에서 접근할 수 없으며 도커가 설치된 호스트 내부에서만 접근할 수 있음
가상 네트워크 인터페이스
- 컨테이너를 실행하게 되면 컨테이너의 eth0에 대응되는 vethXXXX 라는 이름의 가상 인터페이스가 자동으로 호스트에 생성됨
- 컨테이너를 실행할 때 따로 네트워크 드라이버를 지정하지 않으면 docker0라고 하는 브릿지 네트워크를 default로 사용하며, 이 브릿지 네트워크는 호스트의 eth0과 veth의 다리 역할을 함
veth
- 리눅스의 가상 이더넷 인터페이스(virtual ethernet interface)를 의미
- 일반적인 네트워크 인터페이스와는 달리 패킷을 전달받으면 자신에게 연결된 다른 네트워크 인터페이스로 패킷을 보내주는 식으로 동작하기 때문에 항상 쌍(pair)로 생성해줘야 함
- 도커에서는 실행 중인 컨테이너 수 만큼 veth 인터페이스가 생성됨
도커 컨테이너 port를 외부에 노출
컨테이너 포트 연결 명령어
docker run -p [HOST IP:PORT]:[CONTAINER PORT] [CONTAINER NAME]
-p
: publish 옵션. 호스트 ip 포트를 컨테이너 포트와 매핑시키는 역할
예제1. nginx 컨테이너의 80번 포트를 호스트의 모든 IP의 80번 포트와 연결하여 실행
docker run -d -p 80:80 nginx
이후 curl localhost:80 으로 접속가능
예제2. nginx 컨테이너의 80번 포트를 호스트의 사용 가능한 포트와 연결하여 실행
# 아래와 같이 하나의 포트만 입력하면 컨테이너 포트만 지정하는 역할
# 컨테이너 80번 포트를 호스트의 사용가능한 포트에 랜덤으로 지정하여 연결함
docker run -d -p 80 nginx
예제3. nginx 컨테이너의 80번 포트를 호스트의 127.0.0.1 의 80번 포트와 연결하여 실행
# 지정된 IP에 대해서만 포트를 매핑함
docker run -d -p 127.0.0.1:80:80 nginx
도커 네트워크 드라이버
도커 네트워크 드라이버는 Native 와 Remote 로 나뉨
Native Drivers
: Bridge, Host, None, OverlayRemote Drivers
: 써드파티 드라이버로 외부에서 잘 만들어진 드라이버를 사용
네트워크 동작 방식에 따른 드라이버 분류
- 네트워크를 단일 호스트, 다중 호스트로 분류
- 각 네트워킹 방식에 따라 동작함
도커 네트워크 목록 확인
docker network ls
>>
NETWORK ID NAME DRIVER SCOPE
e9894c44432d bridge bridge local
0fa86d7a11fb host host local
d5e012e65643 none null local
도커 네트워크 확인하기
docker network insepct [NETWORK ID / NAME]
도커 네트워크 생성하기
# docker network create --driver=[NETWORK DIRVER] [DRIVER NAME]
docker network create --driver=bridge my-net-bridge
네트워크 지정 후 컨테이너 실행
docker run -d --network=[NETWORK NAME] [CONTAINER NAME]
네트워크 종류
bridge 네트워크
- 포트를 연결해 외부에 노출하는 방식
- 위 예제에서도 네트워크 드라이버를 지정해주지 않았으므로 default로 docker0 라는 bridge 네트워크를 사용함
- 드라이버를 지정하지 않고 컨테이너를 생성하면 기본 네트워크로 사용함
- 커스텀 bridge 네트워크를 생성해서 사용가능
host 네트워크
- 도커가 제공하는 가상 네트워크(veth)을 사용하는 것이 아니라 직접 host 네트워크에 붙어서 사용하는 개념
- 따라서 host 네트워크를 사용할 경우에는 port 바인딩을 하지 않더라도 접속할 수 있음
docker run -d --network=host nginx
# 위 명령어 실행 시 컨테이너의 포트 목록은 비어있음
None 네트워크
- none 네트워크는 해당 컨테이너가 네트워크 기능이 필요없을 때, 혹은 커스텀 네트워킹을 사용해야되는 경우가 있을 때 사용함
- none 네트워크를 사용해서 컨테이너를 생성하면 외부와의 연결이 단절됨
docker run --netword none ubuntu:focal
참고
Prev: (Docker) 4. Docker - Python 배포 실습
Next: