IPv6 네트워킹 사용하기
IPv6 네트워킹 사용하기 (Use IPv6 networking)
IPv6는 Linux 호스트에서 실행되는 Docker 데몬에서만 지원돼요.
출처: 문서
본문
IPv6 네트워크 생성 (Create an IPv6 network)
docker network create사용:
$ docker network create --ipv6 ip6net
docker network create로 IPv6 서브넷 지정:
$ docker network create --ipv6 --subnet 2001:db8::/64 ip6net
- Docker Compose 파일 사용:
networks:
ip6net:
enable_ipv6: true
ipam:
config:
- subnet: 2001:db8::/64
Note 이 예시들의
2001:db8::/64주소는 문서 사용용으로 예약된 주소예요.fd00::/8의 Unique Local Address (ULA) 서브넷 같은 유효한 IPv6 네트워크로 바꾸세요.
이제 ip6net 네트워크에 연결되는 컨테이너를 실행할 수 있어요.
$ docker run --rm --network ip6net -p 80:80 traefik/whoami
이렇게 하면 IPv6와 IPv4 양쪽에서 포트 80이 게시돼요. IPv6 루프백 주소의 포트 80에 curl로 연결해 IPv6 연결을 확인할 수 있어요:
$ curl http://[::1]:80
Hostname: ea1cfde18196
IP: 127.0.0.1
IP: ::1
IP: 172.17.0.2
IP: 2001:db8::2
IP: fe80::42:acff:fe11:2
RemoteAddr: [2001:db8::1]:37574
GET / HTTP/1.1
Host: [::1]
User-Agent: curl/8.1.2
Accept: */*
기본 브리지 네트워크에 IPv6 사용 (Use IPv6 for the default bridge network)
다음 단계는 기본 브리지 네트워크에서 IPv6를 사용하는 방법을 보여줘요.
/etc/docker/daemon.json에 있는 Docker 데몬 구성 파일을 편집해요. 다음 매개변수를 구성해요:
{
"ipv6": true,
"fixed-cidr-v6": "2001:db8:1::/64"
}
Note 이 예시의
2001:db8:1::/64주소는 문서 사용용으로 예약된 주소예요.fd00::/8의 Unique Local Address (ULA) 서브넷 같은 유효한 IPv6 네트워크로 바꾸세요.
* `ipv6`은 기본 네트워크에서 IPv6 네트워킹을 활성화해요.
* `fixed-cidr-v6`은 기본 브리지 네트워크에 서브넷을 할당해 동적 IPv6 주소 할당을 활성화해요.
* `ip6tables`은 추가 IPv6 패킷 필터 규칙을 활성화해 네트워크 격리와 포트 매핑을 제공해요. 기본적으로 활성화되어 있지만 비활성화할 수 있어요.
- 구성 파일을 저장해요.
- Docker 데몬을 재시작해 변경 사항을 적용해요.
$ sudo systemctl restart docker
이제 기본 브리지 네트워크에서 컨테이너를 실행할 수 있어요.
$ docker run --rm -p 80:80 traefik/whoami
이렇게 하면 IPv6와 IPv4 양쪽에서 포트 80이 게시돼요. IPv6 루프백 주소의 포트 80에 요청을 보내 IPv6 연결을 확인할 수 있어요:
$ curl http://[::1]:80
Hostname: ea1cfde18196
IP: 127.0.0.1
IP: ::1
IP: 172.17.0.2
IP: 2001:db8:1::242:ac12:2
IP: fe80::42:acff:fe12:2
RemoteAddr: [2001:db8:1::1]:35558
GET / HTTP/1.1
Host: [::1]
User-Agent: curl/8.1.2
Accept: */*
동적 IPv6 서브넷 할당 (Dynamic IPv6 subnet allocation)
docker network create --subnet=<your-subnet>으로 사용자 정의 네트워크에 서브넷을 명시적으로 구성하지 않으면 그 네트워크들은 데몬의 기본 주소 풀을 폴백으로 사용해요. 이는 enable_ipv6을 true로 설정한 Docker Compose 파일에서 만든 네트워크에도 적용돼요.
Docker Engine의 default-address-pools에 IPv6 풀이 포함되어 있지 않고 --subnet 옵션도 주어지지 않으면, IPv6가 활성화될 때 Unique Local Addresses (ULAs)가 사용돼요. 이 /64 서브넷은 Docker Engine의 무작위 생성 ID를 바탕으로 한 40비트 Global ID를 포함해 높은 고유성 확률을 줘요.
기본 제공 주소 풀 구성은 Subnet allocation에 나와 있어요. 어떤 IPv6 풀도 포함하지 않아요.
동적 주소 할당을 위해 다른 IPv6 서브넷 풀을 사용하려면 데몬의 주소 풀을 다음과 같이 수동으로 구성해야 해요:
- 기본 IPv4 주소 풀
- 자신의 IPv6 풀 하나 이상
다음 예시는 IPv4와 IPv6 풀이 있는 유효한 구성을 보여줘요. 두 풀 모두 256개의 서브넷을 제공해요. /24 프리픽스 길이의 IPv4 서브넷은 /16 풀에서 할당돼요. /64 프리픽스 길이의 IPv6 서브넷은 /56 풀에서 할당돼요.
{
"default-address-pools": [
{ "base": "172.17.0.0/16", "size": 24 },
{ "base": "2001:db8::/56", "size": 64 }
]
}
Note 이 예시의
2001:db8::주소는 문서 사용용으로 예약된 주소예요. 유효한 IPv6 네트워크로 바꾸세요. 기본 IPv4 풀은 사설 주소 범위에서 오는데, 기본 IPv6 ULA 네트워크와 비슷해요.
default-address-pools에 대한 자세한 내용은 Subnet allocation을 참고하세요.
Docker in Docker
nftables 대신 xtables(레거시 iptables)를 사용하는 호스트에서는 IPv6 Docker 네트워크를 만들기 전에 커널 모듈 ip6_tables가 로드되어야 해요. 보통 Docker가 시작될 때 자동으로 로드돼요.
하지만 최근 버전의 공식 docker 이미지를 기반으로 하지 않는 Docker in Docker를 실행 중이라면 호스트에서 modprobe ip6_tables를 실행해야 할 수도 있어요. 또는 데몬 옵션 --ip6tables=false를 사용해 컨테이너화된 Docker Engine의 ip6tables를 비활성화할 수 있어요.