728x90

서버의 환경을 해치지 않으면서
이미지로 공급되는 어플리케이션간의 통신을 
구현해야 하는 경우가 많이 있습니다. 

외부로 노출은 nginx로 제한하고
실제 각 어플리케이션 접근을
nginx의 location 지시자를 이용하는 경우가 
대표적인 시나리오입니다. 

사용자에 대한 노출은 nginx endpoint 만하고 싶다면?

docker-compose로 다수 컨테이너 구동하기

이 구성을 위해서는 docker-compose를 이용해서 
복수의 컨테이너를 하나의 설정으로 만들어
컨테이너를 배포하는 것이 눈에 잘 들어오고 편리합니다. 

속도 측정을 위한 오픈소스 어플리케이션인
librespeed를 별도의 컨테이너로 띄워두고
nginx도 별도로 구동하기 위해서는 
다음과 같은 설정을 활용할 수 있습니다. 

version: "2"
services:
  nginx:
    container_name: nginx-test
    image: nginx
    ports:
    - 443:443
  speedtest:
    container_name: speedtest
    image: adolfintel/speedtest
    environment:
    - MODE=standalone
    ports:
    - 80:80

nginx의 설정파일은 아래와 같습니다.

upstream speedtest {
    server speedtest:80;
}

server {
    listen      443 ssl;
    server_name example.com;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    ssl_certificate /etc/nginx/cert/fullchain.crt;
    ssl_certificate_key /etc/nginx/cert/private.key;

    access_log  /var/log/nginx/access.log main;
    error_log /var/log/nginx/error.log debug;

    location / {
        proxy_pass http://speedtest;
    }
}

컨테이너가 잘 뜰까요? 그렇지 않습니다. 
nginx는 speedtest 이름을 찾을 수 없어서 
업스트림 호스트를 찾을 수 없다는 에러를 뿜습니다.

2022/06/18 03:16:21 [emerg] 1#1: host not found in upstream "speedtest:80" in /etc/nginx/conf.d/default.conf:7
2022/06/18 03:20:00 [emerg] 1#1: host not found in upstream "speedtest:80" in /etc/nginx/conf.d/default.conf:7
2022/06/18 03:34:04 [emerg] 1#1: host not found in upstream "speedtest:80" in /etc/nginx/conf.d/default.conf:7

docker-compose 파일을 수정하여 
별도의 bridge 네트워크를 만들어
두 컨테이너가 서로 통신하도록 해보겠습니다. 

docker bridge 네트워크 구성하기

docker는 다양한 네트워크를 구성을 제공합니다. 
그 중에서 우리의 요건에 맞는 것은 bridge 네트워크입니다. 
말그대로 다리처럼 컨테이너들이 소통할 수 있는 구조입니다. 

네, 그렇다고 합니다 (출처 : https://docs.docker.com/network/bridge/)

앞서 만들었던 docker-compose 파일에 
아래와 같이 network 설정을 추가했습니다. 

version: "2"
services:
  nginx:
    container_name: nginx-test
    image: nginx
    ports:
    - 443:443
    networks:
    - backbone
  speedtest:
    container_name: speedtest
    image: adolfintel/speedtest
    environment:
    - MODE=standalone
    networks:
    - backbone
    ports:
    - 80:80
networks:
  backbone:
    driver: bridge

이번엔 잘 될까요?
설레는 마음으로 sudo docker-compose up을 해봤습니다. 
그리고 브라우저에서 도메인에 접속해보니...

떴다!

 

네, 다행히 기대한 대로 잘 동작했습니다. 
nginx 설정에서도 업스트림 서버 이름으로 
컨테이너 이름을 사용할 수 있어서 편리합니다.
컨테이너간 통신, 어렵지 않네요!

728x90

+ Recent posts