AAROH
아로새기다
AAROH

티스토리

  • 전체 (31)
    • Hyperledger Fabric (0)
    • C (0)
    • C++ (0)
    • Java (0)
    • Go (0)
    • Python (0)
    • Javascript (0)
    • R (0)
    • Spring (0)
    • Spring Boot (0)
    • Docker (22)
    • Kubernetes (1)
    • Linux (2)
    • Operating System (0)
    • MongoDB (0)
    • Application (0)
    • 끄적끄적 (4)
    • 망고연대기 (0)
    • 마이다이어리 (1)
    • 맛집탐방 (0)
    • 운동기록 (0)
    • 소소리뷰 (1)
hELLO · Designed By 정상우.
AAROH

아로새기다

Docker 톺아보기 18탄 - Docker Container Storage (실습편)
Docker

Docker 톺아보기 18탄 - Docker Container Storage (실습편)

2022. 12. 28. 10:30


컨테이너 스토리지에 대한 실습을 해보자

목차다!

1. mysql db data 영구 보존하기

2. 웹 데이터 read only 서비스로 지원하기

3. 컨테이너간 데이터 공유하기

 

 

== 1. mysql db data 영구 보존하기 ==

일단은 실습 환경을 만들어주자

아래 명령으로 mysql 컨테이너를 만들어주고 로컬의 /dbdata에 볼륨마운트를 해준다

$ docker run -d --name db -v /dbdata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=pass mysql:latest

그리고 확인하자

$ docker ps

우린 이제 mysql 컨테이너도 만들었고 로컬의 /dbdata 디렉토리로 볼륨 마운트도 해주었다

그럼 실제로 db에 데이터를 넣었을 때, /dbdata 디렉토리에도 데이터가 저장되는지 확인해야 한다

그럼 한번 컨테이너 안에 직접 들어가서 db에 데이터를 넣어보자

$ docker exec -it db /bin/bash

들어가서 mysql에 로그인 해주자

$ mysql -u root -ppass

db에 접속했다

 

database를 만들어보자

> show databases;
> create database [database 이름]
> show databases;

database가 잘 만들어졌다

그럼 이제 로컬의 /dbdata 디렉토리에도 같은 이름의 database가 생겼을 것이다

exit 명령으로 빠져나와서 확인해보자

> exit
$ exit
$ ls /dbdata

aaroh 라는 database가 잘 만들어진 것을 확인할 수 있다!

 

그럼 컨테이너를 삭제해도 데이터가 남아있는지 확인해보자

$ docker rm -f db
$ docker ps
$ ls /dbdata

컨테이너를 삭제해도 데이터가 그대로 남아있는 것을 볼 수 있다

그리고 컨테이너를 다시 만들어서 실행해도 이 데이터를 그대로 사용하는 것이다

$ docker run -d --name db -v /dbdata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=pass mysql:latest
$ docker exec -it db /bin/bash
$ mysql -u root -ppass

다시 컨테이너를 생성, 실행하고 컨테이너 안으로 들어가서 mysql에 접속하자

#database 확인
show databases;

#database에 table 생성
CREATE TABLE aaroh.test1(
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY(id),
UNIQUE KEY email(email));

#table에 data 생성
INSERT INTO aaroh.test1(name, email)
VALUES('aaroh', 'aaroh@tistory.com');

#data 조회
SELECT * FROM aaroh.test1;

직접 테이블을 만들어서 데이터를 넣어보았다

이 데이터도 그대로 있는지 확인해보자

> exit
$ exit
ls /dbdata/aaroh

table을 생성할때 사용했던 test1이라는 이름으로 ibd 확장자의 파일이 하나 있다

ibd 파일은 mysql의 데이터 복구용 파일 확장자로, mysql의 기본 저장 엔진인 InnoDB를 통해 데이터를 복구할 때 사용한다

일단 잘 저장됐다는 것만 확인하고 넘어가자

 

 

로컬 저장소 경로를 생략하는 커맨드에 대한 설명은 따로 하지 않을 거다

로컬 저장소 경로를 생략하면 자동으로 /var/lib/docker/volumes/UUID/_data 위치에 데이터가 저장된다

그냥 로컬의 저장소 경로만 달라지는 것이기 때문에 결과는 같을 것이다

 

이렇게 볼륨이 자동으로 마운트 되는 경우 볼륨을 조회하고 삭제도 할 수 있다

$ docker volume ls # 볼륨 조회
$ docker volume rm [UUID] # 볼륨 삭제

 

 

== 2. 웹 데이터 read only 서비스로 컨테이너에 지원하기 ==

호스트에서 미리 로컬로 web content(웹 문서)를 만들어 놓고

이 web content를 로컬에서 가져와서 read only 방식으로 사용자에게 서비스를 제공할 수 있는가 하는 것이다

일단은 디렉토리부터 만들어보자

루트로 이동해서 webdata 디렉토리를 만들고, 간단한 웹 문서 하나를 만들자

$ cd /
$ mkdir webdata
$ cd webdata
$ echo "<h1> AAROH TISTORY </h1>" > index.html
$ cat index.html

여기까지 하면 로컬에 웹 문서를 생성하는 단계까지 완료가 된 것이다

 

그럼 이제 이 웹 문서를 사용자에게 전달해줄 웹 서버를 만들어야 한다

nginx를 이용해서 만들어주자

$ docker run -d --name web -p 80:80 -v /webdata:/usr/share/nginx/html:ro nginx:1.14

nginx 1.14버전 이미지로, web이라고 이름짓고, 80포트로 통신하고, /webdata의 웹 문서를 read only로 마운팅하여 데몬으로 실행하겠다는 명령이다

내부와 외부 모두에서 web 웹서버에 접속해보도록 하자

 


*** 만약 외부에서 리눅스 내부와 컨테이너까지의 접속이 안된다면 이렇게 해보도록 하자 ***

먼저 Virtual Box의 파일 - 환경 설정 - 네트워크 로 들어가보자

그럼 현재 우리가 만들어놓은 NAT 네트워크가 하나 있을 거다

이 localNetwork를 더블클릭하면 팝업창이 뜬다

포트포워딩 버튼을 누르면 뜨는 창에

원래는 docker1과 docker2만 있었는데,

리눅스와 리눅스 내부의 컨테이너에 접속할 수 있도록 포트포워딩을 해줘야 한다

우리는 web을 외부 80, 내부 80포트로 통신하기로 하였으니

호스트IP = 127.0.0.1(localhost)

호스트 포트 = 80

게스트 IP = 10.100.0.105(ubuntu IP 주소)

게스트 포트 = 80

으로 설정하고 저장해주자

그리고 켜져있는 우분투 가상머신을 재시동 해주면 된다


 

먼저 터미널창에 curl localhost:80을 입력하자

$ curl localhost:80

내부에서 접속이 잘 되는 것을 확인할 수 있다

 

이번엔 외부에서 웹 브라우저를 실행하고 주소창에 http://localhost:80 을 입력하자

외부에서도 잘 접속이 된다

 

이번에는 index.html 파일을 수정해도 웹 서버에 반영이 되는지 확인해보자

나는 간단하게 대문자를 소문자로 수정하였다

# 아마 guru 계정으로 변경하면 권한 문제로 저장이 안될 것이다
# su - 명령을 통해 root 계정으로 전환하여 진행하도록 하자
vi index.html # html 파일 수정
cat index.html # 수정 내용 확인
curl localhost:80 # 내부에서 컨테이너와의 통신 확인 및 수정 반영여부 확인

이번엔 외부에서도 확인해보자

잘 반영이 되었다!!

 

 

 

== 3. 컨테이너끼리 데이터 공유하기 ==

이제 컨테이너끼리 데이터를 공유하는 방법에 대한 실습을 진행해보자

먼저 올라와져있는 컨테이너를 모두 중지시키거나 삭제하자

 

 

그리고 df 라는 명령을 사용할 것이다

df 명령어는 디스크 사용량을 모니터링할 때 사용한다

$ df -h /

이 모니터링 결과를 10초마다 생성하는 컨테이너를 만들어볼 것이다

일단 ~경로에 lab8이라는 디렉토리를 생성하자

$ mkdir ~/lab8
$ cd ~/lab8

그리고 이 디렉토리 안에 df.sh 스크립트 파일을 생성해줄 것이다

$ vi df.sh

# df.sh 파일 내부
#!/bin/bash
mkdir -p /webdata2
while true
do
	df -h / > /webdata2/index.html
    sleep 10
done

dockerfile도 만들어주자

$ vi dockerfile

# dockerfile 내부
FROM ubuntu:18.04
ADD df.sh /bin/df.sh # 현재 로컬디렉토리의 df.sh를 컨테이너 내부의 /bin/경로에 df.sh라는 이름으로 복사
RUN chmod +x /bin/df.sh
ENTRYPOINT ["bin/df.sh"]

컨테이너 이미지를 만들어주자

$ docker build -t smlinux/df:latest

이미지로 컨테이너를 만들어서 실행해보자

$ docker run -d -v /webdata2:/webdata2 --name df smlinux/df:latest

 

아래 그림에서의 초록색 박스 영역까지는 완성되었다!

그럼 10초마다 갱신되는 index.html 데이터를 받아오는 web server 컨테이너를 만들면 된다!

$ docker run -d --name web -v /webdata2:/usr/share/nginx/html:ro -p 80:80 nginx:1.14

이제 웹서버도 만들었으니 내부와 외부에서 모두 확인해보자!

내부에서는 확인이 잘 된다!

외부에서도 확인해보자!

외부에서도 연결 확인이 잘 된다!!

이 웹 페이지는 10초마다 갱신되도록 만들어졌기 때문에

디스크 사용량이 변화하면 10초마다 갱신되며 웹 페이지에서도 바뀐 데이터로 확인이 가능할 것이다!

 

오늘도 이렇게 볼륨마운트하는 방법에 대한 실습을 진행해보았다!

외부에서 버추얼 박스 내부로 접속하는게 안돼서 어제 하루종일 헤매다가

오늘 출근해서 겨우 해결했다!

뭔가 해결해서 너무너무 기쁘다 ㅠㅠ

고생 많았고 오늘도 힘내자

화이팅!!

안뇽!

'Docker' 카테고리의 다른 글

Docker 톺아보기 20탄 - 컨테이너간 통신 (실습편)  (0) 2023.01.02
Docker 톺아보기 19탄 - 컨테이너간 통신 (이론편)  (0) 2023.01.02
Docker 톺아보기 17탄 - Docker Container Storage (이론편)  (0) 2022.12.27
Docker 톺아보기 16탄 - Docker 컨테이너 리소스 관리하기 (실습편)  (0) 2022.12.27
Docker 톺아보기 15탄 - Docker 컨테이너 리소스 관리하기 (이론편)  (0) 2022.12.26
    AAROH
    AAROH
    마가렛 해밀턴이 되고 싶은 주니어 개발자, 아로

    티스토리툴바