본문 바로가기

GitOps/Docker

[Docker] 도커 네트워크

도커 네트워크

  • 기본 개념은 이 글에서
  • docker network는 DNS resolution을 제공하여 컨테이너 이름(및  ID)을 자동으로 IP 주소로 변환함.

관련 명령어

  • docker network ls: 네트워크 목록 확인 (표준 설치된 3개의 기본 네트워크가 존재)
  • docker network inspect <network>: 네트워크 구성 세부 정보
  • docker network create --driver <드라이버 종류> <드라이버 이름>: 사용자 지정 네트워크 생성

브릿지 네트워크

  • docker run에서 네트워크를 지정하지 않으면 기본적으로 docker0 bridge로 설정
  • 브릿지 드라이브로 생성된 모든 네트워크는 linux bridge라고 함

네트워크 확인

# network 확인
docker network ls

# linux bridge를 확인하기 위해 bridge-utils 설치
sudo apt-get update
sudo apt-get install bridge-utils

# linux bridge 확인.
brctl-show

# 이 명령으로도 확인 가능 (docker0가 나오면 됨).
ip a

호스트-컨테이너 연결 확인

# 컨테이너 실행 유지
docker run -dt ubuntu sleep infinity

# docker0의 interface가 연결된 것을 확인할 수 있음.
brctl show

# 해당 json에서 containers가 ubuntu container로 채워진 것을 볼 수 있음.
# 해당 부분에서 해당 컨테이너에 할당된 내부 IP 주소를 확인할 것.
docker network inspect bridge

# iputils-ping을 받고, container IP에 ping 쏴보기
sudo apt-get install iputils-ping
ping -c5 <container IP>

# 컨테이너를 열고 net-tools 설치 후 컨테이너 이더넷 확인
docker exec -it <container ID> /bin/bash
apt-get update && apt-get install -y net-tools
ifconfig

exit

컨테이너-컨테이너 연결 확인

# 사용자 정의 bridge network 생성 (안 해도 되지만 할 것을 권장)
docker network create --driver bridge my-bridge

# 서로 다른 두 컨테이너 생성
docker run -dit --name container1 --network my-bridge alpine ash
docker run -dit --name container2 --network my-bridge alpine ash

# 사용자 정의 bridge network에 연결 됐는지 확인 가능
docker network inspect my-bridge

# container1이 container2에게 핑 쏘기
docker exec container1 ping -c 4 container2

 


오버레이 네트워크


Docker Swarm

  • container orchestration 도구
  • 하나의 호스트는 하나의 swarm에만 속할 수 있음
  • swarm은 기본적으로 overlay network 사용
  • swarm cluster가 하나의 단위로, 오버레이 네트워크의 호스트들이 cluster 내부의 노드가 됨
  • 또한, overlay network의 자동 IP 할당 및 DNS 기반 서비스 탐색(네임서버)으로 컨테이너의 관리 및 탐색에 용이

관련 명령어

  • docker swarm init --advertise-addr <ip address>: ip 주소를 기반으로 swarm을 생성
  • docker swarm join --token <token> <ip address>: advertise 중인 swarm에 접속
  • docker service create --name <name> --network <network name> --replicas <컨테이너 개수> <image> <cmd> <args>: swarm cluster 내부에 특정 이미지를 기반으로 컨테이너를 n개 만들어서 주어지 명령어를 수행한 후에 network에 포함되게 하는 service 생성
  • docker node ls: docker swarm cluster에 속한 노드(호스트) 확인
  • docker node ps <node>: 노드에 속한 컨테이너 확인
  • docker service ls: service 확인
  • docker service ps <service>: service 내부 컨테이너 확인
  • docker service inspect <service>: service 상세 정보 확인

Swarm cluster 생성

# host 1

# swarm 초기화
docker swarm init --advertise-addr $(hostname -i)

##### host 2 실행 #####

# docker swarm cluster에 속한 노드들 확인
docker node ls

 

# host 2

# host 1에서 복사한 docker swarm join --token <이하 생략> 복사하기
docker swarm join --token SWMTKN-1-6cbl5c1fudexn20z4aq78gub54c214wfu5zeahyt06krsnogz8-2qtz3l10k5s0o07726aog68bg 172.31.36.98:2377

Overlay Network 및 service 생성

# host 1

# 오버레이 네트워크 생성
docker network create -d overlay my-overlay

# 생성 확인
docker network ls

# 네트워크 상세 정보
docker network inspect my-overlay

Service 생성

# host 1

# ubuntu 환경 컨테이너 2개를 포함하는 서비스 생성
docker service create --name my-service --network my-overlay --replicas 2 ubuntu sleep infinity

# 서비스 확인
docker service ls

컨테이너 - 컨테이너(호스트 - 호스트) 연결 테스트

# host 1

# 네트워크 확인으로 현재 호스트와 연결된 서비스의 컨테이너 이름 및 ip 확인 가능 
docker network inspect my-overlay

# 컨테이너 2 실행
docker exec -it my-service.2.vg7hvxcyhgb1euv6ki5r7as4y /bin/bash

##### host 2 실행 #####

# 컨테이너 2에서 컨테이너 1(host 2 소유) IP로 ping 쏘기
apt-get update && apt-get install -y iputils-ping
ping -c5 10.0.1.8

 

# host 2

# 현재 노드(host 2)에서 실행 중인 container 정보를 얻기 위해 네트워크 확인
docker network inspect my-overlay

Service Discovery 테스트

# host 1

# 서비스를 확인해서 service의 private IP 확인
docker service inspect my-service

##### host 2 실행 #####

# 컨테이너 2 실행
docker exec -it my-service.2.vg7hvxcyhgb1euv6ki5r7as4y /bin/bash

# IP 대신 DNS로 ping 보내기 (각각 service, 컨테이너 1)
ping -c5 my-service
ping -c5 my-service.1.y5v3nfp81d4oeybn86gbz0pf3

 

# host 2

# 현재 노드(host 2)에서 실행 중인 container 정보를 얻기 위해 네트워크 확인
docker network inspect my-overlay

Serivce, Node 제거

# service 제거 (manager만)
docker service rm my-service

# swarm에서 탈출 (node 제거)
docker swarm leave --force

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

[Docker] 웹사이트 배포  (0) 2025.01.12
[Docker] 이미지  (0) 2025.01.11
[Docker] 컨테이너  (0) 2025.01.10
[Docker] 개념  (0) 2025.01.09