본문 바로가기

IT 엔지니어/CLOUD

Docker Network

다른 CONTAINER 간 통신

Network 대역이 서로 다른 Container는 직접 통신이 불가하다.

이 경우, 한 Container가 두 Network에 모두 연결되어 있으면

Router 역할을 해줘서 다른 Contaienr들끼리 통신할 수 있다.

즉, 서로 다른 Network에 있는 Container끼리 통신하려면, 중간에 연결된 Container에 Routing 경로를 추가해 줘야 하는 것이다.

< 실습 >

Container들을 두 개의 서로 다른 Network에 배치하고, 그 사이에 하나의 Container(alpine3)가 Router 역할을 해서 모두 통신이 가능하게 만들기

alpine1
alpinenet
172.18.0.2/16
alpine2
alpinenet
172.18.0.3/16
alpine3
alpinenet
172.18.0.4/16
bridge
172.17.0.2/16
alpine4
bridge
172.17.0.3/16

시작하기 전!

1. # docker container attach [Container명] 으로 진입했을 때 exit으로 빠져나오면 Container 자체가 중지되어서 재진입 시 start를 해줘야 한다. Ctrl+P+Q로 빠져나오면 Container가 종료되지 않고 빠져나올 수 있다.

 

2. Router가 될 중계 Container의 IP Address를 잘 확인해야 한다. 이 IP가 alpine 1/2/4의 Gateway가 되어서 나중에 Routing Table을 추가할 때 gw ~로 작성하게 된다.

 

 

alpine Image를 다운로드 받고 IP를 지정해 'alpinenet' 이라는 사용자 정의 Bridge Network를 생성해 줬다.

# docker image pull alpine

# docker network create -d bridge alpinenet

alpinenet Network의 IP 정보를 확인해 주고

# docker network inspect alpinenet

Container를 생성해 줬다. alpine4는 기본 bridge Network에 배치해 준다.

( -dit : 백그라운드모드 + 인터랙티브 + TTY )

# docker container run -dit --name alpine1 --network=alpinenet --privileged alpine ash

# docker container run -dit --name alpine2 --network=alpinenet --privileged alpine ash

# docker container run -dit --name alpine3 --privileged alpine ash

# docker network connect alpinenet alpine3

# docker container run -dit --name alpine4 --network=bridge --privileged alpine ash

 

이제 alpine3은 두 개의 Netowrk에 연결된 중간 Container로, Router 역할을 수행할 수 있다. 추가적으로 Routing 기능 구현을 해 줘야 한다.

현재 구조

정상적으로 생성된 4개의 Container

# docker container ls -a

apline1에 접속해 IP 확인을 해봤다.

# docker exec -it alpine1 ash

/ # ip address

alpine1, alpine2에서 Routing을 설정해 준다. 우선 alpine1 Container 안으로 진입해서 기본 명령어를 다운로드 받고 Routing Table을 확인해 줬다.

확인 후 alpine1/2에서 alpine4가 있는 Network로 가는 경로를 alpine3(Router)에 지정해 줬다.

 

# docker container attach alpine1

/ # apk update

/ # apk add openrc --no-cache

/ # ip route

/ # route add -net 172.17.0.0 netmask 255.255.0.0 gw 172.18.0.4

alpine1 - 17 대역 추가됨

alpine2도 Routing Table에 17대역을 추가해 준다.

# docker exec -it alpine2 ash

/ # apk update

/ # apk add openrc --no-cache

/ # ip route

/ # route add -net 172.17.0.0 netmask 255.255.0.0 gw 172.18.0.4

alpine2 - 17 대역 추가됨

이제 alpine4에 alpine1/2로 가는 Routing 경로를 alpine3의 게이트웨이로 추가해 준다. alpine4가 18대역으로 되어 있어서 다시 기본 Network(Bridge)로 변경해 줬다.

# docker exec -it alpine2 ash

/ # apk update

/ # apk add openrc --no-cache

/ # ip route

/ # route add -net 172.18.0.0 netmask 255.255.0.0 gw 172.17.0.2

alpine4 - 18 대역 추가됨

이제 모든 Container끼리 통신이 된다.

alpine4 → alpine1


IMAGE TAG

[ UBUNTU CONTAINER 실행 ]

  • Ubuntu Container에 CPU/메모리 자원 제한을 걸고 실행
  • cAdvisor를 실행해서 Container Resource 모니터링

Ubuntu를 실행하되, Resource를 제한해서 격리된 Test 환경을 만든다.

# docker container run -dit --rm --name myweb -m 500m --cpuset-cpus 0-1 ubuntu

-dit : 백그라운드 실행 + TTY + interactive

--rm : 컨테이너 종료되면 자동 삭제

-m 500m : 메모리 사용량 최대 500MB 제한

--cpuset-cups 0-1 : CPU0, 1번만 사용

<250> - WEB / DB 서버 구축

# docker container run -d --name=myweb -p 80:80 -v /var/webdata:/usr/local/apache2/htdocs httpd

# vi /var/webdata/index.html

httpd://192.168.10.250:80

# docker container run --name mydb -dit -p 3306:3306 -v mydbvol:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mariadb

<200> - 250 DB에 원격 접속 Test, Test 후 mydb 삭제

# mysql -h 192.168.10.250 -u root -p

성공적으로 접속됨

< WORDPRESS 연동을 위한 MYSQL DB 생성 >

# docker container run -d --name mydb --restart=always -v mydbvl:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=wordpress -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=wordpress mysql

< WORDPRESS 설치 >

docker container run -d --name wordpress -v wordpress:/var/www/html --link mydb:mysql --restart=always -e WORDPRESS_DB_HOST=mysql:3306 -e WORDPRESS_DB_PASSWORD=wordpress -p 80:80 wordpress

< Image 태그 >

  • Docker Image에 태그를 붙여 커스텀 이름으로 관리
  • Docker Hub에 업로드하기 위한 준비

# docker pull alpine

# docker image tag alpine damibae/alpine:1.0

# docker image ls -a

로컬 이미지에 업로드용 태그 붙이고 이미지 업로드 (Push)

# docker tag alpine [ID]/alpine:1.0

# docker push [ID]/alpine:1.0

 

 

 
 

CADVISOR

[ CADVISOR ]

  • Google이 만든 Container 모니터링 도구
    • 시각적이고 종합적인 Resource 모니터링이 가능
  • 각 Container의 CPU, 메모리, Network, Disk 사용량을 실시간으로 확인 가능
  • Web 기반 인터페이스로 http://[Host IP]:8080으로 접속

[ CADVISOR에서 볼 수 있는 주요 정보 ]

CPU 그래프
user 영역, kernel 영역 각각의 CPU 사용률 표시
Memory
전체 메모리 사용량 및 hot 페이지
Disk I/O
디스크 읽기/쓰기 정보
Network
네트워크 입출력 현황
Container 별 모니터링
각 컨테이너별 리소스 소비량

< Ubuntu 기반 Resource 제한 Container 실행 >

Resource를 제한하고 실행 후 자동 삭제되도록 실행한다. (메모리 최대 사용량 500MB로 제한, CPU 코어 0,1번만 사용)

# docker container run -itd --rm --name myweb -m 500m --cpuset-cpus 0-1 ubuntu

< cAdvisor 실행 >

버전을 선언하고, Docker로 cAdvisor 실행시킨다. 명령어를 통해 시스템 모니터링을 위해 Host 시스템의 정보를 읽을 수 있게 다양한 디렉터리와 디바이스를 연결해 준다.

# VERSION=v0.49.1

# docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:ro --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --volume=/dev/disk/:/dev/disk:ro --publish=8080:8080 --detach=true --name=cadvisor --privileged --device=/dev/kmsg gcr.io/cadvisor/cadvisor:$VERSION

< Web 브라우저 cAdvisor 실행 >

httpd:192.168.10.100:8080

Doker Containers 들어가면 Container 목록 나와있음


DOCKER IMAGE CONTAINER 백업 / 복구 관리

commit
Container → Image
export
Container → 파일 시스템 tar
import
tar 파일 → Image
save
Image → tar 파일
load
tar 파일 → Image
system prune
불필요한 자원 일괄 정리

[ CONTAINER 기반 IMAGE 생성 ]

  • 실행 중이거나 멈춘 Container의 상태 그대로를 Image로 저장
  • Image 커스터마이징 후 저장할 때 유용
# docker container commit [Container명] [Image명]

[ CONTAINER 파일 시스템 백업 (tar 생성) ]

  • Container 파일 시스템 전체를 tar 파일로 저장
  • Container 파일 및 디렉터리를 Host에 tar 파일로 생성
# docker container export [Container명] > [저장파일명].tar

[ tar 파일에서 IMAGE 생성 (복원) ]

  • export한 tar 파일을 기반으로 새로운 Image 생성 가능
  • Host tar 파일을 이용하여 Image 생성
# docker image import [저장파일명].tar [Image명]

[ IMAGE 자체를 TAR로 저장 ]

  • Image 전체를 포함한 tar 형식 파일로 저장
  • export와 다르게 Image의 메타데이터까지 포함됨
  • Image를 Host에 tar 파일로 저장
# docker image save -o [저장파일명].tar [Image명]

[ TAR로 저장된 IMAGE 불러오기 ]

  • save로 저장된 Image를 다시 Docker에 불러옴
  • Host에 tar Image 파일을 이용하여 Image 생성
# docker image load -i [Image파일].tar

[ 불필요한 DOCKER 자원 정리 ]

  • 중지된 Container, 사용하지 않은 Image/Network Volume 삭제
  • 저장 공간 확보에 유용
# docker systemc prune

[ 옵션 ]

- a : 생성한 사람

- m : 메시지 추가

mycloud로 Container를 생성해 줬다.

# docker pull linuxserver/nextcloud

# docker run -dit --name mycloud linuxserver/nextcloud

# docker container commit -a "dami" -m "mycloud-img" myweb1 damibae/mycloud:1.0

 
 

'IT 엔지니어 > CLOUD' 카테고리의 다른 글

Docker Network 심화  (0) 2025.05.12
Docker file  (0) 2025.05.11
Docker network  (0) 2025.05.10
Docker DB  (2) 2025.05.09
Docker volume/bind mount  (0) 2025.05.07