이번 글은 필수가 아니다.
만약 자신의 공인IP를 공개할 수 없거나 80포트를 열 수 없는 경우,
포트포워딩 없이 인터넷만 연결되어있다면docker-compose
만으로 어디서든 배포하고 싶다면,
이번 글에 나오는Cloudflare Argo Tunnel
을 고려해 보길 바란다.
서버를 Cloudflare에 연결하기 전,
간단히 Argo Tunnel
이 어떻게 구성되고 작동하는지 알아보자
먼저 우리의 서버가 Cloudflared
프로그램을 설치한다.
이를 통해, 우리 서버는 Cloudflare 서버에 요청을 보내 양방향 통신을 체결한다.
그리고 우리는 우리의 서버에 할당된 고유 ID와 도메인을 연결한다.
만약, 누가 우리의 도메인으로 요청을 보내면 Cloudflare 서버가 이를 받고,
앞서 체결한 양방향 통신을 통해 우리 서버로 전달해 준다.
양방향 통신을 우리 서버에서 요청하여 체결하므로,
인터넷만 연결되어있다면 사설망이나 포트 개방이 불가능한 상태여도 웹서비스를 운영할 수 있다.
사진 출처: Cloudflare 기술 블로그
앞서 설명한 Argo Tunnel
을 구축하기 위한 Cloudflare 대시보드 설정을 진행해보자
먼저, Cloudflare에 등록된 도메인이 있어야 한다.
없다면 아래의 링크를 참고하여 Cloudflare에 등록하도록 하자
a. 왼쪽 사이드바에 Zero Trust
를 눌러 Zero Trust Dashboard
에 접속
b. Zero Trust Dashboard
안에 있는 사이드바에서 Access
-> Tunnels
로 접속
c. Create a Tunnel
버튼을 눌러 터널을 생성해보자
d. 터널 이름은 자신의 서버를 식별 할 수 있는 이름으로 정하고, Save tunnel
을 클릭해 저장합니다.
e. Docker
환경을 선택하고 아래 명령어의 --token
이하 내용 만 복사한다.
복사를 했다면 아래로 스크롤해 Next
버튼을 눌러 넘어간다.
f. 일단 테스트를 위해 Portainer
만 연결 해보겠다.
Public hostname
에서 서브도메인을 설정하고 본인의 도메인을 선택한 뒤,
Service
에서 Portainer의 내부 hostname과 포트에 맞춰 설정해준다.
0편에 소개 되었던 docker-compose.yml을 불러와보자
version: "3.7"
services:
portainer-ce:
container_name: main-portainer
image: portainer/portainer-ce:latest
restart: always
expose:
- "8000"
- "9000"
- "9443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./portainer/data:/data
- /etc/localtime:/etc/localtime:ro
networks:
- main_net
tunnel:
container_name: main-cloudflared-tunnel
image: cloudflare/cloudflared:latest
restart: unless-stopped
command: tunnel run
env_file:
- .env
networks:
- main_net
networks:
main_net:
driver: bridge
위의 docker-compose.yml
파일은 Portainer
와 Cloudflared
이미지를 배포한다.
해당 파일을 (원하는 폴더)/main/
에 저장 해주자
나는 ~/main/
에 저장하도록 하겠다.
.env
파일을 만들어 2-(1) Tunnel 생성
단계에서 복사한 내용을 붙여넣기 한다.
TUNNEL_TOKEN=여기에 복사
이제는 실행해보자
sudo docker-compose up
을 실행해 Portainer
와 Cloudflared
를 실행하면,
자동으로 아까 생성한 터널과 양방향 통신이 시작된다.
Zero Trust Dashboard
안에 있는 사이드바에서 Access
-> Tunnels
로 접속하여,
Status
가 Healthy
이면 정상적으로 연결된 것이다.
https://설정한 Public hostname
으로 접속해 Portainer
화면이 잘 나온다면 성공이다.
위와 같은 방법으로 추후에 배포할 인증서버도 연결하면 된다.
다음 글에는 .env
파일을 통한 PostgresSQL
, Redis
연결 방법을 올려보겠다.