Super Kawaii Cute Cat Kaoani
본문 바로가기
{Bootcamp}/KT Cloud Tech up 클라우드 인프라

[kt cloud] 도커 실습 (3)

by wonee1 2026. 9. 17.
728x90

 

 

1. Docker Network 

 

1-2. Docker Network - 네트워크 유형 7가지

컨테이너를 위한 추가 네트워크를 만들 때 선택하는 드라이버(-d) 종류다. 

 

1. Bridge -d bridge 기본값, 172.17.x IP 자동 일반 단일 호스트
2. Host-Only -d null 네트워크 없음(none) 격리/보안
3. Container 공유 -d container:이름 IP·MAC 공유 컨테이너 짝 통신
4. Host 공유 -d host 호스트 네트워크 직접 사용 성능 극대화
5. Macvlan -d macvlan 물리망과 연동 컨테이너에 실제 IP
6. Overlay -d overlay 여러 호스트 연결 Swarm 클러스터
7. 3rd party weave/flannel 등 외부 솔루션 대규모 K8s

 

1. Bridge (기본, 가장 많이 씀)

컨테이너 --172.17.x.x--> docker0 브리지 --> 외부
오늘 계속 쓴 그 네트워크 (컨테이너 IP가 172.17.0.x였던 것)
  • 같은 브리지 컨테이너끼리 통신 가능
  • 외부 접속은 -p 포트 매핑 필요 (오늘 계속 한 것)

 

2. Host-Only (-d null)

= none 네트워크. 컨테이너에 네트워크 인터페이스 없음
→ 완전 격리 (외부와 아무 통신 안 함)
  • 보안이 극도로 중요하거나, 네트워크 필요 없는 작업용

 

3. Container 공유 (-d container:이름)

컨테이너 B가 컨테이너 A의 네트워크를 그대로 씀
→ IP와 MAC 주소를 공유 (같은 네트워크 이름공간)
→ localhost로 서로 통신
  • 사이드카 패턴(로그 수집기 등)에서 사용

 

4. Host 공유 (-d host)

컨테이너가 호스트 네트워크를 직접 사용
→ 포트 매핑(-p) 불필요, 호스트 포트 그대로 씀
→ 네트워크 격리 없음 (가장 빠름)
  • 성능이 중요하고 격리가 덜 중요할 때

 

5. Macvlan (-d macvlan)

컨테이너가 물리 네트워크에서 진짜 IP를 받음
→ 물리망의 다른 장비들이 컨테이너를 실제 기기처럼 인식
  • 컨테이너를 물리 네트워크에 직접 노출할 때

 

6. Overlay (-d overlay)

여러 Docker 호스트를 하나의 네트워크로 묶음
→ 호스트 A의 컨테이너 ↔ 호스트 B의 컨테이너 통신
→ Docker Swarm 클러스터 모드에서 사용
  • 여러 서버에 컨테이너를 분산할 때 (앞의 클라우드 네이티브, MSA와 연결)

 

7. Third-party (weave/flannel/openswitch)

Docker 기본 대신 외부 네트워크 솔루션 사용
→ Kubernetes에서 flannel/calico 등 많이 씀
  • 대규모 컨테이너 오케스트레이션 환경

 

 

 

1-2. 네트워크 추가하고 사용하기

네트워크 유형으로 실제 네트워크를 만들고 컨테이너에 연결하는 명령이다. 

 

네트워크 만들기

docker network create -d [TYPE] \
  --subnet=172.31.0.0/16 \
  --ip-range=172.31.0.0/24 \
  --gateway=172.31.0.1 \
  net_name
-d [TYPE] 드라이버 유형 (bridge 등) -d bridge
--subnet 전체 IP 대역 172.31.0.0/16 (6만여 개)
--ip-range 실제 할당할 범위 172.31.0.0/24 (254개)
--gateway 게이트웨이 IP 172.31.0.1
net_name 네트워크 이름 원하는 이름

 

subnet vs ip-range 차이

--subnet    172.31.0.0/16   → 전체 주소 공간 (172.31.0.0 ~ 172.31.255.255)
--ip-range  172.31.0.0/24   → 그중 실제 나눠줄 범위 (172.31.0.0 ~ 172.31.0.255)

큰 땅(subnet)을 정하고, 그중 일부(ip-range)만 컨테이너에 실제 배정

 

→ subnet은 이 네트워크가 쓸 전체 대역,  ip-range는 그중 컨테이너에 실제로 줄 부분 이다.

ip-range를 좁히면 나머지는 예약해두고 특정 범위만 자동 할당하게 된다.

 

gateway란

--gateway=172.31.0.1
              ↑
   이 네트워크에서 외부로 나가는 출입구 IP
   (컨테이너들이 밖으로 나갈 때 거치는 문)

 

 

네트워크 사용하기

docker run -d --net net_name image
                   ↑
             만든 네트워크에 컨테이너 연결
--net(=--network) 옵션으로 컨테이너를 특정 네트워크에 붙임
→ 안 쓰면 기본 bridge에 연결됨 (172.17.x)
→ 쓰면 내가 만든 net_name(172.31.x)에 연결됨

 

기본 bridge: 컨테이너끼리 IP로만 통신 (이름 못 씀)
커스텀 net : 컨테이너 이름으로 통신 가능 (DNS 자동 제공)

 

 

 

docker network create -d bridge mynet
docker run -d --net mynet --name web nginx
docker run -d --net mynet --name db mysql
# web에서 "db"라는 이름으로 바로 접속 가능 (IP 불필요)

 

전체 흐름

# 1. 네트워크 생성
docker network create -d bridge --subnet=172.31.0.0/16 mynet

# 2. 확인
docker network ls
docker network inspect mynet

# 3. 컨테이너를 그 네트워크에 연결
docker run -d --net mynet --name web nginx

# 4. 확인 (컨테이너가 172.31.x IP 받았나)
docker inspect web | grep IPAddress

 

 

 

실습 정리 

net3 네트워크 추가

 

 

d run --net=net3 --rm --link web:nginx alpine ping -c2 nginx
      ↑          ↑    ↑                ↑     ↑
    net3에서   자동삭제  별칭연결        alpine  nginx라는 이름으로 ping
--net=net3 net3 네트워크에서 실행
--rm 끝나면 컨테이너 자동 삭제
--link web:nginx web 컨테이너를 "nginx"라는 별칭으로 연결
alpine ping -c2 nginx alpine으로 nginx에 ping 2번

 

 

d run --net=container:web -it alpine
           ↑
    web 컨테이너의 네트워크를 "공유"

 

 


 

2. Docker Compose

 

여러 컨테이너를 YAML 파일 하나로 묶어서 관리하는 도구다. 지금까지 docker run을 옵션 잔뜩 붙여 하나씩 실행했는데, Compose는 그걸 파일에 적어두고 한 번에 띄운다.

 

여러 컨테이너를 한 Project로 관련 컨테이너를 묶어 통합 관리
run 옵션을 파일로 정의 network, volume, 의존성을 YAML에 명시
Scale out 지원 컨테이너를 여러 개로 복제 (수평 확장)
Service Discovery 컨테이너끼리 이름으로 자동 발견
YAML 스크립팅 인프라를 코드로 자동 구성 (IaC)
Docker 플러그인 내장 별도 설치 없이 docker compose로 사용

 

지금까지 (docker run):
  docker run -d --net=net3 --name web nginx
  docker run -d --net=net3 --name db mysql
  docker run -d --net=net3 --name cache redis
  ...컨테이너마다 긴 명령 반복, 순서 신경, 옵션 외우기

Compose (docker-compose.yml 하나):
  파일에 다 적어두고 → docker compose up 한 방

 

docker-compose.yml 예시

version: "3"
services:
  web:
    image: nginx
    ports:
      - "80:80"          # -p 80:80
    networks:
      - net3
    volumes:
      - /share:/usr/share/nginx/html    # -v
  db:
    image: mysql
    networks:
      - net3
    depends_on:
      - web              # web 먼저 뜬 후 db (의존성)

networks:
  net3:                  # 커스텀 네트워크도 자동 생성

 

 

 

Service Discovery (오늘 배운 그것)

Compose가 서비스 이름으로 자동 통신 지원
→ web 컨테이너에서 "db"라는 이름으로 바로 접속
→ 앞에서 커스텀 네트워크로 이름 통신했던 것과 같은 원리

Scale out (수평 확장)

docker compose up --scale web=3
→ web 컨테이너를 3개로 복제 (부하 분산)

 

 

IaC (인프라를 코드로)

YAML 파일 = 인프라 설계도
→ 파일만 있으면 어디서든 동일한 환경 재현
→ 클라우드 네이티브의 IaC 개념 (Ansible/Terraform과 같은 맥락)

 

 

기본 명령어

docker compose up -d        # 파일대로 전체 실행 (백그라운드)
docker compose down         # 전체 정지 + 삭제
docker compose ps           # 상태 확인
docker compose logs         # 로그 확인
docker compose up --scale web=3   # 특정 서비스 복제

 

 

 

실습 

 

mkdir wp;cd wp
vi docker-compose.yaml
services:
  wordpress:
    image: wordpress
    restart: always
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_RANDOM_ROOT_PASSWORD: '1'

 

 

 

 

wp 접속 가능

 

 

 

db 접속하기

 

로그인 정보 확인가능

 

 

 

 

 

 

728x90