본문 바로가기

IT 엔지니어/CLOUD

Docker network

DOCKER NETWORK

[ DNS 수동 지정 ]

  • --dns : Container 내부에서 사용할 DNS 서버 (수동) 지정
# docker container run -d --dns [DNS] [Image]

# docker container run -d --dns 8.8.8.8 nginx

[ CONTAINER 내부 HOST 등록 ]

  • 지정한 Image 기반으로 새로운 Container 생성
  • 실제 DNS 설정을 바꾸는 게 아닌, 해당 Container 안에서만 적용됨
# docker container run -it --add-host [Host명]:[IP주소] [Image]

--add-host docker1:192.168.10.101로 Container 안에서 docker1 이름을 이 IP로 인식하게 해줬을 뿐,

해당 IP에 실체 장비가 있어야 물리적으로 네트워크에 있어서 통신이 가능해진다.

실제 존재하는 서버가 아니기 때문에 ping, curl이 통하지 않는다.

즉, 이 IP는 내가 접근하고 싶은 누군가의 주소로 설정한 것이고, Container가 해당 IP를 직접 만들거나 갖게 되는 것이 아니다.

# docker container run -it --add-host docker1:192.168.10.101 centos:8

파일 안에 지정한 host 추가되어 있다.

# vi /etc/hosts

[ NETWORK 추가 및 확인 ]

  • 새로운 Docker Network 생성
    • bridge 타입 : 기본 Docker Network와 유사한 형식
# docker network create -d bridge [Network명]

# docker network create -d bridge mynet

  • 시스템 전체 Network 인터페이스 확인
    • 어떤 인터페이스가 생성되었는지 확인 가능
    • Docker가 만든 bridge 네트워크 = 인터페이스 이름이 br-로 시작
  • Linux에 생성된 실제 Bridge 인터페이스 이름
# ip address

생성된 Docker Network : br-d1c9ce7a6e13

  • Docker에서 현재 존재하는 Network 리스트 확인
  • Network의 논리적 이름
# docker network ls

추가된 Docker Network : d1c9ce7a6e13

[ 생성된 NETWORK를 이용해 Container 생성 ]

  • Container가 기본 bridge가 아닌 생성한 Network 안에 들어가서 실행됨
  • Container끼리 같은 Network 안에 있으면, 이름으로도 서로 통신 가능
# docker container run -it --name [Container명] --network=[Network명] [Image]

# docker container run -it --name myweb --network=mynet centos:8


CONTAINER 생성

: 기본 vs 사용자 정의 NETWORK

[ 차이점 ]

  • Container 간 연결성
  • DNS 기반 통신 여부
  • Network 분리 수준

[ 기본 실행 ]

  • 빠르고 편하지만 Container 간 통신 / 관리 어려움

[ 사용자 정의 Network ]

  • 조금 더 설정이 필요하지만 이름 기반 통신, Network 격리, 실무 환경 구성에서 훨씬 뛰어남
기본 Container 실행
사용자 정의 Network 사용
사용 Network
기본 bridge
직접 만든 Network명 등
Container 간
이름으로 통신
X (IP로만 가능)
이름만으로 통신 가능
Network 분리
모든 Container가 같은 Network에
독립된 Network로 분리 가능
보안성
(모든 Container가 같은 bridge 공유)
(분리된 가상 Network 사용)
관리
단순
Docker Compose 등과 잘 연동됨

NETWORK 출력

[ NETWORK 출력 FILTERING ]

# docker netwokr ls --filter driver=[Driver명]

# docker network ls --filter driver=bridge

# docker network ls --filter driver=host

# docker network ls --filter driver=null

[ NETWORK 상세 정보 출력 ]

  • --no-trunc : 출력에서 ID가 생략(truncate) 되지 않고 전체 Hash 값 출력
# docker netwokr ls --no-trunc

# docker network ls --no-trunc

[ NETWORK 간단히 출력 ]

  • -q : ID만 출력 (quiet 모드)
# docker network ls -q --filter [Filter종류]=[값]

# docker network ls -q --filter id=5e

# docker network ls -q --filter name=mynet

# docker network ls -q --filter driver=bridge


인터페이스 생성 및 NETWORK 설정 / 지정 / 생성

[ 기본 NETWORK 생성 ]

# docker network create -d bridge [Network명]

# docker network create -d bridge br0

[ SUBNET 지정하여 NETWORK 생성 ]

# docker network create -d bridge --subnet [Subnet주소] [Network명]

# docker network create -d bridge --subnet 192.168.100.0/24 br1

[ SUBNET / GATEWAY 지정하여 NETWORK 생성 ]

  • Network 대역 / 이름은 중복 불가
# docker network create -d bridge --subnet [Subnet주소] --gateway [Gateway주소] [Network명]

# docker network create -d bridge --subnet 192.168.200.0/24 --gateway 192.168.200.1 br2

[ 생성된 Network 삭제 ]

  • 해당 Network를 사용하는 Container가 없어야 삭제 가능
# docker network rm [Network명]

# docker network rm br0 br1

[ Network 상세 정보 출력 ]

  • Subnet, Gateway, 연결된 Container, Driver 정보 등
# docker network inspect [Network명]

# docker network inspect br2


구독 중인 CONTAINER 연결 & 해제 & 실행

[ CONTAINER 백그라운드 실행 ]

  • -i : 터미널 입력 활성화
  • -t : TTY 할당 (가상 터미널)
# docker container run -itd --name [Container명] [Image]

# docker container run -itd --name myos ubuntu

[ CONTAINER 백그라운드 실행 ]

  • 실행 중인 Container 내부로 접속
  • Container start 후 접속 가능
  • # exit = 종료
# docker container attach [Container명]

# docker container attach myos

[ 구독 중인 CONTAINER에서 프로세스 실행 ]

  • Container 생성 및 종료

myweb 라는 이름으로 Ubuntu Container 생성을 해준다.

exit로 현제 세션만 종료하고 Container를 중지시켰다.

# docker container run -it --name myweb ubuntu bash

/# exit

  • Container 재시작

중지 상태인 Container myweb 재시작을 해준다.

# docker container start myweb

  • Container 안에서 touch 명령 실행
    • exec = Container 안에서 새 프로세스를 실행
# docker container exec [Container명] [명령어]

실행 중인 Container 안에서 파일 file.txt을 생성해 준다.

# docker container exec myweb touch /tmp/file.txt

  • Container 접속해서 결과 확인

/tmp 디렉터리로 이동해 정상적으로 file.txt. 파일이 생성된 것을 확인했다.

# docker container attach myweb

/# cd /tmp

[ EXEC vs ATTACH ]

exec
Container 안에서 명령 하나만 실행
attach
Container 안으로 직접 들어가서 상호작용 가능

[ 구독 중인 Container에서 명령어 실행 ]

  • Container start 후 접속 가능
  • exec = 실행 중인 Container 내부에서 명령 실행
    • 단일 명령 실행에 최적화되어 있어 Container를 잠깐 점검하거나 자동화 스크립트에서 쓰기 유
  • uname : Linux 커널, 시스템 정보 출력
  • -a : all 옵션
# docker container exec [Container명] [명령어] [옵션]

Container에 접속하지 않고 명령어만 실행해 결과를 출력했다. (-it 옵션 X)

uname -a 명령이 Container myweb 안에서 실행된 것

bash 쉘로 들어가지 않고 그냥 실행만 하는 방식이다.

# docker container exec myweb uname -a

[ 구독 중인 Container에서 프로세스 및 리소스 확인 ]

Docker Container 내부의 프로세스와 리소스(CPU, 메모리 등) 사용 현황 출력

  • Container 실행 중인 프로세스 확인
    • top : Container 내부에서 실행 중인 모든 프로세스 목록 출력
      • ps와 유사한 출력 형식
# docker container top [Container명]

# docker container top myweb

  • Container 리소스 모니터링 (실시간)
# docker container stats [Container명]

# docker container stats myweb

중지 : Ctrl_C or Ctrl+Z


HTOP

[ HTOP ]

  • Linux 실시간 시스템 모니터링 도구

[ HTOP 설치 및 실행 ]

# dnf -y install htop
htop 설치
# htop
htop 실행

CONTAINER

[ CONTAINER 포트 확인 ]

  • Host → Container로 연결된 포트 정보 확인
# docker container port [Container명]

기존 myweb 포트가 출력되지 않아서 찾아보니 포트 바인딩이 설정되지 않은 상태로 실행했기 때문에 출력되지 않는다고 한다. -p 옵션 없이 실행한 Container는 Host와 포트 매핑을 하지 않았기 때문에 아무것도 출력되지 않는다.

포트를 추가하려고 하니 -p 옵션은 Container 생성 시에만 적용할 수 있었다. 한 번 만들어진 Container에는 Host-Container 포트 바인딩을 동적으로 추가하거나 수정할 수 없어서 Container 삭제 후 재생성을 해줬다.

정상적으로 출력됐다.

80/tcp - Container 내부의 80번 포트 (기본 Web 포트)

0.0.0.0:8080 - Host의 IPv4 전체 IP에서 8080 포트로 접속 가능

[::]:8080 - Host의 IPv6 전체 IP에서 8080 포트로 접속 가능

# docker container port myweb

[ CONTAINER 이름 변경 ]

  • 실행 중인 Container도 이름 변경 가능
# docker container rename [기존이름] [변경할이름]

# docker container rename myweb myweb

# docker ps --format "{{.Author}}" myweb

 

[ 구독 중인 CONTAINER 로그 확인 ]

# docker container logs [Container명]
# docker container logs -f [Container명]
-f : 실시간 출력

# docker container logs myweb


CONTAINER 내부에서 WEB 서비스와 파일 동기화

[ HOST와 CONTAINER 간 파일 복사 ]

Docker Container와 Host 간 파일 복사를 통해

Web 페이지 콘텐츠를 직접 수정하고 브라우저에서 결과를 확인

  • HTML 파일 작성

출력할 index 문구를 작성해 준다.

# vi /index.html

  • Container 안으로 HTML 파일 복사 (Host → Container)
# docker container cp [Host파일] [Container명]:[Container경로]

index 파일을 Container dmweb의 nginx 웹 루트 디렉터리에 복사해 준다.

nginx의 기본 경로 /usr/share/nginx/html은 웹 서버의 홈 디렉터리가 된다.

 

# docker container cp index.html myweb:/usr/share/nginx/html

  • Container 안으로 HTML 파일 복사 (Container → Host)
# docker container cp [Container명]:[Container경로] [Host경로]

반대로 Container에서 Host 복사도 가능하다. Container 안의 HTML 파일을 /tmp로 복사해와서 확인해 봤다.

# docker container cp myweb:/usr/share/nginx/html/index.html /tmp

  • Container 포트 확인

포트를 확인해 보니 Host의 8080 포트를 통해 웹 서버(Container 80번 포트)에 접근이 가능하다.

# docker container port myweb

  • 웹 브라우저에서 접속

Nginx는 index.html을 자동으로 읽는 구조로 restart 없이도 바로 적용되어 반영됨

8080 포트로 웹 접속을 해보니 정상적으로 index.html이 적용되어 웹 페이지가 브라우저에 출력된 것을 확인했다.

http://192.168.10.100:8080

[ CONTAINER 안의 파일 / 디렉터리 확인 ]

Docker Container 내부의 파일 존재 여부와 내용 확인

docker exec는 Container 안에서 명령을 한 번 실행하고 결과만 출력할 때 유용

  • ls -l : 파일 존재 확인
# docker container exec [Container명] ls -l [파일경로]

Container dmweb 안에 /usr/share/nginx/html/index.html 파일이 있는지 확인했다.

# docker container exec myweb ls -l /usr/share/nginx/html/index.html

  • cat : 파일 내용 출력
# docker container exec [Container명] ls -l [파일경로]

Container 안에 있는 파일의 실제 내용을 출력했다.

# docker container exec myweb cat /usr/share/nginx/html/index.html


RESOURCE 제한

[ 메모리 및 SWAP 용량 제한 ]

< SWAP >

물리 메모리(RAM)가 부족할 때 임시로 사용하는 하드디스크 공간

  • 최대 메모리 용량 설정
# docker container run -d -m [메모리용량] [Image]

Container가 사용할 수 있는 최대 메모리를 512MB로 제한해봤다.

# docker container run -d -m 512m nginx

  • 최대 메모리 용량 + SWAP 메모리 용량 설정
    • --memory-swap : 메모리 + SWAP의 총합
# docker container run -d -m [메모리용량] --memory-swap [SWAP포함총용량] [Image]

메모리 + SWQP의 총합을 512MB로 설정해서 SWAP은 허용하지 않았다.

# docker container run -d -m 512m --memory-swap 512m nginx

  • 메모리 초과 시 강제 종료 방지
    • --oom-kill-disable : OOM(Out-Of-Memory) 시 프로세스 강제 종료를 막음

# docker container run -d -m 512m --memory-swap 512m --oom-kill-disable nginx

[ CPU RESOURCE 제한 ]

  • Docker에서 CPU 리소스를 제한
# docker container run -d [CPU옵션] [Image]

0.5개의 CPU 사용 가능

# docker container run -d --cpus='.5' nginx

다른 Container에 비해 2배의 CPU 자원 할당

# docker container run -d --cpu-shares 2048 ubuntu

다른 Container에 비해 0.5배의 CPU 자원 할당

# docker container run -d --cpu-shares 512 ubuntu

CPU 중 0번부터 1번 CPU 할당

# docker container run -d --cpuset-cpus 0-1 ubuntu

[ BLOCK I/O RESOURCE 제한 ]

Docker Container에서 Block I/O (디스크 입출력) 사용을 제한

디스크 자원을 과도하게 사용하는 Container를 제어할 수 있어 성능 관리나 자원 보호에 유용

  • Block I/O 우선순위 제한
    • 값 범위 : 10~1000
    • 기본값 : 500
    • 다른 작업에 디스크 I/O가 중요할 때, 특정 Container가 디스크를 너무 많이 쓰지 않도록 제한
# docker container run -it --blkio-weight [값] [Image] [명령어]

Block I/O를 1/5로 설정해 줬다.

# docker container run -it --blkio-weight 100 ubuntu /bin/bash

  • 디바이스 쓰기 속도 제한 (초당 Byte 제한)
    • 디스크 대역폭이 중요한 서버에서, 특정 Container가 I/O 과도하기 발생하지 않도록 제한
# docker container run -it --device-write-bps [디바이스]:[속도] [Image]

/dev/sda에 대해 초당 1MB 까지 쓰기 가능하게 제한해 줬다.

# docker container run -it --device-write-bps /dev/sda:1mb ubuntu

  • 디바이스 쓰기 IOPS 제한 (초당 쓰기 횟수)
# docker container run -it --device-write-iops [디바이스]:[횟수] [Image]

초당 최대 10번 쓰기 작업이 가능하도록 제한해 줬다.

# docker container run -it --device-write-iops /dev/sda:10 ubuntu /bin/bash

[ Container 상세 정보 출력으로 확인 ]

# docker container inspect [Container]

STRESS

[ STRESS ]

  • CPU, 메모리 등을 강제로 사용하게 만들어 시스템을 부하(stress) 상태로 만드는 도구
  • 시스템 테스트 / 부하 테스트 / 리소스 제한 실험 등을 위해 사용됨
    • Resource 제한이 잘 적용되는지 Test

[ HOST 시스템에서 CPU, 메모리 확인 ]

Host Resource 확인 및 Dockerfile을 이용한 사용자 정의 Image(stress 포함) Build

lscpu
CPU 정보 출력 (코어 수, 아키텍처 등)
lsmem
메모리 구성 확인
free
사용 가능한 메모리 및 SWAP 정보 확인
docker events -f container=[Container명]
해당 Container의 실시간 이벤트 감지 (중요 로그 추적 가능)

  • Dokerfile을 이용한 이미지 생성
from [베이스 Image]
RUN [Image 내부에서 실행할 명령어]
CMD [실행할 명령어]
EOF

stress 테스트용 Container를 만들기 위해, stress 패키지를 설치한 사용자 정의 Image를 직접 Build한다.

- Base Image = Debian

- Container에 stess 도구 설치

- Container 실행 시 기본으로 실행할 명령 : stress -c2 (CPU 2개 사용하여 부하 발생)

# mkdir build

# vi /build/DocKerfile

  • Image Build
    • . : 현재 디렉터리에 있는 Dockerfile을 사용
# docker image build -t [Image명] .

이미지를 Build 해준다.

# docker image build -t stess .

  • Image 실행
# docker container run [옵션] [Image명]

직접 만든 Dockerfile을 기반으로 커스텀 Docker Image(stress)를 성공적으로 build 한 것을 확인했다.

# docker image ls -a

[ 메모리를 100M 제한, stress를 이용해서 80M 프로세스 1개를 5초 동안 실행 ]

  • --rm : 실행이 끝나면 Container를 자동 삭제
  • -m : 메모리 한도
  • --memory-swap : 메모리 + SWAP을 합친 총량
  • time : 실행 시간 측정
# time docker container run --rm -m [메모리용량] --memory-swap [SWAP포함총메모리] [Image명] [명령어]

메모리를 100MB로 제한해서 Container 실행, stress 도구로 메모리를 90MB로 할당 (SWAP 사용 없이), 5초 동안 TEST를 해봤다.

100MB 제한 내에서 90MB만 요청했기 때문에 정상적으로 프로세스가 동작했다.

# time docker container run --rm -m 100m --memory-swap 100m stress stress --vm 1 --vm-bytes 90m -t 5s

100MB 제한에서 150MB를 할당하려고 시도해 봤다. SWAP도 100MB까지 제한했기 때문에 초과 사용이 불가한 상태이므로 메모리 부족으로 실패했다. 커널이 OOM 상황이라 프로세스가 강제 종료됐고, 실행되자마자 메모리 초과로 강제 종료되어 실행 시간도 매우 짧게 나왔다.

150MB를 쓰려 했지만 한도 초과로 실패한 상황이다.

# time docker container run --rm -m 100m --memory-swap 100m stress stress --vm 1 --vm-bytes 150m -t 5s


CPU 부하 TEST

[ CPU 부하 TEST ]

  • 시스템(서버, 프로그램, 네트워크 등)에 의도적으로 무거운 작업을 걸어서 어디까지 잘 견디는지, 언제 느려지는지, 언제 터지는지를 확인하는 TEST
  • stress --cpu 1 : 100%에 가까운 CPU 사용률을 만들기 때문에 부하 TEST에 적

Container가 CPU를 1번만 사용하도록 제한하고, 이름을 cpu2로 설정해서 실행시켰다. Image는 stress를 사용하고 stress 명령어를 통해 CPU 작업을 1개 생성해서 계속 부하를 주도록 설정했다.

# docker container run -d --cpuset-cpus 1 --name cpu2 stress stress --cpu 1

htop에 접속해서 stress --cpu 1이 거의 CPU 100%를 사용하고 있다는 것을 확인했다. (CPU 1번에서 부하가 집중된 상태)

# htop

Container cpu2를 강제로 종료 및 삭제시켜 htop에서 stress 프로세스가 사라진 것을 확인했다.

# docker container rm -f cpu2

 

 

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

Docker file  (0) 2025.05.11
Docker Network  (0) 2025.05.11
Docker DB  (2) 2025.05.09
Docker volume/bind mount  (0) 2025.05.07
Docker  (0) 2025.05.06