취미가 좋다
[2-1] 컨테이너의 데이터를 유지 본문
컨테이너의 데이터
- 일반적으로 도커 컨테이너를 실행한 서버에서 무언가를 작업하고 저장하더라도, 컨테이너가 삭제되면 그 정보도 사라진다.
- 도커는 다시 실행시켜야 하는 일이 무조건 존재하기 때문에, 컨테이너가 삭제되더라도 정보를 유지시킬 필요가 있다.
- 컨테이너가 실행되면 매번 비어있는 메모리에서 시작한다.
- 또한 컨테이너끼리는 같은 이미지이더라도 file system을 공유하지 않는다.
- named volume & bind mount 두 가지 기능으로 위의 문제를 해결할 수 있다.
MongoDB docker로 띄우기
컨테이너에 할당된 메모리에 저장되던 데이터를, mongodb에 저장할 것이다.
docker run --name mongo_db -p 27017:27017 -d mongo
Robo3T 다운로드 : 편하게 mongodb 안에 있는 데이터를 조작할 수 있다.
- Connections 를 Create 하여 mongodb와의 새로운 connections를 만든다.
- config/Collections 에 데이터가 저장된다.
- create collections 로 새로운 컬렉션을 만들고, insert Document 로 데이터를 넣을 수 있다.
- "key" : "value"
이렇게 데이터를 넣어도, 컨테이너를 삭제하고 새로 생성하면 모든 데이터가 삭제된다.
named volume으로 DB 데이터 유지하기
name volume
docker에서 유지되는 데이터를 관리해야 할 때 편리하게 이름으로 사용할 수 있게 만들어둔 volume
docker volume create memo
docker volume inspect memo 명령어로 named volume에 대한 정보를 자세히 알 수 있다.
mountpoint를 통해 볼륨이 어디에 생성되었는지 알 수 있다.
mongodb에 named volume 을 연결
컨테이너와 named volume을 연결하여, 유지되어야 하는 데이터를 named volume에 저장한다.
연결 방식은 컨테이너에서 유지할 데이터가 있는 폴더를 named volume과 연결하는 것이다.
연결된 폴더에 데이터를 저장하면, named volume에도 데이터가 저장된다.
docker run -p 27017:27017 -v memo:/data/db mongo
-v 옵션을 통해 named volume을 지정한다.
위의 명령어는 memo라는 volume을 컨테이너에 있는 /data/db와 연결한다.
추가적으로 볼륨은 여러 컨테이너와 동시에 마운트(연결)될 수 있다.
이를 통해 컨테이너 간 데이터 공유가 가능하다.
메모 어플리케이션에 DB 를 사용하게 변경하기
DB(mongodb)와 named volume을 연결하여, db 컨테이너에 저장된 데이터가 컨테이너가 삭제되더라도 유지되도록 하였다.
이제는 그 db를 이전에 사용했던 메모 어플리케이션과 연결해보자.
app.py 파일의 코드를 변경해야 한다.
기존에는 articles 변수에 데이터를 저장했고, mongoDB에 저장하도록 수정해야 한다.
수정된 코드는 아래와 같다.
from flask import Flask, render_template, jsonify, request
app = Flask(__name__)
import requests
from bs4 import BeautifulSoup
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta
## HTML을 주는 부분
@app.route('/')
def home():
return render_template('index.html')
@app.route('/memo', methods=['GET'])
def listing():
articles = list(db.articles.find({}, {'_id': False}))
return jsonify({'all_articles': articles})
## API 역할을 하는 부분
@app.route('/memo', methods=['POST'])
def saving():
url_receive = request.form['url_give']
comment_receive = request.form['comment_give']
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get(url_receive, headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
title = soup.select_one('meta[property="og:title"]')['content']
image = soup.select_one('meta[property="og:image"]')['content']
desc = soup.select_one('meta[property="og:description"]')['content']
doc = {
'title': title,
'image': image,
'desc': desc,
'url': url_receive,
'comment': comment_receive
}
db.articles.insert_one(doc)
return jsonify({'msg': '저장이 완료되었습니다!'})
if __name__ == '__main__':
app.run('0.0.0.0', port=5000, debug=True)
위처럼 코드를 실행하고, 메모 어플리케이션에 정보를 입력해보자.
어플리케이션 컨테이너와 mongodb 컨테이너 를 삭제하고 다시 생성하더라도, 이전 데이터가 유지되는 것을 볼 수 있다.
'Sparta Coding Club > Docker' 카테고리의 다른 글
[2-3] 여러 컨테이너 연결 (0) | 2021.07.30 |
---|---|
[2-2] 원하는 volume을 컨테이너에 연결하기 (0) | 2021.07.30 |
[1-3] 어플리케이션 공유하기 (0) | 2021.07.30 |
[1-2] flask 어플리케이션을 도커로 실행해보기 (0) | 2021.07.29 |
[1-1] Docker 튜토리얼 (0) | 2021.07.29 |