가상머신 위에 Docker 를 올릴 때 커널 파라미터를 미리 손봐 두면 컨테이너 수가 늘었을 때 생기는 conntrack 포화 · 파일 디스크립터 부족 · inotify 한도 초과를 막을 수 있다. 아래 값은 컨테이너 수십 개 규모의 범용 호스트 기준이며, 데이터베이스나 Kubernetes 노드는 각 제품 문서의 값을 우선한다.
/etc/sysctl.d/99-docker.conf 로 두면 배포판 기본값 파일과 섞이지 않는다.
# 네트워크
net.ipv4.ip_forward = 1
net.ipv4.ip_nonlocal_bind = 1
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 16384
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
net.netfilter.nf_conntrack_max = 262144
# 파일 · 감시
fs.file-max = 2097152
fs.inotify.max_user_watches = 524288
fs.inotify.max_user_instances = 512
# 보안
net.ipv4.tcp_syncookies = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
sysctl --system
sysctl net.ipv4.ip_forward net.netfilter.nf_conntrack_max
net.ipv4.ip_forward 는 브리지 네트워크의 컨테이너가 바깥과 통신하는 데 필수다. Docker 데몬이 기동하면서 스스로 켜지만 명시해 두면 재부팅 뒤 다른 도구가 끄는 일을 막는다.
nf_conntrack_max 는 NAT 를 거치는 연결 수의 상한이다. 컨테이너가 많고 연결이 잦으면 기본값에서 nf_conntrack: table full, dropping packet 이 커널 로그에 찍히면서 연결이 끊긴다. nf_conntrack 모듈이 로드되기 전에는 이 키 자체가 없어 sysctl --system 이 "cannot stat" 을 낸다. Docker 를 한 번 띄운 뒤 적용하거나 modprobe nf_conntrack 을 먼저 한다.
fs.inotify.* 는 파일 변경을 감시하는 애플리케이션(개발 서버 · 로그 수집기)이 ENOSPC 를 내는 원인이다. fs.file-max 는 시스템 전체 한도이고 프로세스별 한도는 ulimit 이므로 둘 다 봐야 한다.
tcp_tw_reuse 는 나가는 연결에만 영향을 주어 비교적 안전하다. 같이 묶여 돌아다니는 tcp_tw_recycle 은 커널 4.12 에서 제거됐으므로 옛 문서의 값을 그대로 옮기지 않는다.
Kubernetes 노드라면 여기에 net.bridge.bridge-nf-call-iptables = 1 · net.bridge.bridge-nf-call-ip6tables = 1 과 br_netfilter 모듈 로드가 더 필요하다.