2026. 6. 12. 17:07ㆍDocker
Ⅰ. 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 디렉터리 내용이 잘 복사되었는지 확인
'Docker' 카테고리의 다른 글
| Docker 컨테이너 운용 (0) | 2026.06.12 |
|---|---|
| Docker 컨테이너 네트워크 관리 & Docker 네트워크 관리 (0) | 2026.06.12 |
| Docker 이미지 관리 & Docker 이미지 업로드 (0) | 2026.06.12 |
| Docker의 기본 동작 확인 (0) | 2026.06.12 |
| Docker 실습 환경 구성 & Docker 설치 (0) | 2026.06.12 |