서버의 환경을 해치지 않으면서
이미지로 공급되는 어플리케이션간의 통신을
구현해야 하는 경우가 많이 있습니다.
외부로 노출은 nginx로 제한하고
실제 각 어플리케이션 접근을
nginx의 location 지시자를 이용하는 경우가
대표적인 시나리오입니다.
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 네트워크입니다.
말그대로 다리처럼 컨테이너들이 소통할 수 있는 구조입니다.
앞서 만들었던 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 설정에서도 업스트림 서버 이름으로
컨테이너 이름을 사용할 수 있어서 편리합니다.
컨테이너간 통신, 어렵지 않네요!