| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 |
- 데코레이터패턴
- 라라벨
- dhgrp
- SQL문법
- docker
- MCP
- 디자인패턴
- 객체복제
- 매직메서드
- mcp client
- Tool Calling
- 소프트웨어설계
- 인덱스
- MySQL
- OOP
- ai agent
- 객체지향
- 데이터베이스
- PHP
- LLM
- linux 권한
- PHP객체지향
- Agent Loop
- ai 에이전트
- SQL기초
- docker network
- SQL
- 어댑터패턴
- Laravel
- mcp server
- Today
- Total
개발블로그
Docker Container의 Port와 Network 통신 구조 본문
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 |