Docker란?
Application, System Tools, Dependencies등을 묶어서 어떠한 환경에도 쉽게 배포하고 안정적으로 구동할 수 있게 해주는 패키징 툴의 역할
Virtual Machine과 비슷하지만 VM은 운영체제를 포함하고있고, VM machine 등을 이용해서 가동된다면, Docker의 컨테이너는 따로 운영체제 소스가 필요하지 않고, 호스트 OS에 깔린 Container Engine을 통해서 구동 됩니다.
이 컨테이너 엔진 중에서 가장 사랑받고 있는 것이 바로 Docker.
Docker의 큰 그림
Local Machine에서 이미지를 만들어서 Container Registry에 Image를 Push하고, 이미지가 필요한 서버나 개발자의 pc에서 Image를 Pull하여 사용 가능.
이런 Container Registry에는
Docker Hub, Github Packages 같은 Public 한 저장소와 , AWS, Google, MS Cloud 에서 지원하는 Private한 저장소가 있다.
도커 파일은 레이어 형태로 이루어져 있다. 명령어 하나하나가 레이어이다.
도커 파일을 만들때는 빈번하게 변경되는 것을 나중에 작성해야 한다.
변경된 최상단의 레이어만 다시 만들면 됨. 캐시사용이 가능. 효율성 Up
도커파일을 만들었다면 명령어를 통해 docker build를 실행하여 이미지를 만들 수 있다.
docker build -f Docerfile - t fun-docker .
.은 docker context 현재 경로 지정. f는 dockerfile의 이름. t는 만들어질 이미지의 이름 지정
여기는 아주 간단한 명령어만 사용하였고, Docker 홈페이지에서 찾아보면 이런 명령어에 대해 잘 알 수 있다.
docker run -d -p 8080:8080 fun-docker
-d는 detache , 터미널에서 실행했을때, 백그라운드에서 동작하게 만들어줌.
마찬가지로 간단한 명령어들이다. 다양한 명령어는 홈페이지를 참고하자
이제 실행되고 있는 도커 컨테이너의 로그나 상태등은 terminal을 이용해서 확인 가능 하며, Docker Desktop UI를 이용해서도 확인 가능하다.
dockerhub를 많이 사용한다. 레포지토리를 만들어서 이미지 push를 하면 된다.
쿠버네티스 -? 다운로드 받아서 설치
Docker Desktop 설정에서 kubernetes를 Enable시키면 바로 활성화 가능.
쿠버네티스에 대한 확인을 하고 싶을때 kubectl을 이용 많이함.(터미널을 이용해서)
JIB란?
Java 애플리케이션에 최적화된 Docker 및 OCI 이미지를 빌드해주는 툴
build.gradle에서..
id 'com.google.cloud.tools.jib' version {version}'
jib {
from {
image = 'openjdk:11-jre-slim' // base image
}
to {
image = 'Docker-test'
tag = ['0.0.1']
}
container{
mainClass = 'com.test.docker.DockerApplication'
creationTime = 'USE_CURRENT_TIMESTAMP'
format = 'OCI'
volumes = ['/var/tmp']
entrypoint = ['java'
, '-cp', '/app/resources:/app/classes:/app/libs/*'
, 'com.test.docker.DockerApplication']
}
}
jib docker build를 사용해서 도커를 빌드시켜 이미지 생성
image를 실행하면 정상적으로 실행이 될 것이다.
Skaffold - 코드 수정이 K8S에 반영되기 까지의 과정을 자동화하여 단순화해주는 프레임워크
skaffold를 설치..
skaffold yml 파일을 설정해줘야 된다.
apiVersion: skaffold/v4beta2
kind: Config
build:
artifacts:
- image: Docker-test
jib: {}
프로젝트에 k8s라는 쿠버네티스 설정 패키지를 하나 만들어 주자
여기에 deployment.yml과 service.yml 파일 설정
deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: Docker-test
spec:
selector:
matchLabels:
apps: Docker-test
template:
metadata:
labels:
app: Docker-test
spect:
containers:
- name: Docker-test
image: Docker-test
ports:
- containerPort: 8080
service.yml
apiVersion: v1
kind: Service
metadata:
name: Docker-test
namespace: default
labels:
app: Docker-test
spec:
selector:
app: Docker-test
ports:
- name: http
port: 8080
targetPort: 8080
type: LoadBalancer
뛰어난 글이네요, 감사합니다.