Docker 컨테이너 관리 & Docker 볼륨 관리

2026. 6. 12. 17:07Docker


Ⅰ. Docker 컨테이너 관리  & Docker 볼륨 관리

 

● Docker 컨테이너 관리

Docker 

컨테이너 관리


구분 설명 비고
개념 컨테이너는 Docker 이미지로부터 생성된 실행 단위 인스턴스 이미지 = 설계도
독립된 프로세스로 동작 컨테이너 = 실행된 프로그램
특징 경량화 (호스트 커널 공유) 가상머신보다 자원 효율적
빠른 시작과 중지 가능
불변 이미지로부터 재생성 용이
생명주기 

(Lifecycle)
Create -> Start -> Running -> Stop -> Removed docker run = create + start
격리 환경 프로세스, 네트워크. 파일시스템, 사용자 공간이 분리되어 있음

(namespace, cgroup 기반)
리눅스 컨테이너 기술 이용
데이터 관리 기본적으로 컨테이너 내 파일은 임시 저장 

(삭제 시 데이터 유실)
영속화 위해 볼륨 필요
상태 관리 실행 중, 일시 정지 (paused), 정지 (exited),

생성 (created), 삭제 (removed) 등의 상태 존제
docker ps -a로 확인
리소스 관리 컨테이너별 CPU, 메모리, I/O 제한 설정 가능 --memory, --cpus 옵션
로그 관리 컨테이너별 표준 출력 오류를 Docker 로그 엔진이 수집 JSON-file, syslog 등
네트워크 통신 기본 bridge 네트워크를 통해 통신하며,

여러 네트워크에 연결 가능
내부 DNS 지원
관리 목적 컨테이너를 안정적, 일관적으로 실행하고

배포 및 운영 효율 높임
DevOps 핵심 구성 요소
컨테이너 관리는 실행 단위의 생명주기와 리소스, 데이터, 통신을 제어하는 과정
애플리케이션 실행 환경을 격리하면서도 경량으로 유지하는 것이 핵심

 

● Docker 볼륨 관리 개념

Docker 

볼륨 관리
구분 설명 비고
개념 볼륨 (Volume)은 Docker가 관리하는

영속적 데이터 저장소
/var/lib/docker/volumes/에 저장
컨테이너 삭제 후에도 데이터 유지
필요성  컨테이너 파일시스템은 휘발성 -> 컨테이너 재생성 시

데이터 보존을 위해 볼륨 필요
데이터베이스 
로그
유형 유형 설명 -v로 지정
볼륨 (Volume) Docker 엔진이 관리
바인드 마운트

(Bind Mount)
호스트 디렉터리 직접 연결 --mount로 지정
tmpfs 메모리 기반 임시 저장소
특징 컨테이너 간 데이터 공유 가능 : ro 옵션
Docker에서 자동 백업 및 정리 가능
읽기 전용 / 쓰기 모드 선택 가능 : rw 옵션
관리 범위 Docker 엔진이 파일 경로와 마운트 정보를 추적 수동 삭제 시 주의 필요
데이터 흐름 컨테이너 내부 경로 (/app/data) -> 호스트 볼륨

(volume_name 또는 /path)
영속적 동기화
장점 데이터 유실 방지 백업 및 복구 쉬움
애플리케이션 상태 유지
호스트 간 마이그레이션 용이
단점 잘못된 권한 설정 시 접근 문제 CI / CD 환경 주의
바인드 마운트 또는 호스트 종속성 높음
활용 사례 DB 저장소 (mysql:/var/lib/mysql) 컨테이너 재시작 시 데이터 유지
로그 보존 (/var/log:/logs)
앱 설정파일 (/config)
보안 관리 접근 권한 및 읽기전용 모드 설정 가능 (:ro) 민감 데이터 보호용
컨테이너의 비영속적 특성을 보완하는 핵심 기능
데이터를 외부화 (Externalize)하여 컨테이너와 독립적으로 보존 및 공유 가능

 

● Docker 컨테이너 관리 vs Docker 볼륨 관리

항목 Docker 컨테이너 관리 Docker 볼륨 관리
관리 대상 실행 단위 (컨테이너 프로세스) 데이터 저장 영역
중심 목적 컨테이너의 실행, 상태, 리소스 제어 데이터의 영속성 및 공유
특징 요약 빠른 배포 데이터 유지
일관된 실행 환경 호스트 - 컨테이너 분리
관점 차이 실행 환경 관리 중심 스토리지 관리 중심
주요 활용 서비스 운영 DB
로그
배포 자동차 설정파일 관리
요약 컨테이너는 실행을 관리함 볼륨은 데이터를 관리함

 

 

tree -L 3 /var/lib/docker/volumes/ 명령을 통해 /var/lib/docker/volumes/ 디렉터리를 트리 구조로 세 줄만 출력

 

 

# testvol 볼륨 생성

 

docker volume create testvol 명령을 통해 /var/lib/docker/volumes 디렉터리에 Docker 관리 볼륨 testvol 생성

 

docker volume ls 명령을 통해 볼륨이 잘 생성되었는지 확인

 

tree -L 3 /var/lib/docker/volumes/ 명령을 통해 /var/lib/docker/volumes/ 디렉터리를 트리 구조로 세 줄만 출력

 

 

docker volume ls 명령을 통해 볼륨 목록 확인

 

docker volume inspect testvol 명령을 통해 testvol의 상세 정보 확인

 

 

# mynginx 컨테이너 생성 및 실행

 

docker container run --name mynginx nginx 명령을 통해 Nginx 이미지 사용하여 mynginx 컨테이너 생성 및 실행

 

-d 옵션을 통해 mynginx 컨테이너를 백그라운드로 구동

 

-v testvol:/usr/share/nginx/html 옵션을 통해 testvol 볼륨을 /usr/share/nginx/html 디렉터리에 mount

 

-p 8080:80 옵션을 통해 호스트의 8080번 포트와 컨테이너의 80번 포트 매핑

 

docker container ls -a 명령을 통해 컨테이너가 잘 생성되었는지 확인

 

 

# mynginx 컨테이너 내부 동작

 

docker container exec mynginx ls /usr/share/nginx/html 명령을 통해 mynginx 컨테이너 내부로 진입

 

ls /usr/share/nginx/html 명령을 통해 /usr/share/nginx/html 디렉터리 내 파일 목록 확인

 

 

웹 페이지에 192.168.2.10:8080 입력하여 컨테이너 내 HTML 파일이 정상적으로 서비스되는지 확인

 

 

rm -rf /var/lib/docker/volumes/testvol/_data/50x.html 명령을 통해 testvol 볼륨 내부의 50x.html 파일 삭제

 

tree -L 3 /var/lib/docer/volumes/ 명령을 통해 50x.html 파일이 잘 삭제되었는지 확인

 

 

# mynginx 컨테이너 내부 동작

 

docker container exec mynginx ls /usr/share/nginx/html 명령을 통해

 

mynginx 컨테이너 내부에서도 50x.html 파일이 동일하게 삭제되었는지 확인

 

 

# mynginx 컨테이너 내부 동작

 

docker container exec mynginx 명령을 통해 mynginx 컨테이너 내부로 진입

 

touch /usr/share/nginx/html/test.html 명령을 통해 /usr/share/nginx/html 디렉터리 내에 test.html 파일 생성

 

 

# mynginx 컨테이너 내부 동작

 

docker container exec mynginx 명령을 통해 mynginx 컨테이너 내부로 진입

 

ls /usr/share/nginx/html 명령을 통해 test.html 파일이 잘 생성되었는지 확인

 

 

echo "<h1>Test Web Page<h1>" > /var/lib/docker/volumes/testvol/_data/index.html 명령을 통해 

 

Test Web Page라는 문구를 /var/lib/docker/volumes/testvol/_data/index.html 파일에 저장

 

cat /var/lib/docker/volumes/testvol/_data/index.html 명령을 통해 파일 내에 잘 저장되었는지 확인

 

웹 페이지에 192.168.2.10:8080 입력하여 출력 결과 확인

 

 

 

echo "<h1>Test Web Page<h1>" > /var/lib/docker/volumes/testvol/_data/index.html 명령을 통해 

 

Test Web Page라는 문구를 /var/lib/docker/volumes/testvol/_data/index.html 파일에 저장

 

cat /var/lib/docker/volumes/testvol/_data/index.html 명령을 통해 파일 내에 잘 저장되었는지 확인

 

 

# mynginx 컨테이너 내부 동작

 

docker container exec mynginx /bin/bash 명령을 통해 mynginx 컨테이너 내 bash 쉘로 진입

 

-it 옵션을 통해 mynginx 컨테이너 내 bash 쉘에 대화형 모드 가상 터미널 할당

 

cd /usr/share/nginx/html 명령을 통해 홈 디렉터리에서 /usr/share/nginx/html 디렉터리로 이동

 

ls 명령을 통해 디렉터리 내 파일 목록 확인

 

echo "<h1>Nginx Web Server<h1>" > index.html 명령을 통해

 

Nginx Web Server라는 문구를 index.html 파일에 저장

 

exit 명령을 통해 mynginx 컨테이너 내 bash 쉘에서 나옴

 

docker container ls -a 명령을 통해 컨테이너 목록 확인

 

 cat /var/lib/docker/volumes/testvol/_data/index.html 명령을 통해 파일 내에 문구가 잘 저장되었는지 확인

 

웹 페이지에 192.168.2.10:8080 입력하여 출력 결과 확인

 

 

ls docker 명령을 통해 docker 디렉터리 내에 디렉터리 및 파일 목록 확인

 

cp docker/index.html /var/lib/docker/volumes/testvol/_data 명령을 통해

 

/var/lib/docker/volumes/testvol/_data/index.html에 새로운 인덱스 docker/index.html 내용 복사

 

 

변경된 결과 확인

 

 

# mynginx 컨테이너 삭제

 

docker container rm -f mynginx 명령을 통해 컨테이너 삭제

 

docker container ls -a 명령을 통해 컨테이너가 잘 삭제되었는지 확인

 

 

# mynginx 컨테이너 생성 및 실행

 

docker container run --name mynginx nginx 명령을 통해 Nginx 이미지 사용하여 mynginx 컨테이너 생성 및 실행

 

-d 옵션을 통해 mynginx 컨테이너를 백그라운드로 구동

 

-v testvol:/usr/shaer/nginx/html 옵션을 통해 testvol 볼륨을 /usr/share/nginx/html 디렉터리에 mount

 

-p 8080:80 옵션을 통해 호스트의 8080번 포트와 컨테이너의 80번 포트 매핑

 

 

# mynginx 컨테이너 내부 실행

 

docker container exec mynginx 명령을 통해 mynginx 컨테이너 내부로 진입

 

ls /usr/share/nginx/html 명령을 통해 /usr/share/nginx/html 디렉터리 내 파일 목록 확인

 

 

# mynginx1 컨테이너 생성 및 실행

 

docker container run --name mynginx1 nginx 명령을 통해

 

Nginx 이미지 사용하여 mynginx1 컨테이너 생성 및 실행

 

-d 옵션을 통해 mynginx1 컨테이너를 백그라운드로 구동

 

-v testvol:/usr/share/nginx/html 옵션을 통해 testvol 볼륨을 /usr/share/nginx/html 디렉터리에 mount

 

-p 8081:80 옵션을 통해 호스트의 8081번 포트와 컨테이너의 80번 포트 매핑

 

 

# mynginx2 컨테이너 생성 및 실행

 

docker container run --name mynginx2 nginx 명령을 통해 

 

Nginx 이미지 사용하여 mynginx2 컨테이너 생성 및 실행

 

-d 옵션을 통해 mynginx2 컨테이너를 백그라운드로 구동

 

-v testvol:/usr/share/nginx/html 옵션을 통해 testvol 볼륨을 /usr/share/nginx/html 디렉터리에 mount

 

-p 8082:80 옵션을 통해 호스트의 8082번 포트와 컨테이너의 80번 포트 매핑

 

docker container ls -a 명령을 통해 컨테이너가 잘 생성되었는지 확인

 

 

# mynginx, mynginx1, mynginx2 컨테이너 삭제

 

docker container rm -f mynginx mynginx1 mynginx2 명령을 통해 mynginx, mynginx1, mynginx2 컨테이너 삭제

 

docker container ls -a 명령을 통해 컨테이너가 잘 삭제되었는지 확인

 

 

# testvol 볼륨 삭제

 

docker volume rm testvol 명령을 통해 testvol 볼륨 삭제

 

 

docker 2에서 yum -y install mysql 명령을 통해 MYSQL 클라이언트 및 관련 라이브러리 설치

 

 

# mysqlvol 볼륨 생성

 

docker volume create mysqlvol 명령을 통해 mysqlvol 볼륨 생성

 

docker volume ls 명령을 통해 볼륨이 잘 생성되었는지 확인

 

tree -L 3 /var/lib/docker/volumes/mysqlvol/_data/ 명령을 통해

 

 /var/lib/docker/volumes/mysqlvol/_data/ 디렉터리를 트리 구조로 3줄만 출력

 

tree -L 3 /var/lib/docker/volumes 명령을 통해 /var/lib/docker/volumes 디렉터리를 트리 구조로 3줄만 출력

 

 

# mydb 컨테이너 생성 및 실행

 

docker container run --name mydb mysql:5.7 옵션을 통해

 

Mysql:5.7 이미지 사용하여 mydb 컨테이너 생성 및 실행

 

-d 옵션을 통해 mydb 컨테이너를 백그라운드로 구동

 

-v mysql:/var/lib/mysql 옵션을 통해 mysql 볼륨을 /var/lib/mysql 디렉터리에 mount

 

-p 3306:3306 옵션을 통해 호스트의 3306번 포트와 컨테이너의 3306번 포트 (MySQL 포트) 매핑

 

-e MYSQL_ROOT_PASSWORD=password 옵션을 통해 MySQL root 비밀번호 설정

 

docker container ls -a 명령을 통해 컨테이너가 잘 생성되었는지 확인

 

tree -L 3 /var/lib/docker/volumes/ 명령을 통해 /var/lib/docker/volumes 디렉터리 내용을 트리 구조로 3줄만 출력

 

 

docker 2에서 mysql -h 192.168.2.10 -u root -p 명령을 통해 docker 2에서 docker 1의 MySQL 컨테이너에 접속

 

password 입력 시 MySQL 콘솔 접속 성공

 

 

show databases; 명령을 통해 기본 데이터베이스 목록 확인

 

 

# testdb 데이터베이스 생성

 

create database testdb; 명령을 통해 새로운 데이터베이스 testdb 생성

 

show databases; 명령을 통해 testdb가 잘 생성되었는지 확인

 

 

create table docker (id int, login varchar(10), password varchar(10)); 명령을 통해 testdb에 정수형 ID와

 

문자형(10글자) Login, 문자형(10글자) Password를 갖는 docker 테이블 생성

 

show tables; 명령을 통해 docker 테이블이 잘 생성되었는지 확인

 

 

insert into docker values(1, 'docker1', 'docker1111') 명령을 통해 데이터 삽입

 

insert into docker values(2, 'docker2', 'docker2222') 명령을 통해 데이터 삽입

 

insert into docker values(3, 'docker3', ;docker3333') 명령을 통해 데이터 삽입

 

select * from docker; 명령을 통해 docker 테이블의 전체 데이터를 조회하여 데이터가 잘 삽입되었는지 확인

 

 

docker container ls -a 명령을 통해 컨테이너 목록 확인

 

 

# mydb 컨테이너 삭제 

 

docker container rm -f mydb 명령을 통해 mydb 컨테이너 삭제

 

docker container ls -a 명령을 통해 mydb 컨테이너 삭제했지만 여전히 데이터 남아있음

 

tree -L 4 /var/lib/docker/volumes 명령을 통해 /var/lib/docker/volumes 디렉터리 내 목록을 트리 구조로 4줄 출력

 

 

docker 2에서 docker 1로 mysql을 통해 접속

 

show databases; 명령을 통해 데이터베이스 테이블에 저장되어 있는 데이터 확인

 

select * from testdb.docker; 명령을 통해 docker 테이블에 저장되어 있는 데이터 확인

 

=> 데이터베이스 테이블에 저장된 데이터 = docker 테이블에 저장된 데이터 

 

 

# mydb 컨테이너 삭제

 

docker container rm -f mydb 명령을 통해 mydb 컨테이너 삭제

 

 

# mysqlvol 볼륨 삭제

 

docker volume rm mysqlvol 명령을 통해 mysqlvol 볼륨 삭제

 

 

# myweb 컨테이너 생성 및 실행

 

docker container run --name myweb httpd 명령을 통해 HTTPD 이미지 사용하여 myweb 컨테이너 생성 및 실행

 

-d 옵션을 통해 myweb 컨테이너를 백그라운드로 구동

 

-v wwwvol:/usr/local/apache2/htdocs 옵션을 통해 wwwvol 볼륨을 /usr/local/apache2/htdocs 디렉터리에 mount

 

-p 80:80 옵션을 통해 호스트의  80번 포트와 컨테이너의 80번 포트 매핑

 

docker volume ls 명령을 통해 볼륨이 잘 생성되었는지 확인

 

docker container ls -a 명령을 통해 컨테이너가 잘 생성되었는지 확인

 

tree -L 3 /var/lib/docker/volumes/ 명령을 통해 /var/lib/docker/volumes 디렉터리 내 목록을 트리 구조로 3줄 출력

 

 

웹사이트 접속을 통해 결과 확인

 

 

docker container inspect myweb 명령을 통해 myweb 컨테이너의 상세 정보 확인

 

 

cp docker/index.html /var/lib/docker/volumes/wwwvol/_data 명령을 통해

 

/var/lib/docker/volumes/wwwvol/_data 내용을 docker/index.html에 복사하여 저장

 

docker container ls -a 명령을 통해 컨테이너가 잘 복제되었는지 확인

 

 

# myweb 컨테이너 삭제

 

docker container rm -f myweb 명령을 통해 myweb 컨테이너 삭제

 

tree -L 3 /var/lib/docker/volumes/ 명령을 통해 /var/lib/docker/volumes 디렉터리 내 내용 트리 구조로 3줄만 출력

 

 

# myweb 컨테이너 생성 및 실행

 

docker container run --name myweb httpd 명령을 통해 HTTPD 이미지 사용하여 myweb 컨테이너 생성 및 실행

 

-d 옵션을 통해 myweb 컨테이너를 백그라운드로 구동

 

-v wwwvol:/usr/local/apache2/htdocs 옵션을 통해 wwwvol 볼륨을 /usr/local/apache2/htdocs 디렉터리에 mount

 

-p 80:80 옵션을 통해 호스트의  80번 포트와 컨테이너의 80번 포트 매핑

 

docker container ls -a 명령을 통해 컨테이너가 잘 생성되었는지 확인

 

 

웹 서버에 접속하여 결과 확인

 

 

# myweb 컨테이너 생성 및 실행

 

docker container run --name myweb nginx 명령을 통해 Nginx 이미지 사용하여 myweb 컨테이너 생성 및 실행

 

-d 옵션을 통해 myweb 컨테이너를 백그라운드로 구동

 

-v /www:/usr/share/nginx/html 옵션을 통해 /www 디렉터리와 /usr/share/nginx/html 디렉터리 볼륨 mount

 

-p 8080:80 옵션을 통해 호스트의 8080번 포트와 컨테이너의 80번 포트 매핑

 

ls /www 명령을 통해 www 디렉터리 내 파일 및 디렉터리 목록 확인

 

 

# myweb 컨테이너 내부 동작

 

docker container exec myweb 명령을 통해 myweb 컨테이너 내부로 진입

 

ls /usr/share/nginx/html 명령을 통해 /usr/share/nginx/html 디렉터리 내 파일 목록 확인

 

cp docker/index.html /www 명령을 통해 docker/index.html에 /www 디렉터리 내용 복사하여 저장

 

ls /www 명령을 통해 www 디렉터리 내 파일 및 디렉터리 목록 확인

 

 

# myweb 컨테이너 내부 동작

 

docker container exec myweb 명령을 통해 myweb 컨테이너 내부 진입

 

ls /usr/share/nginx/html 명령을 통해 /usr/share/nginx/html 디렉터리 내에

 

/www 디렉터리 내용이 잘 복사되었는지 확인