IP 바뀌면 서비스 망해요?
생각해보니 현 서버 구조에서는 문제가 하나 있다
바로 IP가 바뀌면 서비스가 전부 종료된다는 것이다
특히 그 서버의 물리적인 거리가 나와 멀수록 서비스 복구에 더 오랜 시간이 걸리겠지...
이 무슨 크리티컬한 이슈여...
심지어 나는 아파트의 IP가 바뀜으로 인해 서버에 접속 못 해본 경험이 있다
그런데? DuckDNS에서 IP가 바뀌더라도 알아서 IP를 갱신해서 DNS를 유지해준다면...?
참 편리하겠죠? 지금부터 해보겠습니다.
1. Docker Compose로 DuckDNS 갱신 컨테이너 띄우기
우선 DuckDNS의 토큰을 이용해 주소를 자동으로 갱신해주는 컨테이너가 있다
우리는 이번에 이것을 쓸 것이다
사용법은 친절히도 공홈에 다 적혀있다
상세한 내용이 궁금하다면 아래 공식 홈페이지 링크를 참고하자
docker-compose랑 docker, 둘 다 각각 어떻게 띄우는지 상세히 나와있음
https://hub.docker.com/r/linuxserver/duckdns
https://hub.docker.com/r/linuxserver/duckdns
hub.docker.com
https://github.com/linuxserver/docker-duckdns/pkgs/container/duckdns
GitHub · Build and ship software on a single, collaborative platform
Join the world's most widely adopted, AI-powered developer platform where millions of developers, businesses, and the largest open source community build software that advances humanity.
github.com
2. docker-compose로 duckdns 컨테이너 띄우기
아무튼 나는 docker-compose 버전을 쓸 것이다
아래는 실행 코드 샘플 (출처 : 공홈)
docker-compose.yml 버전

services:
duckdns:
image: lscr.io/linuxserver/duckdns:latest
container_name: duckdns
network_mode: host #optional
environment:
- PUID=1000 #optional
- PGID=1000 #optional
- TZ=Etc/UTC #optional
- SUBDOMAINS=subdomain1,subdomain2
- TOKEN=token
- UPDATE_IP=ipv4 #optional
- LOG_FILE=false #optional
volumes:
- /path/to/duckdns/config:/config #optional
restart: unless-stopped
docker 버전

docker run -d \
--name=duckdns \
--net=host `#optional` \
-e PUID=1000 `#optional` \
-e PGID=1000 `#optional` \
-e TZ=Etc/UTC `#optional` \
-e SUBDOMAINS=subdomain1,subdomain2 \
-e TOKEN=token \
-e UPDATE_IP=ipv4 `#optional` \
-e LOG_FILE=false `#optional` \
-v /path/to/duckdns/config:/config `#optional` \
--restart unless-stopped \
lscr.io/linuxserver/duckdns:latest
내가 작성한 예시는 아래와 같이 docker-compose.yml에 작성해두었다
웬만한 것들은 관리하기 편하도록 .env 파일로 다 빼뒀음
Duck DNS 토큰 확인 방법
아 토큰 값은 duckdns 홈페이지 가서 로그인하면 확인할 수 있다
옵션 설명
옵션 설명도 공홈에 있지만 간단히 설명하면 아래와 같다
--net=host | 호스트 네트워크를 사용하여 IPv6 탐지를 가능하게 함 |
-e PUID=1000 | 컨테이너에서 실행할 사용자(User)의 ID로, 파일 권한 문제를 피하기 위해 사용됨 |
-e PGID=1000 | 컨테이너에서 실행할 그룹(Group)의 ID로, 이 역시 파일 권한 관리에 사용됨 |
-e TZ=Etc/UTC | 컨테이너 시간대를 설정함 (e.g. Asia/Seoul, Etc/UTC 등) |
-e SUBDOMAINS=sub1,sub2 | DuckDNS에서 사용할 서브도메인들 (쉼표로 구분, 공백 없이 입력)(e.g. myhome,server) |
-e TOKEN=token | DuckDNS 웹사이트에서 발급받은 API 토큰을 입력함 |
-e UPDATE_IP=ipv4 | 어떤 IP를 업데이트할지 지정 - ipv4, ipv6, both. both는 IPv4와 IPv6 둘 다 갱신. |
-e LOG_FILE=false | 로그 파일 생성 여부 (true로 설정하면 로그를 /config 경로에 저장함) |
-v /config | 설정 파일을 저장할 볼륨 마운트 경로 (LOG_FILE=true일 경우 로그도 여기에 저장됨) |
--read-only=true | 컨테이너를 읽기 전용 모드로 실행함. (컨테이너를 수정할 수 없게 만들어 보안성 up) 문서 참조 |
3. 동작 테스트
도커로 띄우고 나면 아래와 같은 로그를 볼 수 있다
테스트는 아래처럼 하면 된다
# 템플릿
curl "https://www.duckdns.org/update?domains=서브도메인&token=토큰&ip=현재IP"
보내고 나면 OK 응답이 와야 정상이다
물론 이 방법보단 IP를 직접 바꾸고 테스트 하는 것이 더 정확하긴 하다!
다만 IP를 직접 바꿔보는 것은 조만간 해볼 예정이라서 지금은 패스
일단 IP 변경으로 인한 DNS 자동 갱신 시스템을 구축해둔 것으로 만족!
'Infra > Docker' 카테고리의 다른 글
[서버 보안 시리즈 #2] 서버에 Fail2Ban 적용하기 (1) | 2025.06.09 |
---|---|
[서버 보안 시리즈 #1] Nginx 필터링으로 악성 요청 차단하기 (1) | 2025.06.05 |
Docker 컨테이너를 restart 할 때, depends_on으로 묶인 컨테이너도 같이 재시작이 되는가? (0) | 2025.05.30 |
docker 명령어에서 -u www-data의 의미는? (0) | 2025.04.17 |
MySQL 컨테이너 내부에서 SQL 명령어 사용하기 (feat. Docker) (0) | 2025.04.15 |