Docker container
를Host PC
의volume
에 지정하여,container
가 삭제되더라도영구 보존
하는 방법이다.
컨테이너
를 실행하다보면, 컨테이너
를 실수로 지우거나 삭제되는 경우, 작성한 데이터를 잃을 수 있으므로, 컨테이너 외부
에 volume
을 지정하여 저장하는 방법이다.-v {host path}:{container mount path}
- 컨테이너 이미지는
readonly
이며, 컨테이너 실행시, 컨테이너는readwrite
레이어가 추가된다Union file system
혹은overlay
로 마치 하나의 시스템으로 보여지는 시스템
MySQL
컨테이너를 생성하고,데이터
는컨테이너 외부
인Host
에 저장해보겠습니다.
MySQL
container 동작시환경변수
로 필수적으로 비밀번호 설정을 해주어합니다.-e MYSQL_ROOT_PASSWORD=pass
: 환경변수 비밀번호pass
설정
-v /dbdata:/var/lib/mysql
:{Host}
PC의/dbdata
를container
의/var/lib/mysql
에 연결
$ docker run -d -v /dbdata:/var/lib/mysql --name db -e MYSQL_ROOT_PASSWORD=pass mysql:latest
-v /dbdata
에서 dbdata
폴더가 없으면 자동생성되며, dbdata
폴더가 있을시 마운트 된다.
MySQL
컨테이너에 접속
MySQL
컨테이너
에서는/var/lib/mysql/dbdata
에 저장된다.
$ docker exec -it db /bin/bash
MySQL
의root
계정의 비밀번호pass
로db
접속 ( mysqld 데몬에 접속)$ mysql -u root -ppass
// 현재 MySQL 컨테이너 안
$ mysql -u root -ppass
show databases
:database
확인
// 현재 MySQL db 안
mysql> show databases
예시로 테이블을 생성해서, 컨테이너가 삭제되어도 테이블 데이터가 Host에 저장되어 있는지 확인해보자
// 현재 MySQL db 안
mysql> create database ttabae
mysql> show database
mysql> exit
컨테이너 데이터가
Host
에도 있는지 확인
- 설정한
Host
저장경로 :/dbdata/
$ cd /dbdata/
$ ls
컨테이너를 삭제한 후,
Host
에 데이터(ttabae
)가 있는지 확인하자
$ docker rm -f db
-v에서 {host경로}
를 생략할 경우,Host
의/var/lib/docker/volumes/{uuid}/_data
에 저장된다.
docker volume ls
로 도커가 관리하는 볼륨을 확인docker rm {volume ID}
: 해당 볼륨 삭제
docker inspect mysql
을 통해서 마운트된 경로 확인
$ docker inspect mysql
"Mounts": [
{
"Type": "volume",
"Name": "{name}",
"Source": "/var/lib/docker/volumes/{id}/_data",
"Destination": "/var/lib/mysql",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
Host
에 있는 데이터를 컨테이너를 통해 유저가 서비스 지원 받는 구조
- 컨테이너 데이터는
readonly
$ docker run -d --name web -p 80:80 -v /webdata:/usr/share/nginx/html:ro nginx:1.14
-p 80:80
포트 설정-v /webdata:/usr/share/nginx/html:ro
호스트의 /webdata
nginx컨테이너
의 /usr/share/nginx/html
로 readonly(ro)
설정디스크 사용량을 모니터링 결과를 10초마다 한번씩 웹에 보여주는 컨테이너
- 컨테이너끼리 데이터 공유하여 결과 보여줌
df -h
: 디스크 사용량을 모니터링 할때 사용
10초
마다df -h
결과를index.html
로 만들어준다.
#!/bin/bash
mkdir -p /webdata
while true
do
df -h > /webdata/index.html
sleep 10
done
dockerfile
작성 후 이미지 빌드
dockerfile
FROM ubuntu:18.04
ADD df.sh /bin/df.sh
RUN chmod +x /bin/df.sh
ENTRYPOINT ["/bin/df.sh"]
$ docker build -t jbro321/df:latest .
2개의 컨테이너를 생성하여 동일한 디렉토리의 데이터를 공유
1.-v /webdata:/webdata
로 볼륨 지정하여 docker run하여 컨테이너 생성
2.nginx
컨테이너 생성하여volume
지정
$ docker run -d -v /webdata:/webdata --name df jbro321/df:latest
$ docker run -d --name web -v /webdata:/usr/share/nginx/html:ro -p 80:80 nginx:1.14
readonly
설정