CodeGym /행동 /Docker SELF /네트워크 문제 해결

네트워크 문제 해결

Docker SELF
레벨 18 , 레슨 2
사용 가능

8.1 네트워크 문제 진단 기본 단계

Docker에서 네트워크 문제는 네트워크 구성 오류, DNS 문제, IP 주소 충돌 등 다양한 이유로 발생할 수 있어. 이 강의에서는 Docker에서 네트워크 문제를 진단하고 해결하는 기본 방법을 알아볼 거야.

네트워크 문제가 발생하면 다음 단계를 따라야 해:

  1. 컨테이너와 네트워크 상태 확인
  2. 컨테이너 내부에서 네트워크 유틸리티 사용
  3. Docker와 네트워크 파일의 구성 확인
  4. Docker 시스템 로그 확인
  5. Docker 네트워크 명령 사용

8.2 컨테이너와 네트워크 상태 확인

네트워크 문제를 진단하는 첫 번째 단계는 컨테이너와 네트워크 상태를 확인하는 거야.

컨테이너 상태 확인

먼저 실행 중인 모든 컨테이너를 표시해 보자. 이 작업은 docker ps 명령어를 사용하면 돼:

Terminal

docker ps

만약 컨테이너가 실행되지 않는다면, Docker 자체 또는 컨테이너 설정에 문제가 있을 수 있어.

네트워크 상태 확인

docker network ls 명령어로 Docker에서 생성된 모든 네트워크를 확인할 수 있어:

Terminal

docker network ls

필요한 네트워크가 존재하고 컨테이너들이 그 네트워크에 연결되어 있는지 확인해.

8.3 컨테이너 내에서 네트워크 유틸리티 사용

ping, curl, netcat (또는 nc), nslookup 같은 네트워크 유틸리티는 컨테이너 내부의 문제를 진단하는 데에 도움을 줄 수 있어. 이런 각각의 유틸리티는 특정한 작업을 수행해:

  • ping — ICMP 요청을 보내서 네트워크 상의 원격 호스트의 가용성을 확인하는 도구야.
  • curl — 여러 프로토콜을 통해 데이터를 전송하는 도구로, 웹 서비스의 가용성을 확인하는데 자주 사용돼.
  • netcat (nc) — 네트워크 연결 작업을 위한 만능 도구로, TCP/UDP 연결을 생성하고 포트 가용성을 진단할 수 있어.
  • nslookup — DNS 레코드 확인을 위한 유틸리티로, 컨테이너 이름의 해상도를 확인할 때 유용해.

ping 사용 예제

컨테이너에 접속해서 다른 컨테이너나 서비스와의 연결을 확인하려면, ping 유틸리티를 사용해서 ICMP 요청을 보내보자:

Terminal

docker exec -it <container_name> ping <target_container_name_or_ip>

curl 사용 예제

컨테이너 내부에서 웹 서비스의 가용성을 확인하려면 curl 유틸리티를 사용해 보자:

Terminal

docker exec -it <container_name> curl http://<target_service>

nslookup 사용 예제

nslookup을 사용해서 컨테이너 이름의 DNS 해상도를 확인해보자. 이는 네트워크 서비스 문제를 진단하는데 유용해:

Terminal

docker exec -it <container_name> nslookup <target_container_name>

nc host port 사용 예제

nc 유틸리티는 네트워크 연결을 디버깅하고 진단하는 데 사용돼. nc host port 명령어로 지정된 호스트와 포트에 연결을 시도해서 해당 호스트의 포트 가용성을 확인할 수 있어:

Terminal

docker exec -it <container_name> nc -zv 192.168.1.1 22

8.4 Docker와 네트워크 파일 설정 확인

잘못된 Docker와 네트워크 파일 설정은 네트워크 문제를 일으킬 수 있어.

docker-compose.yml 파일 확인

docker-compose.yml 파일이 올바르게 설정되어 있고, 모든 네트워크, 서비스 및 포트가 제대로 지정되어 있는지 확인해봐.

Yaml

version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    networks:
      - webnet
        
  db:
    image: postgres:latest
    ports:
      - "5432:5432"
    networks:
      - webnet
        
networks:
  webnet:
    driver: bridge

/etc/docker/daemon.json 파일 확인

Docker Daemon 설정이 변경되었는지 확인해봐:

JSON

{
  "dns": ["8.8.8.8", "8.8.4.4"],
  "fixed-cidr": "192.168.1.0/24"
}

8.5 Docker 시스템 로그 확인

Docker 시스템 로그에는 네트워크 오류와 문제에 대한 유용한 정보가 포함될 수 있어.

Docker 로그 보기

systemd를 사용하는 시스템에서 journalctl 명령어를 사용해 Docker 로그를 확인할 수 있어:

Terminal

journalctl -u docker.service

컨테이너 로그 보기

컨테이너 로그도 네트워크 문제를 진단하는 데 도움이 될 수 있어:

Terminal

docker logs <container_name>

8.6: Docker 네트워크 명령어 사용

Docker는 docker network inspectdocker network connect 같은 네트워크 진단 및 관리 명령어를 제공합니다.

docker network inspect 명령어

이 명령어는 네트워크에 대한 자세한 정보를 얻을 수 있게 해줍니다. 여기에는 연결된 컨테이너와 IPAM 설정이 포함됩니다.

Terminal

docker network inspect <network_name>

docker network inspect 명령어 출력 예시

JSON

[
    {
        "Name": "webnet",
        "Id": "e5e5e1b1a3e5",
        "Created": "2021-01-01T00:00:00.000000000Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Containers": {
            "container_id": {
                "Name": "web",
                "EndpointID": "6c52f8c75c1e",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

docker network connect 명령어

컨테이너가 네트워크에 잘못 연결된 경우, 수동으로 연결할 수 있습니다:

Terminal

docker network connect <network_name> <container_name>

8.7 문제 진단 및 해결 예제

예제 1: DNS에서 도메인 이름을 IP로 변환하는 문제

컨테이너가 다른 컨테이너의 호스트 이름을 변환할 수 없는 경우, DNS 설정을 확인해봐:

DNS 설정 확인 in docker-compose.yml:

Yaml

version: '3.8'

services:
  web:
    image: nginx:latest
    dns:
      - 8.8.8.8

컨테이너 내 DNS 확인:

Terminal

docker exec -it <container_name> cat /etc/resolv.conf

예제 2: 서비스 접근 문제

컨테이너가 다른 호스트의 서비스에 접근할 수 없는 경우:

공개된 포트 확인:

Terminal

docker ps

방화벽 규칙 확인:

필요한 포트를 방화벽 규칙이 차단하지 않도록 해.

예제 3: IP 주소 충돌

컨테이너 간 또는 호스트와 IP 주소 충돌이 발생한 경우:

네트워크 서브넷 확인:

Terminal

docker network inspect <network_name>

서브넷 변경:

Terminal

docker network create --subnet=192.168.2.0/24 my_network
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION