Docker

[Docker] SSH 연결 문제와 Docker 설정: 원인부터 해결까지

TaeHuiLee 2024. 11. 20. 13:57
반응형

🐳 SSH 연결 문제와 Docker 설정: 원인부터 해결까지

Docker 사용 중 서버에 SSH로 접속하여 도커 명령어를 실행하려고 할 때 접속이 끊기는 문제가 발생했습니다. 이 문제는 Docker의 IP 대역 충돌에서 비롯되었습니다. 앞으로 이러한 오류를 방지하기위해 이번 포스팅에서는 문제의 원인을 깊이 이해하고, 이를 해결하기 위한 방법인 daemon.json 설정 수정절차를 단계별로 알아보겠습니다.


1. 🌟 문제 상황

문제
로컬 PC에서 서버에 SSH로 접속 후 Docker를 실행하면 접속이 끊기거나 오류가 발생.

 

이 상황은 일반적으로 다음 이유 때문에 발생합니다.

  1. Docker의 기본 네트워크 IP 대역172.17.0.0/16로컬 네트워크의 IP 대역과 겹칠 때 충돌.
  2. 충돌로 인해 Docker의 브리지 네트워크와 SSH 연결 간에 패킷이 잘못 라우팅되거나 차단됨.

2. 🔍 원인 분석

2.1 Docker 네트워크 기본값 이해하기

Docker는 컨테이너 간 통신을 위해 가상 네트워크를 생성합니다. 기본적으로 다음과 같은 네트워크 대역을 사용합니다.

  • 브리지 네트워크 IP 대역: 172.17.0.0/16
  • Docker는 브리지 네트워크를 통해 컨테이너와 호스트 간 통신을 중계.

2.2 브리지 네트워크란?

브리지 네트워크는 호스트 머신과 Docker 컨테이너 간 가상 네트워크입니다.

  • 기본적으로 Docker는 브리지 네트워크를 통해 컨테이너 간 통신외부 네트워크 연결을 관리합니다.
  • 호스트 머신의 네트워크와 독립적으로 동작하므로 네트워크 격리를 제공합니다.
예:
  • 호스트 머신: 192.168.1.10
  • Docker 컨테이너 네트워크: 172.17.0.0/16
    이처럼 서로 다른 대역을 가지므로 네트워크 충돌이 없어야 하지만, 로컬 네트워크 대역이 중복되면 문제가 발생합니다.

2.3 충돌의 영향

  • SSH 연결 차단: 네트워크 충돌로 인해 SSH 연결 패킷이 손실될 수 있습니다.
  • Docker 작동 문제: 네트워크 충돌은 Docker 컨테이너 간 통신에도 문제를 유발합니다.

3. 🛠 해결 방법: daemon.json 설정

문제를 해결하려면 Docker의 네트워크 IP 대역을 변경하여 충돌을 방지해야 합니다. 이를 위해 /etc/docker/daemon.json 파일을 수정합니다.

3.1 daemon.json 기본 구조

daemon.json은 Docker 데몬의 설정 파일로, JSON 형식으로 작성됩니다. 이 파일을 통해 Docker의 기본 동작을 커스터마이징할 수 있습니다.

3.2 주요 설정 항목

아래는 문제 해결과 관련된 주요 설정 항목입니다:

  1. data-root: Docker 데이터 경로를 변경.
  2. bip: 브리지 네트워크 IP 대역 설정.
  3. default-address-pools: Docker Compose의 네트워크 대역 설정.
  4. insecure-registries: HTTP로 접근 가능한 프라이빗 레지스트리 설정.
  5. registry-mirrors: Docker Hub 미러 설정.

4. 💻 실습: daemon.json 수정

4.1 설정 파일 열기

sudo vi /etc/docker/daemon.json

4.2 수정 내용

{
    // Docker Root 경로 설정
    "data-root": "/data/docker",

    // 기본 Docker 브리지 네트워크 설정 (충돌 방지용 IP 대역)
    "bip": "192.172.100.1/24",

    // Docker Compose의 기본 네트워크 대역 설정
    "default-address-pools": [
        {
            "base": "192.172.100.1/16",
            "size": 24
        }
    ],

    // Docker 레지스트리 HTTP 연결 허용
    "insecure-registries": ["10.20.100.1:5000"],

    // Docker Hub 미러 설정
    "registry-mirrors": ["https://<my-docker-mirror-host>"]
}

설명

  • bip: Docker 브리지 네트워크의 기본 IP 대역을 변경.
  • default-address-pools: Docker Compose에서 기본 네트워크 대역을 별도로 설정.
  • insecure-registries: HTTP로 동작하는 프라이빗 레지스트리를 허용.
  • registry-mirrors: Docker Hub 대안 미러 설정.

5. 🔄 적용 및 확인

5.1 Docker 데몬 재시작

설정을 저장한 후 Docker 데몬을 재시작합니다:

sudo systemctl restart docker

5.2 설정 적용 확인

변경된 네트워크 대역을 확인하려면 다음 명령어를 실행:

docker network inspect bridge

출력에서 Subnet이 새로 설정한 대역으로 변경되었는지 확인합니다:

{
    "Subnet": "192.172.100.1/24"
}

6. ⚠️ 주의 사항

  1. 서버 재부팅 필요 여부: 일부 환경에서는 Docker 데몬 재시작만으로 충분하지만, 네트워크 충돌로 인해 시스템 재부팅이 필요할 수도 있습니다.
  2. 구성 파일 JSON 유효성 검사: JSON 파일 수정 시 유효한 형식인지 반드시 확인.
  3. 기존 네트워크 삭제: 기존 컨테이너의 네트워크 설정은 변경되지 않을 수 있으므로 필요시 네트워크를 삭제 후 다시 생성:
    docker network rm <network_name>

7. 🚀 요약 및 결론

  • 원인: Docker와 로컬 네트워크 간의 IP 대역 충돌로 SSH 연결이 차단됨.
  • 해결책: daemon.json 파일에서 bipdefault-address-pools 설정으로 네트워크 대역 변경.
  • 주요 명령어:
    • 설정 파일 열기: sudo vi /etc/docker/daemon.json
    • Docker 재시작: sudo systemctl restart docker
    • 네트워크 확인: docker network inspect bridge

위 내용을 따라가며 설정을 적용하면 Docker 네트워크 충돌 문제를 깔끔하게 해결할 수 있습니다. 더 궁금한 점이 있으면 댓글로 남겨주세요! 😄

반응형