docker network create
docker network create
docker network create 명령은 네트워크를 생성합니다.
출처: 문서
본문
새 네트워크를 만드는 명령어예요. DRIVER는 내장 네트워크 드라이버인 bridge 또는 overlay를 받아요. 타사 또는 사용자 정의 네트워크 드라이버를 설치했다면 여기에 해당 DRIVER를 지정할 수도 있어요. --driver 옵션을 지정하지 않으면 명령이 자동으로 bridge 네트워크를 만들어요.
Docker Engine을 설치하면 자동으로 bridge 네트워크가 만들어져요. 이 네트워크는 Docker Engine이 전통적으로 의존해 온 docker0 브리지에 해당해요. docker run으로 새 컨테이너를 시작하면 자동으로 이 브리지 네트워크에 연결돼요. 이 기본 브리지 네트워크는 제거할 수 없지만, network create 명령으로 새 것을 만들 수는 있어요.
$ docker network create -d bridge my-bridge-network
브리지 네트워크는 단일 Docker Engine 설치의 격리된 네트워크예요. Docker Engine을 실행하는 여러 Docker 호스트에 걸쳐 있는 네트워크를 만들려면 Swarm 모드를 활성화하고 overlay 네트워크를 만들어야 해요. Swarm 모드의 오버레이 네트워크에 대한 자세한 내용은 "*overlay 네트워크 사용*" 문서를 참고해요.
스웜 모드를 활성화하면 swarm 스코프의 오버레이 네트워크를 만들 수 있어요:
$ docker network create --scope=swarm --attachable -d overlay my-multihost-network
기본적으로 swarm 스코프 네트워크는 수동으로 시작한 컨테이너가 연결되는 것을 허용하지 않아요. 이 제한은 swarm 클러스터의 비매니저 노드에 접근 권한이 있는 사람이 swarm 서비스의 네트워크 스택에 접근할 수 있는 컨테이너를 실행하지 못하도록 막기 위해 추가된 것이에요.
위 예시에서 사용한 --attachable 옵션은 이 제한을 비활성화해 swarm 서비스와 수동으로 시작한 컨테이너 모두 오버레이 네트워크에 연결할 수 있게 해요.
네트워크 이름은 고유해야 해요. Docker 데몬은 이름 충돌을 식별하려고 시도하지만 이것이 보장되지는 않아요. 이름 충돌을 피하는 것은 사용자의 책임이에요.
오버레이 네트워크 제한 (Overlay network limitations)
기본 VIP 기반 엔드포인트 모드로 네트워크를 만들 때는 /24 블록(기본값)으로 오버레이 네트워크를 만드는 걸 권장해요. 이렇게 하면 256개 IP 주소로 제한되죠. 이 권장 사항은 swarm 모드의 제한과 관련돼 있어요. 256개 이상의 IP 주소가 필요하다면 IP 블록 크기를 늘리지 말고, 외부 로드 밸런서와 함께 dnsrr 엔드포인트 모드를 사용하거나 더 작은 오버레이 네트워크 여러 개를 사용해요. 다양한 엔드포인트 모드에 대한 자세한 내용은 서비스 디스커버리 구성을 참고해요.
옵션 (Options)
| 옵션 | 기본값 | 설명 |
|---|---|---|
--attachable |
API 1.25+ 수동 컨테이너 연결 허용 | |
--aux-address |
Network driver가 사용하는 보조 IPv4 또는 IPv6 주소 | |
--config-from |
API 1.30+ 구성을 복사할 네트워크 | |
--config-only |
API 1.30+ 구성 전용 네트워크 생성 | |
-d, --driver |
bridge |
네트워크를 관리할 드라이버 |
--gateway |
마스터 서브넷용 IPv4 또는 IPv6 게이트웨이 | |
--ingress |
API 1.29+ swarm 라우팅 메시 네트워크 생성 | |
--internal |
네트워크에 대한 외부 접근 제한 | |
--ip-range |
하위 범위에서 컨테이너 ip 할당 | |
--ipam-driver |
IP 주소 관리 드라이버 | |
--ipam-opt |
IPAM 드라이버 특정 옵션 설정 | |
--ipv4 |
true |
IPv4 주소 할당 활성화 또는 비활성화 |
--ipv6 |
IPv6 주소 할당 활성화 또는 비활성화 | |
--label |
네트워크에 메타데이터 설정 | |
-o, --opt |
드라이버 특정 옵션 설정 | |
--scope |
API 1.30+ 네트워크 스코프 제어 | |
--subnet |
네트워크 세그먼트를 나타내는 CIDR 형식 서브넷 |
예시 (Examples)
컨테이너 연결
컨테이너를 시작할 때 --network 플래그로 네트워크에 연결해요. 다음 예는 busybox 컨테이너를 mynet 네트워크에 추가해요:
$ docker run -itd --network=mynet busybox
컨테이너가 이미 실행 중일 때 네트워크에 추가하려면 docker network connect 하위 명령을 사용해요.
여러 컨테이너를 같은 네트워크에 연결할 수 있어요. 연결되면 컨테이너들은 다른 컨테이너의 IP 주소나 이름만으로 통신할 수 있어요. 멀티 호스트 연결을 지원하는 overlay 네트워크 또는 사용자 정의 플러그인의 경우, 서로 다른 데몬에서 실행됐지만 같은 멀티 호스트 네트워크에 연결된 컨테이너도 이렇게 통신할 수 있어요.
컨테이너를 네트워크에서 연결 해제하려면 docker network disconnect 명령을 사용해요.
고급 옵션 지정
네트워크를 만들 때 Docker Engine은 기본적으로 겹치지 않는 서브네트워크를 만들어요. 이 서브네트워크는 기존 네트워크의 부분이 아니며, 순수하게 ip 주소 지정을 위한 것이에요. --subnet 옵션을 사용해 이 기본값을 덮어쓰고 서브네트워크 값을 직접 지정할 수 있어요. bridge 네트워크에서는 단일 서브넷만 만들 수 있어요:
$ docker network create --driver=bridge --subnet=192.168.0.0/16 br0
또한 --gateway, --ip-range, --aux-address 옵션도 지정할 수 있어요.
$ docker network create \
--driver=bridge \
--subnet=172.28.0.0/16 \
--ip-range=172.28.5.0/24 \
--gateway=172.28.5.254 \
br0
--gateway 플래그를 생략하면 Docker Engine이 기본 설정 풀에서 하나를 골라줘요. overlay 네트워크와 이를 지원하는 네트워크 드라이버 플러그인에서는 여러 서브네트워크를 만들 수 있어요. 다음 예는 단일 오버레이 네트워크에 256개를 넘지 말라는 현재 지침을 따르고자 두 개의 /25 서브넷 마스크를 사용해요. 각 서브네트워크에는 126개의 사용 가능한 주소가 있어요.
$ docker network create -d overlay \
--subnet=192.168.10.0/25 \
--subnet=192.168.20.0/25 \
--gateway=192.168.10.100 \
--gateway=192.168.20.100 \
--aux-address="my-router=192.168.10.5" --aux-address="my-switch=192.168.10.6" \
--aux-address="my-printer=192.168.20.5" --aux-address="my-nas=192.168.20.6" \
my-multihost-network
서브네트워크가 서로 겹치지 않게 주의해요. 겹치면 network create가 실패하고 Docker Engine이 오류를 반환해요.
브리지 드라이버 옵션
사용자 정의 bridge 네트워크를 만들 때 다음 추가 옵션을 전달할 수 있어요. 일부는 기본 브리지 docker0를 구성하기 위해 dockerd 명령줄이나 daemon.json에서 쓸 수 있는 동등한 플래그가 있어요:
| 네트워크 생성 옵션 | docker0 데몬 옵션 |
설명 |
|---|---|---|
com.docker.network.bridge.name |
- | Linux 브리지를 만들 때 사용할 브리지 이름 |
com.docker.network.bridge.enable_ip_masquerade |
--ip-masq |
IP 마스커레이드 활성화 |
com.docker.network.bridge.enable_icc |
--icc |
컨테이너 간 연결 활성화 또는 비활성화 |
com.docker.network.bridge.host_binding_ipv4 |
--ip |
컨테이너 포트를 바인딩할 때 기본 IP |
com.docker.network.driver.mtu |
--mtu |
컨테이너 네트워크 MTU 설정 |
com.docker.network.container_iface_prefix |
- | 컨테이너 인터페이스용 사용자 정의 접두사 설정 |
다음 인자는 어떤 네트워크 드라이버든 docker network create에 전달할 수 있어요. 마찬가지로 docker0 브리지에 사용되는 Docker 데몬 플래그의 대략적인 동등 항목과 함께 나타냈어요:
| 네트워크 생성 옵션 | docker0 데몬 옵션 |
설명 |
|---|---|---|
--gateway |
- | 마스터 서브넷용 IPv4 또는 IPv6 게이트웨이 |
--ip-range |
--fixed-cidr, --fixed-cidr-v6 |
범위에서 IP 주소 할당 |
--internal |
- | 네트워크에 대한 외부 접근 제한 |
--ipv4 |
- | IPv4 주소 할당 활성화 또는 비활성화 |
--ipv6 |
--ipv6 |
IPv6 주소 할당 활성화 또는 비활성화 |
--subnet |
--bip, --bip6 |
네트워크 서브넷 |
예를 들어 포트를 게시할 때 IP 주소 바인딩을 지정하는 데 -o 또는 --opt 옵션을 사용해 보겠어요:
$ docker network create \
-o "com.docker.network.bridge.host_binding_ipv4"="172.19.0.1" \
simple-network
네트워크 내부 모드 (--internal)
내부 네트워크의 컨테이너는 서로 통신할 수 있지만, 기본 경로가 구성되지 않고 다른 네트워크로 향하는 모든 트래픽을 버리도록 방화벽 규칙이 설정되므로 다른 네트워크와는 통신할 수 없어요. 게이트웨이 IP 주소(따라서 적절히 구성된 호스트 서비스)와의 통신은 가능하며, 호스트는 컨테이너 IP와 직접 통신할 수 있어요.
기본적으로 컨테이너를 overlay 네트워크에 연결하면 Docker는 외부 연결을 제공하기 위해 브리지 네트워크도 함께 연결해요. 외부에서 완전히 격리된 overlay 네트워크를 만들려면 --internal 옵션을 지정할 수 있어요.
네트워크 인그레스 모드 (--ingress)
swarm 클러스터에서 라우팅 메시를 제공하는 데 사용될 네트워크를 만들 수 있어요. 네트워크를 만들 때 --ingress를 지정하면 돼요. 인그레스 네트워크는 한 번에 하나만 만들 수 있어요. 이 네트워크는 이에 의존하는 서비스가 없을 때만 제거할 수 있어요. 오버레이 네트워크를 만들 때 사용할 수 있는 모든 옵션은 --attachable 옵션을 제외하고 인그레스 네트워크를 만들 때도 사용할 수 있어요.
$ docker network create -d overlay \
--subnet=10.11.0.0/16 \
--ingress \
--opt com.docker.network.driver.mtu=9216 \
--opt encrypted=true \
my-ingress-network
사전 정의된 네트워크에서 서비스 실행
사전 정의된 Docker 네트워크인 bridge와 host에서 서비스를 만들 수 있어요.
$ docker service create --name my-service \
--network host \
--replicas 2 \
busybox top
로컬 스코프 드라이버가 있는 Swarm 네트워크
로컬 스코프 네트워크 드라이버로 swarm 네트워크를 만들 수 있어요. 네트워크를 만들 때 스코프를 swarm으로 승격하면 돼요. 그러면 서비스를 만들 때 이 네트워크를 사용할 수 있어요.
$ docker network create -d bridge \
--scope swarm \
--attachable \
swarm-network
호스트 간 연결(macvlan 등)을 제공하는 네트워크 드라이버의 경우, 각 호스트에서 네트워크를 배선하기 위해 노드별 구성이 필요하다면 구성 전용 네트워크를 통해 그 구성을 제공해요. swarm 스코프 네트워크를 만들 때 구성이 담긴 네트워크의 이름을 지정하면 돼요.
node1$ docker network create --config-only --subnet 192.168.100.0/24 --gateway 192.168.100.115 mv-config
node2$ docker network create --config-only --subnet 192.168.200.0/24 --gateway 192.168.200.202 mv-config
node1$ docker network create -d macvlan --scope swarm --config-from mv-config --attachable swarm-network