터칭 데이터

Docker & K8S - Docker Volume nginx 데모(실습) 본문

Docker & K8S

Docker & K8S - Docker Volume nginx 데모(실습)

터칭 데이터 2023. 12. 20. 13:26

 

데모: 앞서 nginx 두 가지 실행 예 살펴보기

첫 번째는 하나는 볼륨없이 내용이 사라지는 경우를

두 번째는 볼륨을 지정하고 실행하며 내용이 사라지지 않는 경우를

 

이렇게 두 상황을 살펴보았습니다.

 

이 상황들에 대한 데모를 진행해보겠습니다.

 

거기에 더해

 

세번째는 Airflow의 docker-compose.yml에서 volumes 내용만 살펴보기도 했는데요.

데모의 끝 부분에서 airflow의 docker-compose.yml 파일도 잠깐 살펴볼 예정입니다.

 

 

 

 

 

 

 

 

첫 번째 실습 볼륨없이 내용이 사라지는 경우

 

Nginx 공식 이미지 다운

 

일단 docker에서 nginx 공식 Image를 다운받겠습니다.

 

 

docker run -d --name=nginx -p 8081:80 nginx

PS C:\Users\User> docker run -d --name=nginx -p 8081:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
abcdef123456: Pull complete
abcdef123456: Pull complete
abcdef123456: Pull complete
abcdef123456: Pull complete
abcdef123456: Pull complete
abcdef123456: Pull complete
abcdef123456: Pull complete
Digest: abcde12345abcde12345abcde12345abcde12345abcde12345abcde12345
Status: Downloaded newer image for nginx:latest
abcde12345abcde12345abcde12345abcde12345abcde12345abcde12345abcd

 

 

 

 

 

 

 

 

 

브라우저에서 8081:80 호스트 접속해보기

 

 

 

정상적으로 접속됩니다.

 

Welcome to nginx!를 편집해보겠습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

html 편집하기

 

docker exec -it --user=root nginx sh

PS C:\Users\User> docker exec -it --user=root nginx sh
#

 

편집을 위해 다시 터미널로 돌아가 root 유저로 nginx에 로그인했습니다.

 

 

 

 

 

 

편집을 위한 툴 설치하기

# apt update
(생략..)
# apt install nano
(생략..)

 

 

 

 

 

 

 

 

 

nano /usr/share/nginx/html/index.html

# nano /usr/share/nginx/html/index.html

<!DOCTYPE html>
<html>
<head>
<title>Welcome to Docker Volume</title> # 이곳을 편집
<style>
(생략..)

 

title 태그를 편집합니다.

 

 

 

 

 

 

 

 

 

편집된 내용이 삭제 재설치 후에도 보관되는 확인하기

 

exit으로 nginx 로그아웃한 뒤 container 중지, 삭제, 재설치(실행)

# exit
PS C:\Users\User> docker stop nginx
nginx
PS C:\Users\User> docker rm nginx
nginx
PS C:\Users\User> docker run -d --name=nginx -p 8081:80 nginx
abcde12345~~

 

 

 

 

nginx에 다시 로그인하여 index.html 확인하기

PS C:\Users\User> docker exec -it --user=root nginx sh
# cat /usr/share/nginx/html/index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
(생략..)

 

다시 title 태그가 welcome to nginx!로 돌아갔습니다.

 

Volume을 사용하지 않았으므로 당연히 Data Persistence가 지켜지지 않습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

두 번째 실습 볼륨을 지정하고 실행하며 내용이 사라지지 않는 경우

 

 

 

맵핑을 해줄 호스트 파일시스템 준비하기

 

index.html

<h1>Hello from Docker Volume!!</h1>

 

 

test.html

<h1> Testing... </h1>

 

 

 

위의 간단한 두 html 파일들을 마운트할 때 사용하고 싶은 경로에 배치합니다.

 

 

 

 

저는 D드라이브의 Dev_KDT의 nginx라는 디렉토리에 배치했습니다.

 

 

 

 

 

 

맵핑 해주기

 

이제 D:\Dev_KDT\nginx와 Docker Container의 /usr/share/nginx/html를 맵핑해주면 됩니다.

 

윈도우 터미널에서 pwd 조회되는 D:\Dev_KDT\nginx라는 경로는 /d/Dev_KDT/nginx와 같이 바꿔 적어주시는 것을 권장합니다.

 

 

 

docker run -p 8081:80 --name nginx -v /d/Dev_KDT/nginx:/usr/share/nginx/html nginx

PS D:\Dev_KDT\nginx> docker run -p 8081:80 --name nginx -v /d/Dev_KDT/nginx:/usr/share/nginx/html nginx

docker: Error response from daemon: Conflict. The container name "/nginx" is already in use by container "~~".
You have to remove (or rename) that container to be able to reuse that name.

 

그런데 이미 nginx와 같은 이름을 같고 실행 중인 컨테이너가 있으므로

 

 

 

 

PS D:\Dev_KDT\nginx> docker stop nginx
nginx
PS D:\Dev_KDT\nginx> docker rm nginx
nginx

 

nginx 컨테이너를 stop하고 삭제합니다.

 

 

 

 

 

 

docker run -p 8081:80 --name nginx -v /d/Dev_KDT/nginx:/usr/share/nginx/html nginx

PS D:\Dev_KDT\nginx> docker run -p 8081:80 --name nginx -v /d/Dev_KDT/nginx:/usr/share/nginx/html nginx
(생략..)

 

그리고 명령을 다시 시작합니다. 만일 저처럼 -d 옵션을 붙이지 않아 foreground로 실행하셨다면 터미널 하나를 더 열어서 실습을 진행해주세요.

 

 

 

 

 

 

 

 

 

 

 

결과 확인해보기

 

 

-d 옵션을 주지 않았다면 터미널을 하나 더 열어서 호스트 파일 시스템으로서 맵핑해준 곳에 갑니다.

 

PS D:\Dev_KDT\nginx> dir


    디렉터리: D:\Dev_KDT\nginx


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----  2023-12-20(수)  오후 12:48             35 index.html
-a----  2023-12-20(수)  오후 12:48             21 test.html

 

그리고 조회를 해보면 아까 작성해준 html 파일들이 보입니다.

 

 

 

 

 

브라우저로 localhost:8081로 접속해보면

 

우리가 맵핑해준 곳에 있던 index.html에 내용대로 출력될 것입니다. 만약 내용이 위와 같이 안바뀌어 있다면 새로고침을 해주세요.

 

 

 

 

 

test.html을 URL에 추가로 붙이니 test.html 코드대로 출력됩니다.

 

 

 

 

 

한번 test.html을 다음과 같이 수정해봅니다.

 

<h1> Testing... By Jon </h1>

 

그리고 브라우저에서 localhost:8081/test.html을 새로고침하면

 

 

 

 

 

 

 

 

 

Container 파일 시스템이 맵핑되었기 때문에 바뀐 내용이 바로 반영되는 것을 볼 수 있습니다.

 

 

 

 

 

 

 

 

 

 

컨테이너 삭제 이후 html들이 보관되었는지 확인

 

PS D:\Dev_KDT\nginx> docker stop nginx
nginx
PS D:\Dev_KDT\nginx> docker rm nginx
nginx

 

nginx를 중지시키고 삭제합니다.

 

 

docker run -d -p 8081:80 --name nginx -v /d/Dev_KDT/nginx:/usr/share/nginx/html nginx

 

그리고 다시 nginx를 run하는데 이번에는 -d 옵션을 붙여줬습니다.

 

 

 

 

 

 

 

브라우저에서 다시 확인해보겠습니다.

 

아까 Volume을 사용하지 않을 때는 중지, 삭제, 재실행 이후에는 Data Persistence가 지켜지지 않았었죠?

 

 

 

 

다시 브라우저에서 아까와 같은 URL로 접속을 해도 삭제 이전과 내용이 달라지지 않았습니다.

 

Volume을 사용해 Data Persistence가 보장되었기 때문입니다.

 

 

 

호스트 파일 시스템의 index.html를 한번 수정하면

<h1>Hello from Docker Volume!! Data Persistence</h1>

 

 

 

 

여전히 결과가 실시간으로 반영됩니다.