전 포스트에서는 단순히 daemon.json 파일을 이용해 도커 데몬의 DNS를 고정시키는 방식을 진행했다. 하지만 지금 이 포스트를 보고있다는 건, 해당 방식으로는 해결이 되지 않았다는 뜻일 것이다.
일단, 상세한 트러블슈팅을 위해 당시 서버의 상황을 서술한다.
- 개발 서버(이하 서버)를 모종의 이유로 standalone 쿠버네티스 클러스터로 구동해야 할 이유가 있었다. 그것도 호스트 네트워크로 운영중인 Ubuntu18.04 컨테이너 위에서.
- 해당 사업이 종료되고, 서버를 반환받아 쿠버네티스 클러스터를 철거하고 다시 개발용 서버로 구동시켰었는데, 어찌된 일인지 자꾸 DNS가 127.0.0.53 및 10.233.0.3을 보고 있었다.
- DNS만 봐도 쿠버네티스 내부의 DNS를 보고있는 것이 확실해졌다. 그러나 쿠버네티스의 모듈들은 모두 철거된 이후라서 대체 어떤 녀석이 도커의 DNS를 자꾸 가로채가는지 알 수 없었다.
- daemon.json을 추가하는 방식으로는 systemctl로 매번 도커 모듈을 재시작할때마다 DNS 중복 설정으로 인해 도커가 가동되지 못했다.
- 해결하기엔 다른 긴급 사안이 조금 많았으므로, 데몬을 중지시키고 nohup 및 출력을 /dev/null로 리디렉션 하는 방식으로 데몬을 구동시키고, 해당 명령을 init.d/에 등록하여 사용하고 있었다.
- 그러나 빈번하게 발생하는 DNS오류에 결국 칼을 빼들었다.
daemon.json
파일을 /etc/docker/
폴더에 넣고 systemctl start docker
명령어를 실행시키면 아마 이런 메세지가 뜨면서 도커 서비스가 실패할 것이다.
root@dev-server:/etc/docker# systemctl restart docker
Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xe" for details.
명령어에 따르면 journalctl -xe
명령어로 로그를 확인할 수 있는 듯 하다. 그래서 해당 명령어로 도커의 로그를 확인한다.
root@dev-server:/etc/docker# journalctl -xe
...
10월 13 12:40:50 dev-server dockerd[38432]: unable to configure the Docker daemon with file /etc/docker/daemon.json: the following directives are specified both as a flag and in the configuration file: dns: (from flag: [10.233.0.3 127.0.0.53], from file: [8.8.8.8 8.8.4.4])
...
설정 파일 및 실행 명령어의 플래그 양쪽에서 DNS를 지정하고 있는데, 이게 문제가 되는 것 같다. 그럼 둘 중 하나를 제거해주면 되는데, 설정 파일의 경우 우리가 DNS를 옳게 설정했으므로 목표로하는 DNS이므로 이게 달라져서는 안된다. 즉, 실행 명령어에 박혀있는 플래그를 바꿔줘야 한다는 뜻이다.
처음에는 도커의 설정 파일이 문제라고 생각해 config 폴더를 찾아 DNS를 확인했다. 위치는 각각 다음과 같다.
- /etc/init/docker.conf
- /etc/init.d/docker
그러나 해당 파일에는 모두 DNS가 8.8.8.8로 정상 세팅되었다. 여기서 혼란이 오기 시작한다. 그래서 find 명령어로 관련 파일들을 이잡듯이 뒤지다 보니 발견한 위치가 하나 있었다.
# vim /etc/systemd/system/docker.service.d/docker-dns.conf
[Service]
Environment="DOCKER_DNS_OPTIONS=\
--dns 10.233.0.3 --dns 127.0.0.53 \
--dns-search default.svc.cluster.local --dns-search svc.cluster.local \
--dns-opt ndots:2 --dns-opt timeout:2 --dns-opt attempts:2 \
"
빙고. 정답이다. 이 녀석의 DNS를 원래의 8.8.8.8
및 8.8.4.4
로 수정해준다.
# vim /etc/systemd/system/docker.service.d/docker-dns.conf
[Service]
Environment="DOCKER_DNS_OPTIONS=\
--dns 8.8.8.8 --dns 8.8.4.4 \
--dns-search default.svc.cluster.local --dns-search svc.cluster.local \
--dns-opt ndots:2 --dns-opt timeout:2 --dns-opt attempts:2 \
"
그리고 저장하고 나오면, 아래와 같은 경고 문구가 뜬다.
Warning: The unit file, source configuration file or drop-ins of docker.service changed on disk. Run 'systemctl daemon-reload' to reload units.
설정 파일이 변경되었으니 서비스 데몬을 재시작하라는 뜻이다. 명령어를 입력해준다.
systemctl daemon-reload
이제 도커 서비스를 재시작해준다.
systemctl start docker
이제 도커가 정상적으로 실행된다.