개발블로그

Docker Container의 Port와 Network 통신 구조 본문

STUDY/Docker

Docker Container의 Port와 Network 통신 구조

devmel 2026. 8. 26. 14:52
Contents 접기
 

Docker Port

 

개념

Host/외부 → Container 접근

 

Container은 별도의 Network 환경을 가짐 (Host와 분리된)

, Container 외부에서 해당 Service에 접근하려면 Container Port를 Host에 공개(publish) 해야 함

 

방법 - Port Mapping

-p Host_IP:Host_Port:Container_Port

 

- Host_IP는 생략시 => 일반적으로 Host의 Network Interface에 Port가 Publish 됨.

 

ex)

docker run -d \
  --name web \
  -p 8080:80 \
  nginx
  
# Host Port - 8080 => 외부에서 접근할 Port
# Container Port - 80 => Container 내부 Application이 사용하는 Port

 

http://localhost:8080 으로 접근하지만, 실제 nginx는 Container 내부의 80 Port에서 요청을 받음 

 

차이 - EXPOSE 

Dockerfile에서 다음과 같이 작성하는 경우가 있음

 

EXPOSE 80

 

하지만 EXPOSE가 Host의 Port를 실제로 공개하는 것은 아니다. 

Contaier에서 어떤 Port를 사용하는지 명시하는 정보에 가까움. 

 

실제로 Host → Container 접근을 가능하게 하는 것은 -p를 이용한 Port Publishing.

 

주요 명령어

명령어 역할
docker ps 실행 중인 Container와 Port Mapping 확인
docker port CONTAINER 특정 Container의 Port Mapping 확인

 

ex)

docker port web

 

결과예시)

80/tcp -> 0.0.0.0:8080

 

의미)

Container :80
     ↓
Host :8080


 

Network

 

개념

Container ↔ Container 통신

 

실제 Application에서는 Container 하나만 사용하는 경우보다 여러 Container가 함께 동작하는 경우가 많음. 

 

Docker Network 

= Container들이 서로 통신할 수 있도록 연결하는 Network 환경

=> 같은 Network에 연결된 Container 끼리는 직접 통신할 수 있다. 

 

방법

User-defined Network 생성

docker network create my-network

 

Container를 해당 Network에 연결해서 실행

docker run -d \
  --name db \
  --network my-network \
  mysql
docker run -d \
  --name web \
  --network my-network \
  nginx

my-network

├─ web Container

└─ db Container

 

Container 이름으로 통신 (in User-defined Network)

 

Container 이름을 Host 처럼 사용 할 수 있음

Container 이름에 대한 자동 DNS Resolution을 제공 

 

ex) web Container에서 Database 연결

DB_HOST = db 

- db = Database Container의 이름 

 

※ Port Mapping 은 필요하지 않음

=> 내부 Network를 통해 직접 통신할 수 있음. 

 

관련 주요 명령어 

명령어 역할
docker network ls Docker Network 목록 확인
docker network create NAME Network 생성
docker network inspect NAME Network 상세 정보 확인
docker network connect NAME CONTAINER 기존 Container를 Network에 연결
docker network disconnect NAME CONTAINER Container를 Network에서 분리
docker network rm NAME Network 삭제

 

 

관련 Docker Compose 설정

services:
  service-a:
    networks:
      - network-a

  service-b:
    networks:
      - network-a

networks:
  network-a: => docker network create로 만든 네트워크 
    driver: bridge

services 하위의 networks - 해당 Container가 어떤 Network에 연결될지 지정

최상위 networks - 사용할 Network 자체의 속성과 생성 방식을 정의 

 

ex)

services:
  web:
    networks:
      - frontend
      - backend

  app:
    networks:
      - backend

  db:
    networks:
      - backend

networks:
  frontend:
    driver: bridge

  backend:
    driver: bridge

 

 

구조]

frontend
├─ web

backend
├─ web
├─ app
└─ db

: web은 두 Network에 모두 연결되어 있으므로 양쪽 Network의 Container와 통신 가능

, 반면 db는 backend에만 연결되어 있으므로 frontend에만 있는 Container와는 직접 통신할 수 없다. 

 

network: 생략시

=> Compose가 자동으로 Network를 생성하고 모든 서비스를 연결함. 

default network
├─ web
├─ app
└─ db

 

=> Network를 직접 정의하는 이유 : 주로 서비스 간 통신 범위를 분리하거나 여러 Compose 프로젝트가 특정 Network를 공유해야 할 때. 

 

driver

Network가 어떤 방식으로 동작할지를 지정 

 

[bridge]

일반적인 단일 Docker Server에서는 대부분 이 값을 사용

 

의미)

같은 Docker Host 내부의 Container들을 연결하는 가상 Network 

=> 같은 network에 있는 Container들은 Docker DNS를 사용해 서비스 이름으로 접근할 수 있음 

 

external : true

Compose가 Network를 새로 생성하지 않고, Docker에 이미 존재하는 Network를 사용 

cf) driver : bridge => Compose 별로 별개의 network가 만들어질 수 있음 

 

용도)

서로 다른 Compose 프로젝트가 하나의 Network를 공유해야 할 때 자주 사용.

 

ex)

project-a/
└─ compose.yaml

project-b/
└─ compose.yaml

project-c/
└─ compose.yaml

 

각 프로젝트에서 

networks:
  shared-network:
    external: true

 

다음처럼 동일한 Network 공유 가능

shared-network
├─ project-a의 Container
├─ project-b의 Container
└─ project-c의 Container

 

 

 

internal: true

networks:
  backend:
    driver: bridge
    internal: true

 

Network를 외부와 격리된 내부 network로 만들 때 사용 (외부 연결 제한)

 

 

name

Compose가 실제 Docker Network에 사용할 이름을 직접 지정 가능 

networks:
  backend:
    name: my-backend-network
    driver: bridge

 

이걸 생략하면 일반적으로 Compose 프로젝트 이름이 붙는다 

ex) 

networks:
  backend:
    driver: bridge

=> 생성 : myapp_backend 

 

 

'STUDY > Docker' 카테고리의 다른 글

Dockerfile  (0) 2026.08.26
Docker  (0) 2026.08.26
Docker Volumn과 데이터 영속성  (0) 2026.08.26
Docker Image  (0) 2026.08.26
Docker Compose  (1) 2026.08.26