Python 3.8.10 기준
Python으로 사용하는 기기의 IP를 찍는 코드는 아래와 같다.
def getLocalIP()->str:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
ip = s.getsockname()[0]
s.close()
return ip
위 함수를 실행하면 해당 기기의 ip를 string으로 받을 수 있다.
Docker Container 환경에서 위 함수를 이용하여 ip를 활용하는 방법을 두 가지 경우로 나누어 볼 것이다.
1. 컨테이너 내부 IP
그냥 컨테이너를 실행하고 위 함수가 동작하게 하면 컨테이너의 내부 ip를 찍어준다. 즉, PC의 ip가 192.168.xxx.xxx이더라도 컨테이너 내부의 ip는 172.xx.0.x의 형태로 잡힐 것이다.
컨테이너의 정보는
docker inspect {container id}
명령으로 확인할 수 있다.
2. 컨테이너에서 host device IP
이 글을 쓴 목적은 사실 이거다. IP로 접근해야 하는, 예를 들어 API를 서비스로 docker-compose 환경에서 함께 사용하는 경우 외부에 공개하고 싶지 않아 포트를 EXPOSE 하지 않는 경우들이 있다. 이 경우 일반적으로 다른 컨테이너에서는 해당 API에 접근이 불가하다(hostip:8000 형태일 것인데 해당 포트가 막혀있기 때문).
이때, docker network를 사용하겠다 생각할 수 있지만 아쉽게도 network를 사용하게 되면 1번의 경우와 마찬가지로 내부ip를 사용하게 되어 자신과 내부 ip가 다른 api는 접근이 불가하다.
이 경우 docker-compose.yml의 서비스 명세에 아래 옵션을 추가한다.
network_mode: host
해당 옵션을 선언해주면 자신의 172.xx.0.xx 의 내부 ip를 host device ip 192.168.xxx.xxx에 연결해 host의 ip를 도커 내부망에서 사용할 수 있게 된다!
해당 옵션 선언 후 맨 위의 Python 함수를 실행하면 host ip를 찍는다.
'Docker > Docker' 카테고리의 다른 글
도커 이미지 tar 파일 생성 (0) | 2024.02.08 |
---|---|
Docker Hub 사용 (0) | 2024.02.07 |
Docker Compose 구성 (0) | 2023.09.15 |
Dockerfile 작성 (0) | 2023.09.14 |
댓글