참고
사용자 정의 네트워크
NOTE
docker는 기본적으로 Host OS와 bridge 연결을 하며 —-net 옵션을 통해 설정가능하다!
네트워크 종류
•
docker network create로 사용자 정의 bridge network 생성!
•
사용자 정의 네트워크에 연결하면 Container는 Container의 이름이나 IP 주소로 서로 통신!
도커 네트워크 없이 통신
NOTE
docker container inspect [컨테이너 이름]
Bash
복사
mongoose.connect(
'mongodb://172.18.0.2:27017/swfavorites',
{ useNewUrlParser: true },
(err) => {
if (err) {
console.log(err);
} else {
app.listen(3000);
}
}
);
JavaScript
복사
이런 방식도 있다는걸 알아두자! (귀찮음)
•
위의 명령어로 컨테이너의 IPAdress를 복사하여 연결해줄 수 있다!
네트워크 종류
NOTE
Docker 네트워크는 bridge, host, overlay등 목적에 따라 다양한 네트워크 드라이버를 제공한다.
•
생성할 때 docker network create --driver bridge my-net를 사용해서 어떤 네트워크 드라이버를 생성할지 정할 수 있다.
bridge 네트워크
•
하나의 호스트 컴퓨터 내에서 여러 컨테이너들이 서로 소통할 수 있게 해준다.
•
디폴트 드라이버이다!
host 네트워크
•
컨테이너를 호스트 컴퓨터와 동일한 네트워크에서 돌리기 위해서 사용된다.
•
스탠드얼론 컨테이너의 경우, 컨테이너와 호스트 시스템 간의 격리가 제거됩니다 (즉, localhost를 네트워크로 공유함).
overlay 네트워크
•
여러 호스트에 분산되어 돌아가는 컨테이너들 간에 네트워킹을 위해서 사용된다.
•
여러 Docker 데몬 (즉, 서로 다른 머신에서 실행되는 Docker)이 서로 연결될 수 있습니다. 여러 컨테이너를 연결하는 구식의 / 거의 사용되지 않는 방법인 'Swarm' 모드에서만 작동합니다.
docker network ‘host’
NOTE
# Port 등록을 안했는데 자동으로 80으로 설정됨
docker run -d --name=nginx_host --net=host nginx:1.25.0
sudo netstat –nlp | grep 80
# -p 옵션으로 port를 연결한다 => docker-proxy를 이용
# 위의 방식은 호스트 운영체제에 직접 PID를 할당받아 서비스한다.
ps -ef | grep [프로세스 ID]
docker inspect nginx_host | grep IPAddress
Bash
복사
컨테이너에 별도의 IP가 부여되지 않는다. (PID 할당으로 진행했기 때문)
docker network 생성
NOTE
docker network create [-d(--driver) bridge] mynet
# 네트워크 확인
docker network ls
# 네트워크 정보 확인
route
docker network inspect [네트워크 ID]
ifconfig
Bash
복사
docker network 생성
docker run --net=mynet -it --name=net-check1 ubuntu:14.04 bash
ifconfig
route
docker run --net=mynet -it --name=net-check2 ubuntu:14.04 bash
brctl show
docker network inspect mynet
Bash
복사
2개의 컨테이너를 mynet(사용자 정의 네트워크)에 연결
mynet 네트워크에 2개의 컨테이너가 연결됨
# net-check1에서 net-check2로 ping 통신
docker run --net=mynet -it --name=net-check1 ubuntu:14.04 bash
ping -c 3 net-check2
# net-check2에서 net-check1로 ping 통신
docker run --net=mynet -it --name=net-check2 ubuntu:14.04 bash
ping -c 3 net-check1
Bash
복사
사용자 정의 네트워크 구성을 통해, 컨테이너 이름으로 통신가능! (Docker DNS 기능)
docker network 생성 (대역폭)
NOTE
docker network create --driver bridge \
--subnet 172.30.1.0/24 \ # CIDR 표기 가능 (/24 = 255.255.255.0 과 같다)
--ip-range 172.30.1.0/24 \ # subnet 이하 IP 범위조정 가능
--gateway 172.30.1.1 \
vswitch-net # 256개의 IP중 254개 사용 가능
Bash
복사
docker run --net=vswitch-net -itd --name=net1 ubuntu:14.04
docker run --net=vswitch-net -itd --name=net2 --ip 172.30.1.100 ubuntu:14.04
docker network inspect vswitch-net
Bash
복사
net1의 경우 ip가 gateway의 바로 다음인 2번으로 할당
net2의 경우 직접 설정해주어서 100번으로 설정
docker network connect | disconnect
NOTE
# 실행 중인 컨테이너에 새로운 네트워크 대역의 network를 연결한다.
docker run -it --name=add-net ubuntu:14.04 bash
Bash
복사
docker network create --driver=bridge fc-net2
docker network connect fc-net2 add-net
docker exec -it add-net bash
ifconfig
docker network disconnect fc-net2 add-net
Bash
복사
네트워크 생성하고 연결
add-net 컨테이너에 eth1 인터페이스가 추가됨 (disconnect하면 사라짐)
docker network topology
NOTE
도커 네트워크 구조
위의 과정을 실습으로 만들어본다. (web 단계에서는, Back네트워크와도 연결된다.)
# 네트워크 생성
docker network create --driver=bridge back-net
docker network create --driver=bridge front-net
# 컨테이너 생성
docker run --name=my-web -itd --net=front-net ubuntu:14.04
docker run --name=my-was -itd --net=back-net ubuntu:14.04
docker run --name=my-db -itd --net=back-net ubuntu:14.04
# 네트워크 추가 연결
docker network connect back-net my-web
# 각 컨테이너 네트워크 확인
docker exec my-web route
docker exec my-was route
docker exec my-db route
# 네트워크 연결된 컨테이너 확인
docker network inspect front-net # my-web
docker network inspect back-net # my-web / my-was / my-db
Bash
복사
실습 코드