다른 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 |