Docker Volume은Docker Container실행하면서 데이터를 보존한다.
Docker 공식 사이트에서는
volume,bind mount,tmpfs mount중에volume을 가장 추천 !!

Docker Volume을 통해 데이터를 안전하게 다룬다.
데이터를 더 잘 다루고, 여러 컨테이너에서 공유하거나, 데이터를 안전하게 관리하는데 도움된다 !!
volume : 컴퓨터에 따로 만들어진 폴더 같은 것
/var/lib/docker/volumes/ 라는 곳)에 만든다.#datavol 볼륨 생성
docker volume create datavol
docker volume ls
docker container run -ti --rm -v datavol:/data alpine
# docker container 내에서
echo "볼륨 데모" > /data/demo.txt
exit
# Host Machine에서 alpine을 이용한 컨테이너 삭제 확인
docker container ls
# 새로운 이미지와 새로운 컨테이너에서 demo.txt 파일 확인
docker container run --rm -v datavol:/data ubuntu cat /data/demo.txt
일반적으로 Docker 컨테이너는 일시적이고 휘발성인 환경이지만, 볼륨을 사용하면 컨테이너가 종료되거나 삭제되어도 데이터를 계속 유지가능 !!
docker volume inspect datavol

docker run -d --name mysqltest -v /var/lib/mysql mysql:latest
docker inspect mysqltest # 정보가 많음
docker inspect mysqltest | jq .[].Mounts # `Name` 을 확인
docker volume ls # `Name`을 확인


Docker 볼륨을 사용하여 컨테이너 간에 데이터를 영속적으로 저장하고 공유 가능 !
- mysql 컨테이너 실행
docker run -ti --rm -d --name mysqltest -e MYSQL_ROOT_PASSWORD=123! -e MYSQL_DATABASE=mysqltest -v ~/mysqldata:/var/lib/mysql mysql:latest
#mysql 서버에 ssh 접속 및 mysql 접속
docker exec -ti mysqltest /bin/bash
mysql -h localhost -u root -p

- mysql 명령
```bash
show databases;
use mysqltest;
create table mysqltest(id int, name varchar(50));
insert into mysqltest values(1, 'testname');
select * from mysqltest;
#Host Machine으로 이동
exit
eixt
ls -ahlvF ~/mysqldata/mysqltest

docker stop mysqltest
docker run -ti --rm -d --name mysqltest2 -e MYSQL_ROOT_PASSWORD=123! -e MYSQL_DATABASE=mysqltest -v ~/mysqldata:/var/lib/mysql mysql:latest
docker logs -f mysqltest2
docker exec -ti mysqltest2 /bin/sh
mysql -h localhost -u root -p
use mysqltest;
select * from mysqltest;

Docker Network : 여러 컨테이너가 서로 통신할 수 있도록 도와주는 네트워크 시스템
Docker는 컨테이너 네트워크 모델(CNM)을 제공
CNM: 컨테이너들 간의 네트워크를 관리하는데 필요한 기본 요건을 정의한 모델
샌드박스 : 컨테이너를 외부 세계로부터 완전히 분리시킨다.
엔드포인트 : 외부 세계와 샌드박스(컨테이너가 아닌) 사이의 연결점.
네트워크 : 엔트포인트를 통해 컨테이너 간 데이터 전달 경로.
로컬 : 같은 호스트 내에서 실행될 수 있다.글로벌 : 여러 호스트에 걸쳐 실행될 수 있다.여러 네트워크를 사용하여 필요한 서비스만 연결하고, 보안을 강화하는 구조 !!
# back, front 네트워크 생성
docker network create --driver=bridge back
docker network create --driver=bridge front
# 각 서비스를 생성 및 실행
docker run --name=webapi -itd --net=front ubuntu:14.04
docker run --name=catalog -itd --net=back ubuntu:14.04
docker run --name=database -itd --net=back ubuntu:14.04
# catalog 서비스는 기본 back 네트워크 뿐만 아니라 front 네트워크에도 연결
docker network connect front catalog
# webapi 의 라우팅 테이블
docker exec webapi route
# catalog 의 라우팅 테이블
docker exec catalog route
# database 의 라우팅 테이블
docker exec database route
docker network inspect front # webapi / catalog
docker network inspect back # catalog / database

docker exec -it webapi bash
# 머신 안에서
ping -c 1 catalog # 가능
ping -c 1 database # 연결 불가능
exit
#
docker exec -it catalog bash
# 머신 안에서
ping -c 1 webapi
ping -c 1 database
# 리소스 정리
docker network disconnect front catalog
docker stop webapi catalog database
docker rm webapi catalog database
docker network rm back
docker network rm front


Docker Image를 Docker Hub Repository에 올리는 방법을 알아보자 !
push : 이미지 올리기registry : Dockerfile을 통해 생성한 이미지나 docker commit을 통해 생성된 이미지를 저장하는 곳Public registry : 공개적으로 사용할 수 있어 아무나 접근 가능Private registry : 특정인이나 특정 그룹만 접근 가능Docker Hub : hub.docker.com은 Docker 공식 RegistryDocker image tag -> pushdocker logout
docker login
docker image pull nginx:latest
docker image pull ubuntu:22.04
docker images
docker image tag nginx:latest kongheejin/nginx-test:1.0

docker push kongheejin/nginx-test:1.0


docker images
docker image rm kongheejin/nginx-test:1.0
docker container rm nginx-test --force
docker image rm nginx-test:1.0 --force
docker pull kongheejin/nginx-test:1.0
docker run -d -p 8001:80 --name=nginx-test kongheejin/nginx-test:1.0


#Dockerfile
# 1. 빌드 단계
# build 는 gradle 이미지에서 `builder`라는 이름으로.
FROM gradle:8.5-jdk21-alpine AS builder
WORKDIR /app
COPY ./ ./
RUN gradle clean bootJar
# 2. 애플리케이션 실행 단계
FROM eclipse-temurin:21-jre-alpine
WORKDIR /app
COPY --from=builder /app/build/libs/spring-boot-0.0.1-SNAPSHOT.jar .
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "spring-boot-0.0.1-SNAPSHOT.jar"]