본문 바로가기
IT/Kubernetes

[Docker] Network - 기본 네트워크 구성 실패 및 복구

by rapker 2023. 4. 8.
반응형

참고

요약

시작은 docker 네트워크 구성이 어떻게 생겼나 둘러보고 기록 하고 싶었는데

어찌 하다보니 docker network가 망가졌고 이를 복구 하는 과정이 주된 내용이 되어 버렸네요

앞으로 네트워크 관련 설정하다가 뭔가 잘못 되었을 경우 요긴하게 써먹을 수 있을 것 같습니다.

본문 시작

도커 네트워크가 어떻게 구성되어 있는지 확인해 보고 싶어서

새로운 Linux 가상머신을 만들고 도커 설치 직후 네트워크 목록을 확인해 봤습니다.

 

#네트워크 목록 확인

docker network ls

 

음.... 뭔지는 모르겠지만 네트워크 3개가 존재 하네요

Driver가 다른걸 보니 용도가 다른것 같고

Scope은 local로 명시되어 있는것이... 내부에서만 사용가능한 네트워크 인것 같습니다.

 

#Docker 기본 네트워크 종류

driver 종류에 따라 어떤 차이가 있는지 검색하다 보니..

도커 네트워크는 총 5가지의 종류의 기본 네트워크를 제공한다고 합니다.

  1. None
  2. Host
  3. Bridge
  4. MACVLAN
  5. Overlay

각 드라이버들은 동일한 호스트에서 네트워크 구성할 때 사용이 가능하지만

서로 다른 호스트에서 네트워크 연결을 하려면 MACVLAN, Overlay를 사용해야 한다고 합니다.

None, Host는 동일 호스트 내에서 간단한 테스트 정도에 주로 사용 되며,

대부분 기본 제공되는 bridge를 시작으로 서로 다른 호스트를 연결할 때는 Overlay Network를 사용 한다고 합니다.

추가로 CNI Plugin을 통해 3rd party 네트워크를 구성할 수도 있다고 하는데...

기본으로 제공되는 네트워크 5가지와 3rd party 까지 포함하면 총 6가지 네트워크가 지원되는 셈이네요

아까 docker network ls로 확인했던 3가지 network driver 중

host, none 타입의 주 용도는 테스트 용도라고 하니 간략하게 검색한 내용으로만 정리하고,

기본 생성되는 3가지 드라이버 중 bridge 드라이버에 대해 알아볼까 합니다.

 

Host, None 드라이버

참조

none

  • 컨테이너에 IP를 구성하지 않으며 외부 네트워크 및 다른 컨테이너에 대한 액세스 권한이 없음
  • 루프백 주소(127.0.0.1)가 있고 배치 작업을 실행하는데 사용할 수 있음

host

  • 호스트 네트워크 스택을 공유
  • 호스트의 모든 인터페이스를 컨테이너에서 사용할 수 있음
  • 컨테이너의 호스트 이름이 호스트 시스템의 호스트 이름과 일치

#Host, None 네트워크 구성

Host

docker network inspect host

 

None

docker network inspect none

 

 

Bridge 드라이버

 

#bridge 네트워크 구성 보기

docker network inspect bridge

 

아는만큼 보인다고 했으니 쓰~윽 한번 훑어보면

  • 네트워크 이름은 bridge
  • bridge 드라이버 타입의 네트워크 이고
  • IPv6는 사용하지 않도록 되어 있고,
  • 172.17.0.0/16 : b class 대역으로 약 6만 5천개의 ip를 할당할 수 있겠고
  • Containers에 목록에 해당 네트워크에서 ip를 할당받은 컨테이너는 아직 없고

Option쪽 보면

  • default_bridge : true <- 기본 네트워크로 사용한다는 뜻인거 같고
  • enable_icc : true <- 모르겠고
  • enable_ip_masquerade : true <- 모르겠고
  • host_binding_ipv4 : 0.0.0.0 <- 호스트의 모든 ipv4 대역과 통신이 가능하다는 내용 같은데... 정확히는 모르겠고
  • name : docker0 <- docker0는 호스트 ifconfig 에서 확인 가능했었는데.... 모르겠고
  • mtu : 1500 <- 전송할 수 있는 최대 바이트 라는데 eth0 과 docker0 의 mtu수치가 다르면 네트워킹이 안된다는 이야기도 있네요

그 외 태그들은.... 음....

  • IPAM
  • Internal : false
  • Attachable : false
  • Ingress : false
  • ConfigFrom
  • Labels

Options의 항목들을 하나하나 찾아보고 싶어졌습니다.

 

#default_bridge 확인을 위해 네트워크를 하나 만들어 봅니다.

docker network create : docker docs

 

#172.30.0.0/24 대역의 새로운 bridge 네트워크 추가 하고

docker network create -d bridge --subnet 172.30.0.0/24 testNet

 

#네트워크 목록을 확인해 봅니다.

docker network ls

 

음...

대체로 동일한 값이고, IP대역은 제대로 생성된 것으로 보이는데

기본으로 생성된 bridge 네트워크와 추가로 생성한 testNet 네트워크의 Option에서 차이가 있네요

 

Bridge 내용

docker network inspect bridge

 

testNet 내용

docker network inspect testNet

 

어떻게 집어 넣는거지...

이미 생성되어 있는 네트워크의 Options 값을 변경하는 방법이 왠지(반드시) 있을 것 같은데 검색이 잘 안되네요...

네트워크를 새로 생성하면서 default_bridge 옵션을 넣어봐야 겠습니다.

 

#딱 두 옵션(default_bridge, mtu) 만 포함해서 새로운 네트워크를 생성해 봅니다.

docker network create -d bridge -o "com.docker.network.driver.mtu"="1500" -o "com.docker.network.bridge.default_bridge"="true" testNet2

 

#네트워크 목록 확인

docker network ls

 

오~~~~

새로 추가한 네트워크 option에 default_bridge 설정 됐다..

 

그럼 원래 있던 기본 네트워크는 어떻게 되었을까~~

 

아... 절묘한 타이밍에 VM이 종료 되네 (예약종료) ... 와 함께 퇴근!!

 

 

다음날 VM을 다시 올리고 원래 있던(기본 bridge) 네트워크 구성을 확인해 보려는데

도커 네트워크 목록 검색이 실패 합니다.

docker daemon이 실행중이 아니다????

 

#도커 서비스를 다시 실행 시켜보았으나 여전히 먹통이고

도커 서비스의 상태가 inactive가 아니라 failed?

 

뭔가 잘못된게 분명해 보이네요....

 

#dockerd 실행

sudo dockerd

 

에러 메세지를 좀 보니...

 

기본 bridge 네트워크 생성에 실패 해서 데몬을 실행하지 못한다는데

Default bridge docker0 이 172.20.0.0/16에 할당되었다??

이건 의도한게 맞는데....

 

정리를 해보면

도커 설치 직후 bridge (172.17.0.0/16) 라는 네트워크가 기본 네트워크 였고

테스트 한다고 testNet2 (172.20.0.0/16) 네트워크를 추가 하면서 option으로 default_bridge: true 설정을 한 것이

문제가 되는 것으로 보여지는데.....

아... 어떻게 고치지....

 

또..검색

 

Docker fails to create network bridge on start up

해당 오류는 저처럼 삽질하다 발생하지 않더라도

도커데몬 설치할 때 네트워크 브리지를 제대로 생성하지 못하는 경우가 종종 있는것 같은데 이 때에도 유사한 오류가 발생하는 것으로 보여집니다.

 

해결되었다는 글들도 보이는데 : issue 18283

  1. 도커 재설치로 해결
  2. /var/lib/docker/network 삭제로 해결
  3. 2번이 동작하지 않았고 docker0 bridge 인터페이스 삭제로 해결

어디선가 network 설정파일 관리하고 있을것이고 이것을 수동으로 설정하는 방법이 있을것 같아서 찾다보니...

cd /var/lib/docker/network/files/ 경로에 local-kv.db 라는 파일이 주인공인 것으로 보여집니다.

 

#관리자로 전환 후 /var/lib/docker/network/files/ 경로에서 목록 확인

sudo -i
cd /var/lib/docker/network/files/

 

#local-kv.db 파일의 내용 확인

cat local-kv.db

 

와...... 뭔가 설정 파일이 맞는 것 같은데

 

바이너리 파일로 보여지는데... 그러면 쉽게 수정하긴 힘들 것 같이 보이네요

 

내용 수정은 뒤로 하고

우선 의심되는 default_bridge 설정이 두군데 있는지 확인해 볼께요

 

기본 네트워크였던 bridge 라는 이름과 추가로 생성했던 testNet2 라는 이름의 네트워크의 옵션에

default_bridge가 true로 설정되어 있다면 심증이 물증으로 바뀌는 순간이 되는겁니다.

 

저 상태로는 확인하기 힘들어서

 

local-kv.db 파일의 내용을 jsonviewer 라는 곳에 복사해서 확인 합니다.

 

Format 버튼을 누르면 좀 더 보기 편해 집니다.

 

앗!!!

저 상태로 Ctrl+F로 default_bridge를 검색 해보니 진짜 2개가 검색 되네요

 

좀 더 보기 편하게 하기 위해서 중괄호 묶음 단위로 내용을 끊다 보니까

데이터 종류는 총 두 가지 인것 같습니다.

 

docker/network/v1.0/network 의 설정 내용

docker/network/v1.0/bridge 의 설정 내용

 

#내용 확인 차 파일 생성

cat 으로 출력된 결과물을 보기 편하게 정리한 txt파일

DebugDockerNetwork.txt
0.01MB

 

DebugDockerNetwork.txt

txt 파일에서 요점만 정리

DebugDockerNetwork.xlsx
0.01MB

 

아래래 엑셀 파일에 정리된 내용을 좀 보면

 

분석

  • docker network의 모든 정보들을 담고 있다.
  • 네트워크와 브릿지들로 구성되어 있다.
  • No5에 default_bridge가 활성화 되어 있다.
  • No 8 : 삭제한 네트워크라도 InDelete 플래그로 삭제 표시는 하지만 실제로 데이터를 삭제하진 않는다.
  • 네트워크의 정보 중 (generic)bridge.name에 사용될 브릿지의 이름이 설정으로 바인딩 된다.

가능성

  1. 2번 자리에 1번 값인 docker0이 들어오고
  2. 3번 자리의 PreferredPool과 Gateway가 설정되면

정상적으로 동작할것 같지만... 바이너리 파일이라 직접적인 수정은 힘들고

뭔가 커맨드로 설정하는게 있을것 같지만....

안보여....

검색이 안돼.....

폭풍검색중 github community에서 안내하는 고칠 수 있는 확실한 방법으로는

/var/lib/docker 삭제 !!!!

-모든 Docker 내부 파일을 삭제합니다 (때때로 Docker가 잘못된 상태가되며 불행히도 이것이 수정하는 유일한 방법 임).

sudo rm -rf /var/lib/docker
sudo systemctl restart docker

 

docker 디렉터리의 목록

 

/var/lib/docker에는 이미지, 컨테이너, 볼륨, 네트워크 같은 정보들이 담겨 있습니다.

도커 엔진을 삭제해도 /var/lib/docker는 삭제되지 않습니다. (윈도우의 Documents폴더 처럼...)

만약 도커를 완전히 삭제하기로 했다면 도커 삭제와 함께 /var/lib/docker 디렉터리도 삭제해야 합니다.

 

#결론은....

네트워크 생성 시 옵션을 잘못 설정하면 망가진다.

망가진 후 수정할 수 없다.

네트워크 생성 시 options을 제대로 설정해야 하는 것으로 보여진다.

 

도커 문서에 Options에 대한 설명이 있어 링크 가져왔습니다.

Bridge Driver Options : Docker docs

Option 설명

http://com.docker.net/work.bridge.name - Linux 브리지를 만들 때 사용할 브리지 이름
http://com.docker.net/work.bridge.enable_ip_masquerade --ip-masq IP 마스 쿼 레이 딩 활성화
http://com.docker.net/work.bridge.enable_icc --icc 컨테이너 간 연결 활성화 또는 비활성화
http://com.docker.net/work.bridge.host_binding_ipv4 --ip 컨테이너 포트 바인딩시 기본 IP
http://com.docker.net/work.driver.mtu --mtu 컨테이너 네트워크 MTU 설정
http://com.docker.net/work.container_interface_prefix - 컨테이너 인터페이스에 대한 사용자 지정 접두사 설정

Docker Network cmd

Command Description

https://docs.docker.com/engine/reference/commandline/network_connect/ Connect a container to a network
https://docs.docker.com/engine/reference/commandline/network_create/ Create a network
https://docs.docker.com/engine/reference/commandline/network_disconnect/ Disconnect a container from a network
https://docs.docker.com/engine/reference/commandline/network_inspect/ Display detailed information on one or more networks
https://docs.docker.com/engine/reference/commandline/network_ls/ List networks
https://docs.docker.com/engine/reference/commandline/network_prune/ Remove all unused networks
https://docs.docker.com/engine/reference/commandline/network_rm/ Remove one or more networks

 

docker 경로

도커가 설치되면 어떤 경로에 어떤 파일들이 생기게 되는지 확인해 보고자

현재 도커 관련된 파일들은 검색해 봤습니다.

 

1 데몬 경로

#데몬 파일들 위치

ll /lib/systemd/system | grep docker
ll /lib/systemd/system | grep containerd

 

1.1 docker.service의 실행 파일 경로

#docker.service 에서 실행 파일의 위치 확인

cat /lib/systemd/system/docker.service

 

1.2 docker.socket의 실행 파일 경로

#docker.socket 에서 실행 파일의 위치 확인

cat /lib/systemd/system/docker.socket

 

1.3 containerd.service의 실행 파일 경로

#containerd.service에서 실행 파일의 위치 확인

cat /lib/systemd/system/containerd.service

 

2. 실행 파일 경로

2.1 docker 프로그램 파일들

cd /usr/bin
ll | grep docker
ll | grep containerd

 

 

2.2 docker.socket의 실행 파일들

cd /var/run
ll | grep docker
ll | grep containerd

 

3. 설정 파일 경로

# 설정 파일 경로

sudo ls -al /var/lib/docker

 

도커 복구 시도

자~ 지금까지 조사한 내용을 바탕으로 보면

  • 지금과 같은 상황에서 도커 엔진을 다시 설치할 필요는 없고,
  • 네트워크 관련된 설정 파일만 복구하면

도커가 제정신을 차릴 것 같습니다.

두 가지 작업 진행

  1. /var/lib/docker/network 디렉터리 삭제
  2. 도커 서비스 시작

#/var/lib/docker/network 삭제

 

관리자 권한 획득 후 /var/lib/docker로 이동하여 network 디렉터리 확인

 

/var/lib/docker/network 디렉터리 삭제

 

도커 서비스 시작

 

도커 네트워크 확인

 

컨테이너 실행 확인

 

짜잔~ 복구가 잘 되었네요 ㅜㅜ

 

네트워크도 정상적으로 기본값 구성이 되어 있고

컨테이너 실행도 잘 되는것을 확인할 수 있었습니다.

 

앞으로 몇 번의 시행착오를 더 거쳐야 제대로된 네트워크를 구성할 수 있을지 모르겠지만

될때까지 이 과정을 반복하면 되겠네요... -0-

반응형
LIST

'IT > Kubernetes' 카테고리의 다른 글

[Docker] Network - overlay & macvlan  (0) 2023.04.08
[Docker] 기본 네트워크 구성 변경  (0) 2023.04.08
[Docker] dockerfile build (with sample)  (0) 2023.04.08
[Docker] 기본 실행 및 명령어  (1) 2023.04.08
[Docker] 도커 설치  (0) 2023.04.08