도커(Docker)는 개발부터 배포까지 일관된 환경을 유지하고 싶을 때, 많은 개발자들이 선택하는 기술이다.
온프레미스&클라우드에서 도커를 사용하여 컨테이너를 올릴 때 여러개를 올릴 경우가 있는데, 도커가 구동되는 Host 안에는 도커 컨테이너끼리 통신하는 네트워크가 형성된다.(bridge, host, none)
도커(Docker)
왜 도커를 사용할까
- 일관된 환경: 개발, 테스트, 운영환경에서 동일한 환경 보장
- 빠른 배포 및 실행: OS 부팅이 아닌 프로세스 수준의 실행
- 경량화: 가상머신보다 훨씬 가볍고 빠름
- 이식성: 어디서든 동일하게 실행 가능 (Linux, Windows, Cloud 등)
도커 핵심 개념
| 이미지(Image) | 컨테이너를 실행하기 위한 실행 파일, 설정 등 모든 구성 요소가 포함된 템플릿 |
| 컨테이너(Container) | 이미지를 실행한 상태. 실제로 동작하는 독립된 실행 환경 |
| 도커파일(Dockerfile) | 이미지를 만들기 위한 설정 파일 |
| 도커허브(DockerHub) | 도커 이미지 저장소 |
도커 네트워크(Docker Network)
도커에서 컨테이너를 실행할 때, 컨테이너 간 네트워크를 어떻게 설정하느냐에 따라 동작 방식이 달라진다.
도커는 대표적으로 다음 3가지 네트워크 모드를 제공한다.
Bridge 모드 (기본값)
컨테이너들은 도커가 자동으로 생성하는 가상 브리지 네트워크 (docker0)를 통해 통신
- 컨테이너마다 고유한 IP가 할당됨 (가상 네트워크 안에서만 유효)
- 서로 다른 컨테이너 간 통신 가능 (IP or 컨테이너 이름으로)
- 외부에서 접속하려면 포트 포워딩(-p 옵션) 필요
# 터미널1 (kn) : kn 이름의 busybox 컨테이너 생성
docker run -it --name=kn --rm busybox
ip addr
# 터미널2 (ou) : ou 이름의 busybox 컨테이너 생성
docker run -it --name=ou --rm busybox
ip addr
# 터미널3 (호스트)
docker ps
📌 장점: 기본 모드로 안전하며 격리된 네트워크 환경 제공
📌 단점: 약간의 성능 오버헤드 (NAT 변환)
Host 모드
컨테이너가 Host(호스트)의 네트워크를 그대로 사용(별도 가상 네트워크 없음)
# 컨테이너 실행
docker run --rm -d --network host --name my_nginx nginx
# HostConfig.NetworkMode "host" , Config.ExposedPorts "80/tcp" , NetworkSettings.Networks "host" 확인
docker inspect my_nginx
# 네트워크 상태 확인
netstat -ntlp
# curl 접속 확인
curl -s localhost | grep -o '<title>.*</title>'
# 추가 실행 시도
docker run -d --network host --name my_nginx_2 nginx
# 확인
docker ps -a
# 삭제
docker container stop my_nginx
📌 장점: 높은 성능, 네트워크 레이턴시 최소화
📌 단점: 보안 격리 부족, 포트 충돌 가능성 있음
None 모드
컨테이너에 네트워크를 아예 연결하지 않음.
# None 네트워크로 Nginx 실행
docker run --rm -d --network none --name my_nginx nginx
# Docker Inspect 로 정보 확인
docker inspect my_nginx | grep NetworkMode
# 네트워크 정보 조회
netstat -ntlp
# 컨테이너 내부 환경 확인
docker exec -it my_nginx /bin/bash
ip addr
ping 8.8.8.8
curl localhost
- 외부와의 통신 불가능
- 내부 네트워크 카드도 없음
📌 장점: 완전한 격리, 테스트나 보안적으로 유용
📌 단점: 실제 사용 시 활용도 낮음 (기본 네트워크 기능 없음)
네트워크 모드 비교
모드특징사용 사례
| Bridge | 기본값, 가상 브리지로 컨테이너 통신 | 대부분의 일반적인 개발/운영 환경 |
| Host | 호스트 네트워크 공유 | 고성능 요구, 성능 테스트 |
| None | 네트워크 없음 | 보안 테스트, 디버깅 |
도커 Bridge 모드를 사용한 경험
과거 회사에서 개발 할 때, 파일을 빌드하여 운영서버에 올리기 전까지는 프론트, 백, nginx 컨테이너를 생성하여 작업했다.
version: '3.7'
services:
backend:
build: ./backend
ports:
- 8003:8000
volumes:
- ./backend:/usr/src/app
restart: always
ipc: host
environment:
- DB_HOST=192.168.x.x
- DB_NAME=NAME
- DB_USER=root
- DB_PW=password
- TZ=Asia/Seoul
command: python manage.py runserver 0.0.0.0:8000 --insecure
frontend:
build: ./frontend
ports:
- 3003:3000
volumes:
- ./frontend:/usr/src/app
restart: always
ipc: host
environment:
- CHOKIDAR_USEPOLLING=true
- TZ=Asia/Seoul
command: npm start
nginx:
build: ./nginx
ports:
- 84:80
depends_on:
- backend
- frontend
restart: always
위와 같이 yml을 사용하여 컨테이너를 생성한 후, nginx에서 프론트&백을 연결 할 때에는 해당 컨테이너의 IP를 몰라 컨테이너명을 사용하여 송수신이 가능한 것을 알 수 있었다.
'끄적끄적 > IT공부' 카테고리의 다른 글
| [IT공부]Kubernetes Availablity (1) | 2025.05.11 |
|---|---|
| [IT공부]Kubernetes 소개 & Kubernetes 기본 활용 - 1 (0) | 2025.04.27 |