Nginx 컨테이너를 실행했는데 브라우저에서 localhost:8080이 열리지 않는다면, 먼저 호스트와 컨테이너의 포트를 구분하자. 컨테이너 안의 서버가 80번에서 듣고 있어도 호스트의 8080번으로 자동 연결되지는 않는다. -p로 경로를 열어야 한다.
docker container run --rm --name demo-nginx -p 127.0.0.1:8080:80 nginx127.0.0.1은 호스트에서 접속을 허용할 주소, 8080은 호스트 포트, 80은 Nginx가 듣는 컨테이너 포트다. 다른 터미널에서 curl -I http://127.0.0.1:8080으로 HTTP 응답을 확인한다. 실행 터미널에서 Ctrl+C를 누르면 --rm 때문에 이 실습 컨테이너는 삭제된다. 같은 이름의 컨테이너가 이미 있거나 호스트 8080번이 사용 중이면 먼저 그 충돌을 확인하자.
앱의 바인딩 주소도 확인한다
연결이 실패하면 한 번에 방화벽만 바꾸지 말고 세 경계를 차례로 본다.
docker container ls
docker container port demo-nginx
curl -I http://127.0.0.1:8080목록에 컨테이너가 없다면 서버 프로세스가 끝났거나 시작에 실패했을 수 있다. 컨테이너는 실행 중인데 container port 결과가 기대와 다르면 -p 설정을 다시 본다. 매핑이 맞아도 컨테이너 안 앱이 그 포트에서 듣지 않으면 연결되지 않는다. 자신의 앱이라면 바인딩 주소가 컨테이너 내부의 루프백에만 묶이지 않았는지도 확인한다. 이 예제의 nginx는 컨테이너 80번을 사용한다.
공개 포트는 최소화한다
주소를 생략한 -p 8080:80은 기본적으로 호스트의 모든 인터페이스에 게시될 수 있다. 로컬 확인만 할 때는 위처럼 127.0.0.1을 명시한다. 다만 오래된 Docker 버전에서는 같은 네트워크 구간의 다른 호스트가 로컬 바인딩 포트에 접근할 수 있었으므로 버전과 네트워크 정책을 함께 확인해야 한다. 세부 경계는 Docker 포트 게시 문서를 참고하자. 데이터베이스나 관리 포트는 편의를 위해 무심코 공개하지 말고, 필요한 진입점만 열어 둔다.
핵심 요약
Docker 포트 매핑은 호스트의 8080을 컨테이너의 80에 연결한다. 연결 실패는 컨테이너 실행 상태 → 포트 매핑 → 앱 리스닝 순서로 좁히자. 로컬 확인에는 호스트 주소를 명시하고, 운영에서 공개할 포트는 별도로 결정한다.

