기본적으로 리눅스 네트워크와 동일한 기술이 Docker Network에 적용됨
CNM(Container Networking Model) -> 도커 네트워크 아키텍쳐

CNM의 구조는 위와 같음
Docker은 기본적으로 Host OS와 Docker bridge로 연결이 되나,
--net 옵션을 활용하면 커스텀 네트워크 설정이 가능하다.
먼저 이에 대한 실습을 진행해 보도록 하겠다.

Nginx 컨테이너를
1) 백그라운드에서 실행
2) 컨테이너가 호스트 네트워크를 사용
3) 포스트 작성 시점 최신버전인 1.27.3을 사용
docker run -d --name=nginx_host --net=host nginx:1.27.3

https://hub.docker.com/_/nginx
이때 컨테이너의 이미지인 nginx 이미지는 포트 80번이 열려있다는데 이게 --net=host 옵션으로는 불가능하고
차라리 -p 80:80 옵션으로 host PC 네트워크의 80번 포트를 컨테이너의 80번 포트와 연결하는게 좀 더 현실적이다...
docker run -d --name nginx_host -p 80:80 nginx:1.27.3

아 --net=host 옵션으로는 https://localhost 이게 Host PC가 윈도우 일때는 안되는 듯 하다...
--net=host옵션일 때는
docker inspect nginx_host
이 명령어를 구동했을 때

이렇게 해당 컨테이너의 network 정보를 확인할 수 있는데..
음.. 이게 맞는건지...
아무튼 포트포워딩 과정이 생략되서 docker0을 사용 안하고 바로 컨테이너의 네트워크가 설정된다는 장점이 있지만
그만큼 보안성이 떨어지는 옵션이니
안쓰는걸 권장하고
-p 옵션으로 포트매핑을 하는 방식을 권장한다.
커스텀 네트워크 생성하기
docker network create mynet
커스텀 네트워크를 사용하는 컨테이너 생성하기
# 1번 Powershell창
docker run --net=mynet -it --name=net-check1 ubuntu:14.04 bash
# 2q번 Powershell창
docker run --net=mynet -it --name=net-check2 ubuntu:14.04 bash

이렇게 두개의 컨테이너가 커스텀 네트워크 mynet에 묶여있으니 두 컨테이너간 통신이 가능하다.

이게 통신이 가능하다는건데.. 음..
커스텀 네트워크 config 하기
아무튼 도커 네트워크에서 커스텀 네트워크를 사용하는데 이 네트워크에 대한 자세한 설정(config)를 수행하고 싶다면
아래와 같이 코드를 더 작성하면 된다.

아무튼 커스텀 네트워크 설계도 가능하다...
DNS(도메인 이름 시스템)은 사용자에게 친숙한 이름을 컴퓨터가 네트워크에서 서로를 식별하는데 사용하는 인터넷 프로토콜(IP)주소로 변환하는 인터넷 표준 프로토콜의 구성요소이다
음.. 말이 어려운데 CMD창에 아래 내용을 한번 입력해보자
nslookup google.com

위 사진과 같은 기능을 Docker도 제공하며 이를 DNS라 부른다.
아무튼 실습을 진행해보자

사용하고자 하는 컨테이너는 elasticsearch 라는 검색 및 분석 엔진으로
대규모 데이터에서 빠르고 실시간 검색, 저장, 분석 기능을 제공하며
텍스트 기반으로 검색 및 데이터로그 실시간 모니터링을 수행 가능하다는데...
무슨 기능을 하는지는 직접 써봐야 알 것 같다.
아무튼 elasticsearch 컨테이너를 두개 활성화 하고자 한다.
1번 컨테이너 이름 : es1
docker run -d --name=es1 `
--net=mynet `
--net-alias=esent-tg `
-p 9201:9200 `
-p 9301:9300 `
-e "discovery.type=single-node" `
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" `
elasticsearch:8.16.2
2번 컨테이너 이름 : es2
docker run -d --name=es2 `
--net=mynet `
--net-alias=esent-tg `
-p 9202:9200 `
-p 9302:9300 `
-e "discovery.type=single-node" `
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" `
elasticsearch:8.16.2
참고로 그냥 elasticsearch를 구동하면 메모리 용량을 많이 잡아먹는 문제가 있다.
이는 elasticsearch 컨테이너는 JVM(JAVA Virtual Machine) 기반으로 실행되는데 이게 메모리 잡아먹는게 좀 심각하게 많다
따라서 -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" 옵션을 부과해서 초기&최대 힙 메모리 용량을 512mb로 제한을 둔다.

아무튼 실행 및 호스트 PC와의 포트매핑도 올바르게 진행이 되었고
--net-alias=esnet-tg 이 옵션은
현재 사용자 정의 네트워크에서 컨테이너를 참조할 때
추가 이름(alias)를 부과하는 옵션이다.
음.. 그러니까 DNS로 동작하는 실습을 하는 것이니
es1 컨테이너에서 es2 컨테이너로 접근을 하고자 할 때
curl http://esnet-tg:9201
이렇게 접속이 가능하다는 뜻이다...
음.. 이 실습을 위해 busybox라는 컨테이너를 아래와 같이 실행시켜 보자
docker run -it --rm --name=request-container `
--net=mynet busybox nslookup esnet-tg

현재 2개의 컨테이너(elasticsearch)가 하나의 별칭으로 실행되고 있고 ip주소만 다른 것을 확인할 수 있다.

각 컨테이너별로 추가정보를 확인하기 위해 현재 활성화된 컨테이너 ip주소를 입력하면 뭔가 정보가 더 나오긴 한다.
이제 cnetos 컨테이너를 elasticsearch이 포함되어 있는 사용자 정의 네트워크 mynet에 연결되 구동되도록 아래의 명령어를 수행해보자
docker run -it --rm --name=request-container `
--net=mynet centos:8 bash

원래는 이 상황에서 네트워크 별칭인 http://esnet-tg:9200을 수행하면 접속이 되어야 하는데..
음..
아무튼 별칭(DNS)실습은 여기까지...