도커 컨테이너는 Stateless 하게 설계되어야한다.
- 도커 컨테이너 사용 시의 가장 중요한 Topic
컨테이너의 정체성을 결정하는 데이터는 컨테이너에 저장되지 아니한다.
컨테이너가 Host 의 데이터에 의해 동작하도록 설계해야하며
이를 Stateless 하다. 라고 한다.
라고 하며, 이는 도커 컨테이너를 사용함에 가장 권장되는 방법이다.
도커 이미지는 Read Only , 변경 데이터는 컨테이너 레이어 에 저장
- mysql 을 이용해 컨테이너를 만들 경우, mysql 의 이미지에 제공되는 데이터 외의 저장 데이터들은 Container Layer 에 존재
- 이미지는 어느 경우던 절대로 변경되지 아니한다.
- Stateless 한 컨테이너 설계를 하지 않을 경우, Docker Container 삭제 시 Container Layer 의 모든 데이터가 날아간다.
컨테이너의 정체성을 결정하는 데이터를 외부로 넘겨 Stateless 하게 설계 && 데이터의 영속성(Persistence) 을 부여하기 위해
Docker Volume 을 사용하는 것이 가장 권장되는 방법이다.
Docker Volume 사용법은 3 가지로
1. 호스트와 직접 공유
2. 호스트와 공유한 데이터를 관리하는 컨테이너와 공유 하여 간접공유 = 볼륨 컨테이너 사용
3. 도커 엔진 내부의 Volume 사용
으로 나뉜다.
1. 호스트와 직접 공유
- -v 옵션 사용
- 호스트에 디렉토리가 존재하지 않더라도 [Docker 에서 자동 생성]
- 동기화가 아닌 [같은 디렉토리가 됨]
- 호스트 디렉토리에 파일이 있다면 , 호스트 디렉토리가 [Container dir] 에 덮어씌워짐
docker run -d --name mysqldb -e MYSQL_PASSWORD=mysql MYSQL_DATABASE=my_db \
-v /host/home/mysql:/var/lib/mysql \
mysql:latest
# Host bash
ls /host/home/mysql # Docker 에서 디렉토리 생성
# -v 옵션을 여러개 줄 때 && 파일을 마운트할 때
# Host bash
echo hello world! >> /host/home/hellow && echo hello docker! >> /host/home/hellod
docker -i -t --name hello_volume \
-v /host/home/hellow:/hellow
-v /host/home/hellod:/hellod
ubuntu:14.04
#Docker Container bash
cat hellow && cat hellod
# hellow world!
# hellow docker!
2. 볼륨 컨테이너 사용 ( 간접 공유 )
- --volumes-from [container name] 사용
- Host 와 마운트된 볼륨 컨테이너의 디렉토리가 Container 에 마운트
- 이를 이용하면, 볼륨 만을 관리하는 컨테이너를 두고 다른 컨테이너들에서 공유받아 Stateless 하게 사용할 수 있다.
#host bash
docker run -i -t --name volumes_from_container \
--volumes-from mysqldb
ubuntu:14.04
#Docker Container bash
ls /var/lib/mysql
3. 도커 볼륨 사용 ( 도커 엔진 )
- docker 에서 관리하는 volume 이라는 저장소를 사용
- volume 은 host 에 저장
- 도커 엔진에서 볼 수 있으므로 경로를 알 필요는 없음
- 도커 볼륨은 하나의 디렉토리에 상응하는 단위
# create volume
docker create volume --name myvolume
# search
docker volume ls
# log
# DRIVER VOLUME_NAME
# local myvolume
# use
docker run -i -t --name myvolume_1 \
-v myvolume:/root/ \
ubuntu:14.04
# Docker Container bash
echo hello, volume! >> /root/volume
# confirm
docker run -i -t --name myvolume_confirm \
-v myvolume:/root/ \
ubuntu:14.04
# Docker Container bash
cat /root/volume
# hello, volume!
# Host bash, Docker Volume Location Search
docker volume inspect myvolume | grep Mountpoint
# Host bash, confirm
cat /var/lib/docker/volumes/myvolume/_data/volume
# hello, volume!
컨테이너 생성시 Docker Volume 을 자동적으로 생성하게 하기
# Host bash, -v 옵션에 호스트 볼륨을 주지않을시 Docker Engine 내에 자동으로 Volume 생성
docker run -i -t --name volume_auto \
-v /root \
ubuntu:14.04
# Host bash, confirm volume
docker volume ls
# DRIVER VOLUME_NAME
# local 16진수--
# Host bash, 어느 컨테이너가 volume 을 사용중인지 확인
docker container inspect volume_auto | grep Source
# /var/lib/docker/volumes/16진수--/_data
# Host bash, All Volumes delete
docker volume prune
'Docker 작업' 카테고리의 다른 글
Docker Tool Box 윈도우 공유 폴더 마운트 (0) | 2021.01.24 |
---|---|
도커 툴박스 포트 포워딩 (0) | 2021.01.23 |
Docker Compose 를 이용한 Fat.jar 들의 실행 (0) | 2021.01.02 |
OpenJDK 12.0.2 기반 Fat.jar 도커이미지 빌딩 (0) | 2021.01.01 |
Docker 컨테이너의 JVM 할당량 확인해보기 (0) | 2021.01.01 |