본문 바로가기

끄적끄적/IT공부

[IT공부]Docker-Docker Network

도커(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를 몰라 컨테이너명을 사용하여 송수신이 가능한 것을 알 수 있었다.