[DOCKER]컨테이너 서비스를 위한 docker network 관리-10

컨테이너 네트워크

docker network

  • docker network = Linux network
  • CNM(Container Networking Model) 인터페이스 집합 위에 구축. OS 및 인프라에 상관없이 동일한 환경을 가질 수 있다.
  • 리눅스 네트워킹 빌딩 블록(리눅스 브리지, 네트워크 네임스페이스, veth pair 및 iptables)

iptables가 방화벽(?)이고 bridge를 통해서 os의 네트워크와 통신을 하는 구조입니다.

docker network는 리눅스 브리지를 사용하기에 그 목록을 조회하기 위해서 bridge-utils를 설치 해야합니다.

sudo apt install bridge-utils
brctl show

bridge-utils를 설치한후에 brctl show로 확인해보면 bridge name이 docker0인 것을 알수 있습니다. 이것은 별다른 네트워크 설정을 하지 않으면 기본적으로 docker0라는 네트워크를 브리지로 사용해서 그렇습니다. interface는 이걸 사용하는 컨테이너들의 네트워크입니다. 8개의 컨테이너가 있네요.

docker run -it -d --name=fast-ubuntu ubuntu:14.04
brctl show

컨테이너를 하나 더 생성후 다시 brctl show를 실행하니 인터페이스가 하나 더 증가 한 것을 알수 있습니다. vetheb57926이 새로 생성되었네요.

route명령어를 실행하니 172.17.0.0, 192.168.68.0이 보입니다.
172.17.0.0은 docker bridge network 대역입니다. 172.{17-31}.0.0/16 이라서 2^16(65536개)의 대역을 사용할수 있습니다.
192.169.68.0은 host의 대역입니다. 192.168.{0-240}.0/20 으로 2^16(4096개)의 대역을 사용할수 있습니다.

컨테이너에서 route를 조회하니 docker0의 라우트만 보이는 것을 알수 있습니다.

docker exec -it fast-ubuntu ip addr

컨테이너의 ip addr를 확인해 보면 inet 172.17.0.10/16 이라는 것을 알수 있습니다.

docker network inspect bridge

브리지의 상세 정보를 조회할수 있습니다.

컨테이너 상세 정보에서 mac, ipa로 시작하는 정보를 조회하는 방법입니다.

docker inspect fast-ubuntu | grep -i mac
docker inspect fast-ubuntu | grep -i ipa

docker network, veth

veth란 host와 컨테이너를 연결 시켜주는 리눅스 네트워킹 인터페이스입니다.
vetheb57926는 위 실습에서 새로 생성된 veth입니다.

docker exec -it fast-ubuntu ip a
sudo cat /sys/class/net/vetheb57926/ifindex

컨테이너 내부의 ip a 실행해서  eth0@if89로 89 라는 숫자를 확인했습니다.
sudo cat /sys/class/net/vetheb57926/ifindex 확인해 보니 88 이라는 것을 알수 있습니다.
숫자가 하나 차이 나는것을 확인 했습니다. 이것을 사용해서 veth가 어떤 컨테이너에 적용 되었는지 알수 있습니다.

iptables라는 명령어를 실행하면 마치 포트포워딩과 같이 source ip, destination ip, port정보를 확인 할수 있습니다.

sudo iptables -t nat -L -n

172.17.0.x들을 보면 등록 한적이 없는데 등록이 되어있는 것을 알수 있습니다. docker0에 veth가 추가 되면서 자동으로 iptable에 등록이 됩니다.

아래 표는 network관련된 옵션들을 정리한 것입니다. 주로 사용 하는 옵션은 -p, -h 등입니다.

# container DNS 서버 설정
docker run -it --dns=8.8.8.8 centos bash
cat /etc/resolv.conf

# container MAC Address 설정
docker run -d --mac-address="92:d0:c6:0a:29:33" centos:7
docker inspect --format="{{ .Config.MacAddress }}" c268f1

# Host명과 IP Address 설정
docker container run -it --add-host=fastcampus.co.kr:192.168.0.100 centos:7 bash
cat /etc/hosts

다음에는 nginx를 위의 옵션을 적용해서 뛰워보겠습니다.

docker run -d -P --name=myweb --expose=40001 nginx:1.25.0
docker port myweb
sudo netstat -nlp | grep 32771
ps -ef | grep 12106

-d: 백그라운드로 실행
-P: 자동으로 포트 연결
–expose: 컨테이너 내의 노출 포트 지정

 

사용자 정의 네트워크

위의 실습에서는 docker default 브리지인 doker0에 대해서 알아 보았습니다. 하지만 일반적으로는 다른 브리지를 만들어서 사용하는게 더 권장되는 방법입니다.
이번에는 새로운 비릿지를 만들어서 컨테이너와 연결해보겠습니다.

docker network, “host”

docker run -d --name=nginx_host --net=host nginx:1.25.0
sudo netstat –nlp | grep 80
curl localhost:80
ps -ef | grep 8967
docker inspect nginx_host | grep -i ipa

–net=host 이 의미는 컨테이너가 호스트의 네트워크를 사용하겠다는 의미입니다. 즉 nginx의 80 포트와 호스트의 80포트가 연결되는 거죠.

docker inspect nginx_host | grep -i ipa 에서 데이터가 위처럼 나오는 것은 도커의 network를 사용하는 것이 아니라 호스트의 네트워크를 사용해서 입니다.

docker network create

docker network create mynet
docker network ls
route
ifconfig
docker network inspect mynet

mynet이란 네트워크를 만들고 그 정보를 확인해 봅시다.
route로 확인해보니 172.18.0.0대역이 새로 생성되었습니다.
ifconfig로 좀더 자세히 보면 브리지는 172.18.0.1을 아이피로 가지고 127.18.255.255를 broadcast로 사용합니다.

mynet을 사용해서 두개의 우분투 컨테이너를 만들어서 다른 터미널에서 통신이 되는지 확인해 봅시다.

docker run --net=mynet -it --name=net-check1 ubuntu:14.04 bash
docker run --net=mynet -it --name=net-check2 ubuntu:14.04 bash

ping -c 2 net-check2

docker network inspect mynet

mynet을 브릿지로 사용하는 net-check1, netchek2를 만들어서 net-check1에서 핑을 날려서 통신이 되는것을 확인했습니다.  당연하게도 브릿지가 다르다면 서로 통신이 안되는 격리된 네트워크 환경을 제공해 줍니다.

docker network create의 세부 옵션을 좀더 살펴 봅시다

docker network create --driver bridge --subnet 172.30.1.0/24 --ip-range 172.30.1.0/24 --gateway 172.30.1.1 wswitch-net
docker network ls
route

–subnet: 아이피 시작 범위 여기서는 172.30.1.0부터 172.30.1.255까지
–ip-range: 아이피 제한 범위 여기서는 subnet과 동일하게 설정하였다. 만약 172.30.1.200으로 하였다면 전체 대역은 172.30.1.200부터 172.30.1.255가 된다.
–gateway: 네트워크에서 다른 네트워크로 패킷이 전송될때 지나가는 포트

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

docker inspect net1 | grep IPAddress
docker inspect net2 | grep IPAddress

위의 실습과 동일하다.  net-2는 아이피를 직접 지정하였다. 실습을 통해서 변경됨을 확인하였다.

docker network connect | disconnect

컨테이너들은 같은 브리지를 가지고 있지 않으면 통신이 되지 않는다. 여기에서는 서로 다른 네트워크 브리지를 가지고 있는 컨테이너를 통신이 되도록 하는 방법과 다시 연결을 제거 하는 방법을 다루겠다.

docker run -it --name=add-net ubuntu:14.04 bash

ping -c 1 net-check2

docker network connect mynet add-net
docker network disconnect mynet add-net

add-net이라는 우분투 컨테이너를 만들자. –net으로 별다른 지정을 하지 않았기에 브리지는 docker0이다.
컨테이너 내부에서 핑으로 mynet을 브리지로 사용하고 있는 net-check2를 호출해보자.
오류가 나는 것을 볼수 있다. docker network connect로 mynet이라는 브리지를 연결해주면 호출이 정상적으로 된다.
disconnect로 연결을 해제 할수도 있다.

이번 실습은 my-db, my-was, my-web을 컨테이너를 생성하고 my-db, my-was만 서로 back-net 브리지를 같이 사용하여 통신이 되고 my-web은 다른 브리지인 front-net을 사용하여 통신이 서로 안되는 상황에서 통신이 가능하도록 해보자.

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 exec my-web ping -c 1 my-was

docker network connect back-net my-web

docker exec my-web ping -c 1 my-was


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

docker network connect back-net my-web 을 실행한후 핑이 호출되는 것을 알수 있다.

docker network disconnect front-net my-was
docker stop my-web my-was my-db
docker rm my-web my-was my-db
docker network rm back-net
docker network rm front-net

실습용으로 만든 브리지와 컨테이너를 삭제 하자.

docker DNS

  • DNS 서버가 컨테이너에 생성된다.
  • 동일 네트워크 alias 할당을 통해 하나의 타켓 그룹을 만들어 Round Robin(순환)방식으로 응답한다.
  • 컨테이너 생성시 호스트 시스템에서 다음 세 파일을 복사하여 컨테이너 내부에 적용하여 컨테이너 간에 이름으로 찾기가 가능해진다.
    • /etc/hostname
    • /etc/hosts
    • /etc/resolv.conf
  • –name or –net-alias 사용시 DNS에 등록

[실습] 사용자 정의 네트워크의 docker DNS 확인

docker network create fc-net
docker network ls
docker run -d --name=es1 --net=fc-net --net-alias=esnet-tg -p 9201:9200 -p 9301:9300 -e "discovery.type=single-node" elasticsearch:7.17.10
docker run -d --name=es2 --net=fc-net --net-alias=esnet-tg -p 9202:9200 -p 9302:9300 -e "discovery.type=single-node" elasticsearch:7.17.10
docker ps | grep es

docker run -it --rm --name=request-container --net=fc-net busybox nslookup esnet-tg
docker run -it --rm --name=request-container --net=fc-net busybox nslookup 172.19.0.2
docker run -it --rm --name=request-container --net=fc-net busybox nslookup 172.19.0.3

fc-net이라는 네트워크를 만들고 –net-alias=esnet-tg 옵션을 주어서 es1, es2이름의 elasticsearch 컨테이너를 만듭니다.
docker run -it –rm –name=request-container –net=fc-net busybox nslookup esnet-tg 실행하면 es1, es2의 아이피가 나옵니다.
별칭으로 만든 esnet-tg가 두개의 아이피를 바라보기는게 중요합니다.

docker run -it --rm --name=request-container --net=fc-net centos:8 bash

curl -s esnet-tg:9200
curl -s esnet-tg:9200

docker inspect es1
docker inspect es2

컨테이너를 하나 뛰워서 esnet-tg를 사용해서 9200포트로 호출 하면 es1, es2가 번갈아 가면서(Round Robin) 호출된다.

[실습] docker DNS를 활용한 docker proxy(Loadbalancing)

docker network create driver bridge --subnet 172.200.1.0/24 --ip-range 172.200.1.0/24 --gateway 172.200.1.1 netlb 
route
docker network ls

docker run -itd --name=nettest1 --net=netlb --net-alias tg-net ubuntu:14.04
docker run -itd --name=nettest2 --net=netlb --net-alias tg-net ubuntu:14.04
docker run -itd --name=nettest3 --net=netlb --net-alias tg-net ubuntu:14.04
docker inspect nettest1 | grep IPAddress # "172.200.1.2"
docker inspect nettest2 | grep IPAddress # "172.200.1.3"
docker inspect nettest3 | grep IPAddress # "172.200.1.4"

docker run -it --name=frontend --net=netlb ubuntu:14.04 bash
 ping -c 1 tg-net
 ping -c 1 tg-net
 ping -c 1 tg-net

netlb 네트워크 브리지를 만듭니다. 조금 특이한 점이라고 느낀 건 –subnet 172.200.1.0/24 –ip-range 172.200.1.0/24 이렇게 ip대역이 기본 아이피 대역인 172.{17-31}.0.0/16을 넘어섰다는 점임입니다. 기본 대역에서만 사용해야 하는 줄 알았는데 넘어서도 유효하다고 합니다.
nettest1, nettest2, nettest3을 netlb 브리지로 연결하고 net-alias를 tg-net으로 설정한 컨테이너를 만듭니다.
ping -c 3 tg-net을 여러번 호출하면 nettest1, nettest2, nettest3이 번갈아 가면서 호출되는 것을 알 수 있습니다.

apt update 
apt-get -y install dnsutils
dig tg-net

docker net-alias가 어떤 아이피와 연결되어있는지 확인하기 위해서 dnsutils라는 패키지가 필요합니다. 설치하고 tg-net이 어떻게 연결되어있는지 확인해 봅시다.

위에서 연결한 아이피들이 잘 나오네요.

docker run –itd --name=nettest4 --net=netlb --net-alias=tg-net ubuntu:14.04
dig tg-net

net-alias를 설정하면 해당 alias에 컨테이너의 아이피가 자동으로 등록 되는 것을 확인합니다.

컨테이너 Proxy

Proxy

  • 요청자와 응답자 간의 중계 역할. 즉, 통신을 대리 수행하는 서버를 proxy server라 함.
  • Proxy server의 위치에 따라 forward proxy와 reserse proxy로 구분한다.
  • 이를 활용하면
    • Load Balancing(R)
    • 캐시 서버 구현(F, R)
    • 특정 사이트 접근 차단 구현(F)
    • 무중단 배포를 통한 서비스 지속(R)
    • SSL 암호화 적용(R)
  • 주로 사용되는게 reverse proxy이고 여기서는 이 방법을 실습 해볼 것이다.

Nginx

  • 웹서버를 실행한다. 동일 계열 점유율이 제일 높다
  • Reverse Proxy 구현이 가능하다.(https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/)
  •  Kubernetes의 ngress controller로 nginx ingress controller 선택이 가능하다.
  • API Gateway, MicroGateway 구성이 가능하다.
  • 설정은 /etc/nginx/nginx.conf 변경을 통해 구성할 수 있다.

HAproxy

  • 하드웨어 기반의 L4/L7 스위치를 대체 하기 위한 오픈소스 소프트웨어 솔루션
  • Active-Passive, Load Balancing 및 Reverse Proxy
  • 주요기능
    • ssl
    • Load Balancing
    • Active health check
    • KeepAlived(proxy 이중화)

L4: nginx Load Balancing과 같다.

L7: subdomain 별로 별도의 Load Balancing을 구현한다.

[실습] Nginx를 활용한 컨테이너 proxy

Host Nginx reverse proxy 구성

nginx 이미지를 이용해서 5001, 5002, 5003으로 포트를 사용하는 컨테이너를 만들고 reverse proxy를 구성하는 실습입니다.
강의에서 사용하는 dbgurum/nginxlb:1.0은 arm64 아키텍처인 애플실리콘을 지원하지 않아서 해당 이미지를 사용 안하고 dockerfile로 이미지를 만들어 사용했습니다.
hostos에 nginx 설치한후에 /etc/nginx/nginx.conf를 수정해서 프록시를 구성하겠습니다.

sudo apt update
sudo apt -y install nginx
cd fastcampus/ch06
vi Dockerfile

#Dockerfile
From nginx:1.25.0-alpine

RUN echo '#!/bin/sh' > /usr/local/bin/start.sh
RUN echo 'sed -i "s/80; /$SERVER_PORT;/" /etc/nginx/conf.d/default.conf' >> /usr/local/bin/start.sh
RUN echo 'echo "Listen: $SERVER_PORT<br>HOSTING: $HOSTNAME" > /usr/share/nginx/html/index.html' >> /usr/local/bin/start.sh
RUN echo 'nginx -g "daemon off;"' >> /usr/local/bin/start.sh
RUN chmod +x /usr/local/bin/start.sh 

CMD ["/usr/local/bin/start.sh"]
#Dockerfile

docker build -t nginxlb:1.0 .
docker run -it -d -e SERVER_PORT=5001 -p 5001:5001 -h alb-node01 -u root --name=albnode01 nginxlb:1.0
docker ps -a | grep alb

위의 스크립트에서 dockerfile 부분만 자세히 한번 살펴 보겠습니다. cmd에 start.sh을 실행하고 있죠? 이건 컨테이너가 생성 될 때 실행 하라는 의미입니다.
From nginx:1.25.0-alpine
nginx:1.25.0-alpine버전을 베이스 이미지로 합니다.

RUN echo ‘#!/bin/sh’ > /usr/local/bin/start.sh
/usr/local/bin/start.sh 파일을 만듭니다.

RUN echo ‘sed -i “s/80; /$SERVER_PORT;/” /etc/nginx/conf.d/default.conf’ >> /usr/local/bin/start.sh
/etc/nginx/conf.d/default.conf에서 80을 $SERVER_PORT로 변경하고 /usr/local/bin/start.sh에 추가합니다.

RUN echo ‘echo “Listen: $SERVER_PORT<br>HOSTING: $HOSTNAME” > /usr/share/nginx/html/index.html’ >> /usr/local/bin/start.sh
/usr/share/nginx/html/index.html을 Listen: $SERVER_PORT<br>HOSTING: $HOSTNAME으로 대체하는 실행문을 start.sh에 추가합니다.

RUN echo ‘nginx -g “daemon off;”‘ >> /usr/local/bin/start.sh
nginx를 백그라운드로 실행합니다.

RUN chmod +x /usr/local/bin/start.sh
start.sh에 실행권한을 부여합니다.

CMD [“/usr/local/bin/start.sh”]
컨테이너가 생성될때 한번 start.sh을 실행합니다.

이 파일로 이미지를 만들어서 컨테이너가 정상 구동하는지 확인해봅시다.

위에서 컨테이너가 잘 작동하는 것을 확인해 보았습니다. 이대로 실습을 진행 해도 되겠지만 이 이미지를 도커허브에 업로드하고 그 이미지를 사용해서 실습을 진행했습니다.

docker image tag nginxlb:1.0 junseongday/nginxlb:1.0
docker push junseongday/nginxlb:1.0

푸시한 junseongday/nginxlb:1.0을 사용해서 alb-node2, alb-node3을 만들고 브라우저에서 접근이 되는지 확인하겠습니다.

docker run -it -d -e SERVER_PORT=5002 -p 5002:5002 -h alb-node02 -u root --name=albnode02 junseongday/nginxlb:1.0
docker run -it -d -e SERVER_PORT=5003 -p 5003:5003 -h alb-node03 -u root --name=albnode03 junseongday/nginxlb:1.0

Dockerfile에서 구성한 대로 이미지가 잘 만들어져서 컨테이너 원하는 대로 작동하네요.
hostos의 /etc/nginx/nginx.conf를 수정해서 reverse proxy를 구성해 보겠습니다.

 sudo mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.org 
 sudo vi /etc/nginx/nginx.conf

#nginx.conf
events { worker_connections 1024; }
http {
    # List of application servers
    upstream backend-alb {
        server 127.0.0.1:5001;
        server 127.0.0.1:5002;
        server 127.0.0.1:5003;
    }
    # Configuration for the server
    server {
        # Running port
        listen 80 default_server;
        # Proxying the connections
        location / {
            proxy_pass http://backend-alb;
        }
    }
} 
#nginx.conf

sudo systemctl restart nginx.service
sudo systemctl status nginx.service

[videopress HWf1vIJ2]

실습에 사용한 nginx를 삭제하고 다음 실습을 진행하겠습니다.

sudo systemctl stop nginx.service
sudo cp /etc/nginx/nginx.conf ./ # 설정 파일은 카피해 놓겠습니다
sudo apt autoremove nginx -y
sudo netstat -nlp | grep 80

Nginx container reverse proxy 구성

이번 에는 nginx를 컨테이너로 만들어서 컨테이너를 수정해서 proxy를 구성해보겠습니다. 위와 거의 동일 하기에 어렵지 않습니다.

 docker run -d -p 8001:80 --name=proxy-container nginx:1.25.0-alpine
vi nginx.conf
#nginx.conf
events { worker_connections 1024; }
http {
    # List of application servers
    upstream backend-alb {
        server 127.0.0.1:5001;
        server 127.0.0.1:5002;
        server 127.0.0.1:5003;
    }
    # Configuration for the server
    server {
        # Running port
        listen 80 default_server;
        # Proxying the connections
        location / {
            proxy_pass http://backend-alb;
        }
    }
}
#nginx.conf

docker cp nginx.conf proxy-container:/etc/nginx/nginx.conf
docker restart proxy-container

curl localhost:8001
curl localhost:8001
curl localhost:8001

복사해 두었던 nginx.conf를 새로 생성한 컨테이너에 복사하고 컨테이너를 재시작하자.
컨테이너를 여러번 호출하면 3개의 컨테이너가 순차적으로 호출되는 것을 알 수 있다.

[실습]HAProxy를 활용한 컨테이너 proxy

이번에는 HAProxy를 사용해서 L4, L7을 구현해보겠습니다.

HAproxy container 구성(L4)

docker network create proxy-net 
docker network ls
route

docker run -d --name=echo-web1 --net=proxy-net -p 8081:80 -h echo-web1 ealen/echo-server
docker run -d --name=echo-web2 --net=proxy-net -p 8082:80 -h echo-web2 ealen/echo-server
docker run -d --name=echo-web3 --net=proxy-net -p 8083:80 -h echo-web3 ealen/echo-server

curl localhost:8081?query=demo
curl localhost:8082?query=demo
curl localhost:8083?query=demo

강에서는 컨테이너 이미지를 dbgurum/haproxy:echo를 사용했는데 arm64를 지원 하지 않아서 ealen/echo-server를 사용해서 실습을 했습니다. 콜하면 어떤 콜이 왔는지 리턴을 해주는 이미지입니다. 컨테이너를 생성후 각각의 컨테이너를 콜해서 응답값을 확인해 보았습니다.

 

cd ~/fastcampus/ch06 && mkdir conf && cd $_
vi haproxy.cfg
#haproxy.cfg 
global
  stats socket /var/run/api.sock user haproxy group haproxy mode 660 level admin expose-fd listeners
  log stdout format raw local0 info

defaults
  mode http
  timeout client 10s
  timeout connect 5s
  timeout server 10s
  timeout http-request 10s
  log global

frontend stats
  bind *:8404
  stats enable
  stats uri /
  stats refresh 10s

frontend myfrontend
  bind :80
  default_backend webservers

backend webservers
  server s1 echo-web1:8081 check
  server s2 echo-web2:8082 check
  server s3 echo-web3:8083 check
#haproxy.cfg

docker run -d --name=haproxy-container --net=proxy-net -p 80:80 -p 8404:8404 -v $(pwd):/usr/local/etc/haproxy:ro haproxytech/haproxy-alpine:2.5
docker ps 
docker port haproxy-container

curl localhost:80 
curl localhost:80
curl localhost:80 

haproxy.cfg를 작성해서 컨테이너의 /usr/local/etc/haproxy에 볼륨으로 연결했습니다. 그 내용을 같이 확인해 보겠습니다.

frontend stats
  bind *:8404
  stats enable
  stats uri /
  stats refresh 10s
==> 브라우저에서 8084번으로 접근하면 통계를 보여준다.

frontend myfrontend
  bind :80
  default_backend webservers
==> 80 포트로 접근하는 uri를 webservers서버로 보낸다

backend webservers
  server s1 192.168.101.68:8081 check
  server s2 192.168.101.68:8082 check
  server s3 192.168.101.68:8083 check
==> 웹서버로 온 요청들을 순차적으로 호출한다.

 HAproxy container 구성(L7 URI 방식)-1

이번 실습은 80포트는 기존대로 Round Robin 방식으로 작동하고 /echo-web1일때 echo-web1, /echo-web2일때 echo-web2, /echo-web3일때 echo-web3으로 매칭 되도록  컨테이너를 수정하겠습니다. 서브 도메인을 연결하는 것인데 이런 연결이 가능해서 High Available proxy라고 부르고 있습니다.

vi haproxy.cfg
#haproxy.cfg  global stats socket /var/run/api.sock user haproxy group haproxy mode 660 level admin expose-fd listeners log stdout format raw local0 info defaults mode http timeout client 10s timeout connect 5s timeout server 10s timeout http-request 10s log global frontend stats bind *:8404  stats enable  stats uri /   stats refresh 10s frontend myfrontend bind :80 default_backend webservers acl echo-web1 path_beg /echo-web1 acl echo-web2 path_beg /echo-web2 acl echo-web3 path_beg /echo-web3 use_backend echo-web1_backend if echo-web1 use_backend echo-web2_backend if echo-web2 use_backend echo-web3_backend if echo-web3 backend webservers balance roundrobin server s1 192.168.101.68:8081 check server s2 192.168.101.68:8082 check server s3 192.168.101.68:8083 check backend echo-web1_backend server s1 192.168.101.68:8081 check backend echo-web2_backend server s2 192.168.101.68:8082 check backend 192.168.101.68_backend server s3 echo-web3:8083 check #haproxy.cfg docker stop haproxy-container docker rm haproxy-container docker run -d --name=haproxy-container --net=proxy-net -p 80:80 -p 8404:8404 -v $(pwd):/usr/local/etc/haproxy:ro<br />haproxytech/haproxy-alpine:2.5

frontend myfrontend
  bind :80
  default_backend webservers

  acl echo-web1 path_beg /echo-web1
  acl echo-web2 path_beg /echo-web2
  acl echo-web3 path_beg /echo-web3

  use_backend echo-web1_backend if echo-web1
  use_backend echo-web2_backend if echo-web2
  use_backend echo-web3_backend if echo-web3
==> 80번 포트는 webservers로 전달한다.
그런데 패스가 echo-web1이면 echo-web1 서버로 전달한다.
마찬가지로 패스가 echo-web2이면 echo-web2 서버로 전달한다.
패스가 echo-web3이면 echo-web3 서버로 전달한다.

backend webservers
  balance roundrobin
  server s1 192.168.101.68:8081 check
  server s2 192.168.101.68:8082 check
  server s3 192.168.101.68:8083 check
==>웹서버로 온 요청들을 순차적으로 호출한다.

backend echo-web1_backend
  server s1 192.168.101.68:8081 check
==> 192.168.101.68:8081 전달

backend echo-web2_backend
  server s2 192.168.101.68:8082 check
==> 192.168.101.68:8082 전달

backend echo-web3_backend
  server s3 192.168.101.68:8083 check
==> 192.168.101.68:8083 전달

 HAproxy container 구성(L7 URI 방식)-2

vi haproxy.cfg
#haproxy.cfg  global stats socket /var/run/api.sock user haproxy group haproxy mode 660 level admin expose-fd listeners log stdout format raw local0 info defaults mode http timeout client 10s timeout connect 5s timeout server 10s timeout http-request 10s log global frontend myfrontend bind :80 default_backend webservers acl echo-web1-item path_beg /item acl echo-web2-item path_beg /item acl echo-web3-basket path_beg /basket acl echo-web4-basket path_beg /basket use_backend echo-web1_backend if echo-web1-item use_backend echo-web1_backend if echo-web2-item use_backend echo-web2_backend if echo-web3-basket use_backend echo-web2_backend if echo-web4-basket backend webservers balance roundrobin server s1 192.168.101.68:8081 check server s2 192.168.101.68:8082 check server s3 192.168.101.68:8083 check server s4 192.168.101.68:8084 check backend echo-web1_backend server s1 192.168.101.68:8081 check server s2 192.168.101.68:8082 check backend echo-web2_backend server s3 192.168.101.68:8083 check server s4 192.168.101.68:8084 check #haproxy.cfg stop haproxy-container stop echo-web1 echo-web2 stop echo-web3 echo-web4 cexrm docker run -d --name=echo-web1-item --net=proxy-net -p 8081:80 -h echo-web1-item ealen/haproxy:echo docker run -d --name=echo-web2-item --net=proxy-net -p 8082:80 -h echo-web2-item ealen/haproxy:echo docker run -d --name=echo-web3-basket --net=proxy-net -p 8083:80 -h echo-web3-basket ealen/haproxy:echo docker run -d --name=echo-web4-basket --net=proxy-net -p 8084:80 -h echo-web4-basket ealen/haproxy:echo docker run -d --name=haproxy-container --net=proxy-net -p 80:80 -p 8404:8404 -v $(pwd):/usr/local/etc/haproxy:ro haproxytech/haproxy-alpine:2.5

Leave A Reply

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다