본문으로 건너뛰기
홈
기술
기술 전체
프로그래밍68
컴퓨터 과학63
AI48
웹 개발36
인프라33
데이터31
소프트웨어 공학18
소개
← 목록으로인프라 › 컨테이너 › Docker

7. Docker network

목차

Docker Network

도커 네워의 목록 확인

$ docker network ls [option..]
옵션설명
-f —filter=[]출력을 필터링한다.
—no-trunc상세 정보를 출력한다.
-q, —quite네트워크 ID만 표시한다.
옵션설명
-f –filter=[]출력을 필터링한다.
–no-trunc상세 정보를 출력한다.
-q, –quite네트워크 ID만 표시한다.
$ docker network ls

[결과] > 도커는 기본값으로 bridge, host, none 이 세 개의 네트워크를 만든다.

NETWORK IDNAMEDRIVERSCOPE
521132b4fa64bridgebridgelocal
7a5dbd6ac9fbhosthostlocal
4afd4ca94851nonenulllocal

네트워크 목록 표시 필터링

$ docker network ls -q --filter driver=bridge
521132b4fa64

sample이란 이름으로 ubuntu:latest 컨테이너 실행

$ docker container run -itd --name=sample ubuntu:latest

docker inspect [name..] 명령을 통해 docker 컨테이너에 소속된 네트워크 확인할 수 있다.

$ docker container inspect sample
[
    {
        ...
        "NetworkSettings" {
            ... 
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "521132b4fa641980f1497cc7c0afad4d31b602bca04be3131cb6bd3101f847de",
                    "EndpointID": "70bb2ee608cd6d88c66fed00b4388742c4a8485977ac113facce8471dd2ac005",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]

네트워크 생성(docker network create)

$ docker network create [옵션] 네트워크

지정할 수 있는 주요 옵션

옵션설명
—driver, -d네트워크 브리지 또는 오버레이(기본값 bridge)
—ip-range컨테이너에 할당하는 IP 주소 범위 지정
—subnet서브넷을 CIDR 형식으로 지정
—ipv6IPv6 네트워크를 유효화할지 말지(true/false)
—label네트워크에 설정하는 라벨

지정할 수 있는 주요 옵션

옵션 설명
--driver, -d  네트워크 브리지 또는 오버레이(기본값 bridge)
--ip-range 컨테이너에 할당하는 IP 주소 범위 지정
--subnet 서브넷을 CIDR 형식으로 지정
--ipv6 IPv6 네트워크를 유효화할지 말지(true/false)
--label 네트워크에 설정하는 라벨
옵션설명
–-driver, -d네트워크 브리지 또는 오버레이(기본값 bridge)
—ip-range컨테이너에 할당하는 IP 주소 범위 지정
—subnet서브넷을 CIDR 형식으로 지정
—ipv6IPv6 네트워크를 유효화할지 말지(true/false)
—label네트워크에 설정하는 라벨
$ docker network create --driver=bridge web-network
caf80cc107b5e868ccb0bb263f9c402d0969f85da15b9235b152aaa2d8054d03

web-network작성 확인

$ docker network ls --filter driver=bridge
NETWORK ID     NAME          DRIVER    SCOPE
521132b4fa64   bridge        bridge    local
caf80cc107b5   web-network   bridge    local

네트워크 연결 (docker network connect/docker network disconnect)

도커 네트워크 연결

$ docker network connect [옵션] 네트워크 컨테이너

‘webserver’라는 Docker 컨테이너를 ‘web-network’라는 이름의 Docker network에 연결한다. 연결 후 동일한 네트워크 상에 있는 다른 컨테이너와 통신을 할 수 있다.

$ docker network connect web-network webserver

# 연결확인
$ docker inspect webserver
[ 
    {
    ...
        "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "521132b4fa641980f1497cc7c0afad4d31b602bca04be3131cb6bd3101f847de",
                    "EndpointID": "",
                    "Gateway": "",
                    "IPAddress": "",
                    "IPPrefixLen": 0,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "",
                    "DriverOpts": null
                },
                "web-network": {
                    "IPAMConfig": {},
                    "Links": null,
                    "Aliases": [
                        "f29c95b346af"
                    ],
                    "NetworkID": "",
                    "EndpointID": "",
                    "Gateway": "",
                    "IPAddress": "",
                    "IPPrefixLen": 0,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "",
                    "DriverOpts": {}
                }
            }
        }
    }
]

’webserver’라는 Docker 컨테이너를 ’web-network’라는 이름의 Docker network에 연결한다. 연결 후 동일한 네트워크 상에 있는 다른 컨테이너와 통신을 할 수 있다.

연결 시작 시 네트워크 연결 설정

$ docker container run -itd --name=webap --net=web-network nginx

도커 네트워크 연결 해제

$ docker network disconnect web-network webserver

네트워크 상세정보 확인(docker network inspect)

네트워크 상세 정보를 확인할 때 docker network inspect 명령을 사용.

$ docker network inspect [옵션] 네트워크

$ docker network inspect web-network

## containers에 'webserver'가 가동죽인 걸 확인할 수 있다.
[
    {
        "Name": "web-network",
        "Id": "caf80cc107b5e868ccb0bb263f9c402d0969f85da15b9235b152aaa2d8054d03",
        "Created": "2022-08-30T08:17:41.2935052Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "f29c95b346affd02532fe03dc2edeca59254204e16c48640ca3160cb584095e2": {
                "Name": "webserver",
                "EndpointID": "06e001770c62781ba9febedc6d7a7ac90a4234d926cf6f8e6616a9e751e66d72",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

네트워크 삭제(docker network rm)

$ docker network rm [옵션] 네트워크

$ docker network rm web-network

사용자 정의 bridge에서 이름으로 통신하기

기본 bridge는 단일 호스트의 일반적인 컨테이너 네트워크지만, 같은 애플리케이션에 속한 컨테이너는 사용자 정의 bridge에 묶는 편이 이름 기반 통신과 격리 범위를 관리하기 쉽다. 같은 네트워크의 컨테이너는 내장 DNS를 통해 서로의 컨테이너 이름을 찾을 수 있다. 반면 호스트에서 접근하려면 -p로 포트를 게시해야 한다. 컨테이너 내부의 localhost는 그 컨테이너 자신을 뜻하므로 다른 컨테이너를 가리키지 않는다.

docker network create app-net
docker run -d --name web-a --network app-net nginx:stable
docker run --rm --network app-net curlimages/curl:latest -I http://web-a:80/
docker network inspect app-net
docker rm -f web-a
docker network rm app-net

두 번째 컨테이너에서 http://web-a:80/ 요청에 Nginx의 HTTP 응답이 오면 이름 해석과 네트워크 연결이 동작한 것이다. 이 예시는 포트를 호스트에 게시하지 않았으므로 호스트의 localhost:80으로 접속하는 예제가 아니다. docker network inspect의 Containers 항목에서 어떤 컨테이너가 연결돼 있는지 확인한다. 테스트에 사용한 curlimages/curl:latest도 실제 운영 자동화에서는 검증한 태그를 고정한다.

flowchart LR
  A[web-a:80] <-->|app-net 내부 DNS와 bridge| B[curl 컨테이너]
  H[호스트] -.포트 게시가 있을 때만.-> A
네트워크 방식주 용도주의
기본 bridge빠른 단일 컨테이너 실습사용자 정의 bridge의 이름 해석·분리 기능과 차이가 있음
사용자 정의 bridge같은 호스트의 앱 구성 요소 연결외부 호스트에는 자동 공개되지 않음
host호스트 네트워크 공간 공유포트 충돌과 격리 약화; Docker Desktop에서 동작 제약 확인
none네트워크 불필요한 작업외부·다른 컨테이너와 통신 불가
overlay다중 호스트의 관리된 컨테이너 네트워크Swarm 등 지원 환경과 설정 필요

원문의 docker network ls -q에서 -q는 --quiet의 약자다. docker network connect app-net web-a는 기존 컨테이너를 네트워크에 추가한다. 이미 연결된 네트워크를 다른 네트워크로 자동 교체하는 명령이 아니다. disconnect는 해당 네트워크에서만 분리하므로 남은 연결을 docker inspect로 확인한다.

연결이 실패할 때 분리해서 확인하기

  1. docker network inspect app-net에 양쪽 컨테이너가 실제로 붙어 있는지 본다.
  2. 이름 해석 실패라면 컨테이너 이름·네트워크 이름을 확인한다. 서로 다른 사용자 정의 bridge에 있으면 이름이 보이지 않는다.
  3. 이름은 해석되지만 연결 거부라면 상대 프로세스가 해당 포트에서 듣는지 docker logs와 애플리케이션 설정을 본다.
  4. 컨테이너 간 요청은 되는데 호스트 요청만 실패하면 docker port web-a로 게시 규칙을 확인한다.
  5. 호스트에서는 되는데 외부에서 실패하면 바인딩 주소와 호스트 방화벽을 점검한다.

컨테이너 IP를 설정 파일에 고정하면 재생성 때 바뀔 수 있다. 애플리케이션에는 네트워크 내 서비스 이름을 사용하고, 외부 공개는 필요한 서비스의 포트만 선택한다. 네트워크 분리는 중요한 경계이지만 단독으로 인증이나 전송 암호화를 대신하지 않는다.

참고: Docker 네트워킹, bridge 드라이버, 포트 게시.

같은 카테고리의 글