8.1 네트워크 문제 진단 기본 단계
Docker에서 네트워크 문제는 네트워크 구성 오류, DNS 문제, IP 주소 충돌 등 다양한 이유로 발생할 수 있어. 이 강의에서는 Docker에서 네트워크 문제를 진단하고 해결하는 기본 방법을 알아볼 거야.
네트워크 문제가 발생하면 다음 단계를 따라야 해:
- 컨테이너와 네트워크 상태 확인
- 컨테이너 내부에서 네트워크 유틸리티 사용
- Docker와 네트워크 파일의 구성 확인
- Docker 시스템 로그 확인
- Docker 네트워크 명령 사용
8.2 컨테이너와 네트워크 상태 확인
네트워크 문제를 진단하는 첫 번째 단계는 컨테이너와 네트워크 상태를 확인하는 거야.
컨테이너 상태 확인
먼저 실행 중인 모든 컨테이너를 표시해 보자. 이 작업은 docker ps 명령어를 사용하면 돼:
docker ps
만약 컨테이너가 실행되지 않는다면, Docker 자체 또는 컨테이너 설정에 문제가 있을 수 있어.
네트워크 상태 확인
docker network ls 명령어로 Docker에서 생성된 모든 네트워크를 확인할 수 있어:
docker network ls
필요한 네트워크가 존재하고 컨테이너들이 그 네트워크에 연결되어 있는지 확인해.
8.3 컨테이너 내에서 네트워크 유틸리티 사용
ping, curl, netcat (또는 nc), nslookup 같은 네트워크 유틸리티는 컨테이너 내부의 문제를 진단하는 데에 도움을 줄 수 있어. 이런 각각의 유틸리티는 특정한 작업을 수행해:
ping— ICMP 요청을 보내서 네트워크 상의 원격 호스트의 가용성을 확인하는 도구야.curl— 여러 프로토콜을 통해 데이터를 전송하는 도구로, 웹 서비스의 가용성을 확인하는데 자주 사용돼.netcat (nc)— 네트워크 연결 작업을 위한 만능 도구로, TCP/UDP 연결을 생성하고 포트 가용성을 진단할 수 있어.nslookup— DNS 레코드 확인을 위한 유틸리티로, 컨테이너 이름의 해상도를 확인할 때 유용해.
ping 사용 예제
컨테이너에 접속해서 다른 컨테이너나 서비스와의 연결을 확인하려면, ping 유틸리티를 사용해서 ICMP 요청을 보내보자:
docker exec -it <container_name> ping <target_container_name_or_ip>
curl 사용 예제
컨테이너 내부에서 웹 서비스의 가용성을 확인하려면 curl 유틸리티를 사용해 보자:
docker exec -it <container_name> curl http://<target_service>
nslookup 사용 예제
nslookup을 사용해서 컨테이너 이름의 DNS 해상도를 확인해보자. 이는 네트워크 서비스 문제를 진단하는데 유용해:
docker exec -it <container_name> nslookup <target_container_name>
nc host port 사용 예제
nc 유틸리티는 네트워크 연결을 디버깅하고 진단하는 데 사용돼. nc host port 명령어로 지정된 호스트와 포트에 연결을 시도해서 해당 호스트의 포트 가용성을 확인할 수 있어:
docker exec -it <container_name> nc -zv 192.168.1.1 22
8.4 Docker와 네트워크 파일 설정 확인
잘못된 Docker와 네트워크 파일 설정은 네트워크 문제를 일으킬 수 있어.
docker-compose.yml 파일 확인
docker-compose.yml 파일이 올바르게 설정되어 있고, 모든 네트워크, 서비스 및 포트가 제대로 지정되어 있는지 확인해봐.
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 설정이 변경되었는지 확인해봐:
{
"dns": ["8.8.8.8", "8.8.4.4"],
"fixed-cidr": "192.168.1.0/24"
}
8.5 Docker 시스템 로그 확인
Docker 시스템 로그에는 네트워크 오류와 문제에 대한 유용한 정보가 포함될 수 있어.
Docker 로그 보기
systemd를 사용하는 시스템에서 journalctl 명령어를 사용해 Docker 로그를 확인할 수 있어:
journalctl -u docker.service
컨테이너 로그 보기
컨테이너 로그도 네트워크 문제를 진단하는 데 도움이 될 수 있어:
docker logs <container_name>
8.6: Docker 네트워크 명령어 사용
Docker는 docker network inspect와 docker network connect 같은 네트워크 진단 및 관리 명령어를 제공합니다.
docker network inspect 명령어
이 명령어는 네트워크에 대한 자세한 정보를 얻을 수 있게 해줍니다. 여기에는 연결된 컨테이너와 IPAM 설정이 포함됩니다.
docker network inspect <network_name>
docker network inspect 명령어 출력 예시
[
{
"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 명령어
컨테이너가 네트워크에 잘못 연결된 경우, 수동으로 연결할 수 있습니다:
docker network connect <network_name> <container_name>
8.7 문제 진단 및 해결 예제
예제 1: DNS에서 도메인 이름을 IP로 변환하는 문제
컨테이너가 다른 컨테이너의 호스트 이름을 변환할 수 없는 경우, DNS 설정을 확인해봐:
DNS 설정 확인 in docker-compose.yml:
version: '3.8'
services:
web:
image: nginx:latest
dns:
- 8.8.8.8
컨테이너 내 DNS 확인:
docker exec -it <container_name> cat /etc/resolv.conf
예제 2: 서비스 접근 문제
컨테이너가 다른 호스트의 서비스에 접근할 수 없는 경우:
공개된 포트 확인:
docker ps
방화벽 규칙 확인:
필요한 포트를 방화벽 규칙이 차단하지 않도록 해.
예제 3: IP 주소 충돌
컨테이너 간 또는 호스트와 IP 주소 충돌이 발생한 경우:
네트워크 서브넷 확인:
docker network inspect <network_name>
서브넷 변경:
docker network create --subnet=192.168.2.0/24 my_network
GO TO FULL VERSION