Docker Volume

출처
- Docker Container 내부의 데이터의
영속성
을 보장하기 위해서 사용한다.
- 컨테이너는 사용하고나면 사라지게되는
휘발성
성질을 가지는데 볼륨을 사용한다면 데이터는 그대로 보존된다.
- 여러컨테이너가 하나의 데이터를 공유할 수 있다.
- 데이터를 백업하거나 이동하기 쉽게 해주고 더 빠르게 사용이 가능하다.
- 데이터를 컨테이너 외부의 보관하기에 보안성이 높고 코드의 변경전파가 낮기 때문에 재사용성이 높다.
bind mount
- 컴퓨터의 특정폴더 혹은 파일을 컨테이너 내부에서 직접 사용할 수 있도록 하는 기능. 볼륨보다 기능이 적지만 특정상황에선 유용하다.
- 폴더나 파일을 골라서 컨테이너 내부에
붙여넣는
형식으로 사용한다.
- 컴퓨터 내부의 있는
절대경로
에 위치한 파일 혹은 폴더를 사용하기 때문에 컨테이너와 상관없이 동일한 데이터에 대한 멱등성
을 보장한다.
tmpfs mount
- 컴퓨터 메모리를 사용해서 일시적인 데이터를 저장하는 방법 이며,
일시적
으로 데이터를 다룰때 유용하다.
- 파일시스템을 사용하는것이 아닌, 메모리를 사용하기에 더 빠르고 성능적면에서 우위를 가진다.
- 컨테이너의 메모리를 사용하기에 여러컨테이너에서 공유가 불가능하다.
Docker Network


출처
-
도커 컨테이너들 끼리 서로 통신할 수 있게 만들어주는 시스템. 컨테이너들간의 통신을 더 쉽게 할 수 있고, 보안 또한 더 강하게 만들 수 있다.
-
일반적인 APP은 여러개의 컨테이너가 모듈형식으로 엮여져있는 상태가 많다. 이를 해결하기위해선 컨테이너사이의 통신 경로인 네트워크 모델(CNM)이 필요하다.
샌드박스
- 컨테이너와 외부를 완전히 분리한다. 하지만 소통이 필요한 경우가 생기기에
엔드포인트
라는 기술을 활용한다.
엔드포인트
- 샌드박스와 외부 사이를 연결하는 연결점 이다. 엔드포인트는 샌드박스를 네트워크에 연결하는 작업을 실행한다.
네트워크
- 엔드포인트에서 다른 엔드포인트로 연결하는 작업을 하며, 컨테이너와 컨테이너를 연결하는 길이다.
- 하나의 샌드박스는 여러개의 엔드포인트를 가질 수 있으며, 엔드포인트를 하나도 가지지 않거나 여러개의 엔드포인트와 연결될 수 있다.
- 네트워크 모델은 범용적이며, 각각의 컨테이너가 어디에서 실행되는지 정해져있지 않다. 모든 컨테이너가 하나의 호스트에서 전부 실행될 수도 있고 여러곳에서 실행될 수 도 있다.
유사한 사례

- 실제 CNM은 논리적 모델일뿐임으로 직접 구현을 해주어야한다.
위 그림처럼 원하는 컨테이너들끼리만 통신이 가능하도록 구현이 가능하다.
- 권한없는 접근에대한 제어가 필요하기에 꼭 통신이 필요한 컨테이너끼리만 통신이 가능하도록 여러 네트워크를 사용하는편이 좋다.
네트워크 종류
브리지 네트워크
- 도커를 사용할 때 가장 많이 사용하는 기본 네트워크로 1개의 컴퓨터안에서 여러 컨테이너의 통신을 하게 해준다.
- 도커가 자동적으로 IP주소를 할당해주고 호스트 밖의 다른 네트워크랑 별개로 동작한다.
- 포트매핑을 이용 한다면 외부의 컨테이너도 접근이 가능하다.
공용 네트워크
- 외부에서 접근하기위해 브리지 네트워크 상에서 포트매핑을 실행하거나,
호스트 네크워크
를 통해서 컨테이너가 직접 실행되는 컴퓨터의 네트워크를 사용하는 방법.
사설 네트워크
- 사용자가 직접 네트워크를 만들어서 내부에 원하는 컨테이너들만 연결이 가능하다. 외부네트워크와 격리되기에 보안상 안전하다.
Docker Image 심화
image push
- Dockerfile 을 통해 생성한 이미지나 docker commit 을 통해 이미지를 생성할 수 있다.
registry
- 생성된 이미지를 저장하는 곳 이다.
- Public registry : 공개적으로 사용하고 접근권한이 불필요한 곳이다.
- Private registry : 특정인 이나 특정 그룹만이 접근가능한 곳 이다.
Docker Hub
- hub.docker.com Docker 공식 Registry 이다.
- image 를 tag 한 후 push 하는 방식으로 사용되며, 본인 계정을 이미지명 앞에 붙여야 docker push 수행 시 계정으로 찾아가 저장된다.
Dockerfile 최적화
- 이미지 용량을 줄여 실행이나 용량 다운 및 전송속도를 빠르게하고, 재사용성을 높이면서 보안을 강화하고, 유지보수성을 높힐수 있다.
Dockerfile 예제
FROM gradle:8.5-jdk21-alpine AS builder
WORKDIR /app
COPY ./ ./
RUN gradle clean bootJar
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"]
- alpine 이미지를 사용해서 최소한의 라이브러리만 설치된 이미지를 사용하여 빌드한다.
- multi stage를 사용하여 application 실행 Container에 gradle이 설치되는 것을 방지한다.