포트 충돌 문제를 해결하면서 나를 혼란스럽게 만든 문제였다.
https://shout-to-my-mae.tistory.com/401
도커 컨테이너는 로컬 환경에서 띄웠으나 도커의 ip주소는 127.0.0.1이 아니어서 연결 에러가 발생했을때 헷갈렸다.
도커의 ip주소는 왜 127.0.0.1 (localhost)이 아닐까?
- 개인 pc에서 돌리는 컨테이너는 로컬 환경이라고 할 수 있다.
- 하지만 도커를 로컬에서 실행한다고 해도, 실제로 도커 컨테이너 내부는 별도의 '가상 환경'과 같이 격리된 공간에서 실행된다. 즉, 컨테이너 내부는 로컬 시스템과는 독립적인 환경을 가진다.
도커 컨테이너와 가상 환경
- 도커 컨테이너는 로컬 시스템 위에서 실행되지만, 컨테이너 내부는 도커 엔진에 의해 생성된 가상 네트워크에 속한다.
이 가상 네트워크는 컨테이너가 서로 통신하거나 필요에 따라 외부와 통신할 수 있게 해주지만, 컨테이너의 네트워크 환경은 로컬 시스템의 네트워크 환경과는 별개이다.
- 컨테이너는 고유한 ip주소를 할당받을 수 있지만, 이 ip주소는 도커가 관리하는 가상 네트워크 내에서만 유효하다. 로컬 시스템에서는 이러한 컨테이너의 ip주소로 직접 접근할 수 없으며, 포트 포워딩(포트 매핑) 같은 네트워크 설정을 통해 컨테이너에 접근해야한다.
포트 포워딩과 포트 매핑은 도커 컨텍스트에서 동일한 의미로 사용된다.
컨테이너에 연결하는 방법
로컬 환경에서 도커 컨테이너를 실행할때, 컨테이너와 연결하고 싶다면 localhost와 해당 컨테이너에 사용하는 포트로 접근하면 된다.
이 과정에서 중요한 것은, 도커 컨테이너가 사용하는 포트가 호스트의 포트와 올바르게 매핑되어야한다는 점이다.
포트 매핑
docker run -d -p 3307:3306 --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql:tag
위 명령어는 mysql 컨테이너를 실행하고, 호스트(사용자)의 3307 포트와 컨테이너의 3306 포트를 매핑한다.
(호스트와 컨테이너의 포트번호가 같아도 된다.)
컨테이너주소가 172.0.0.1이라고 할때, 172.0.0.1:3306과 127.0.0.1:3307을 연결한다는 뜻이다.
그러므로 이제부터는 컨테이너의 ip주소때문에 헷갈리지 말고, 로컬 주소와 매핑된 포트(3307)을 이용해 컨테이너에 접속하자! => 127.0.0.1:3307으로 접속!
'문제&해결' 카테고리의 다른 글
[Test] 데이터 의존성을 줄인 통합테스트 코드 작성 (MockUser, Spring Security) (0) | 2024.03.17 |
---|---|
@Value가 단위 테스트에서 동작하지 않는 문제 (생성자 주입, @WebMvcTest) (0) | 2024.03.11 |
로컬, docker 컨테이너 포트 충돌 : 포트 관리 중요성 (mysql) (0) | 2024.03.09 |
웹소켓 취약점 해결 : 인증 도입 (STOMP, Jwt, Spring Security) (3) | 2024.02.20 |
도커 volume 설정 + 환경 변수를 사용하여 H2 DB Url을 동적으로 설정하기 (로컬 / Docker 환경) (0) | 2024.01.30 |