Docker

Single Ko·2023년 7월 20일
0

공부하며 정리

목록 보기
11/17

Docker란?

Application, System Tools, Dependencies등을 묶어서 어떠한 환경에도 쉽게 배포하고 안정적으로 구동할 수 있게 해주는 패키징 툴의 역할

Virtual Machine과 비슷하지만 VM은 운영체제를 포함하고있고, VM machine 등을 이용해서 가동된다면, Docker의 컨테이너는 따로 운영체제 소스가 필요하지 않고, 호스트 OS에 깔린 Container Engine을 통해서 구동 됩니다.

이 컨테이너 엔진 중에서 가장 사랑받고 있는 것이 바로 Docker.

Docker의 큰 그림

Building Containers

  1. Dockerfile
  • Copy files
  • Install dependencies
  • Set environment variables
  • Run setup scripts
  1. Image
  • Application 구동에 필요한 코드, 런타임 환경, 설정, Dependencies , Dockerfile 등의 모든 세팅이 들어가 있다.
  • 이렇게 만들어진 이미지는 변하지 않는 불변성을 가지고 있다
  1. Container
  • 잘 캡쳐해둔 애플리케이션의 이미지를 고립된 환경에서 실행 할 수 있는 환경. (실행환경)
  • 이 컨테이너 환경에서는 애플리케이션의 수정도 되고, 파일도 만들수있는등 변경이 가능( 기존의 이미지에는 영향을 끼치지 않음)

Shipping Container

Local Machine에서 이미지를 만들어서 Container Registry에 Image를 Push하고, 이미지가 필요한 서버나 개발자의 pc에서 Image를 Pull하여 사용 가능.

이런 Container Registry에는

Docker Hub, Github Packages 같은 Public 한 저장소와 , AWS, Google, MS Cloud 에서 지원하는 Private한 저장소가 있다.

Docker 사용법

  • Docker Desktop 다운로드
  • Dockerfile 만들기

도커 파일은 레이어 형태로 이루어져 있다. 명령어 하나하나가 레이어이다.
도커 파일을 만들때는 빈번하게 변경되는 것을 나중에 작성해야 한다.
변경된 최상단의 레이어만 다시 만들면 됨. 캐시사용이 가능. 효율성 Up

  • Docker image 만들기

도커파일을 만들었다면 명령어를 통해 docker build를 실행하여 이미지를 만들 수 있다.

docker build -f Docerfile - t fun-docker .

.은 docker context 현재 경로 지정. f는 dockerfile의 이름. t는 만들어질 이미지의 이름 지정

여기는 아주 간단한 명령어만 사용하였고, Docker 홈페이지에서 찾아보면 이런 명령어에 대해 잘 알 수 있다.

  • container 실행
docker run -d -p 8080:8080 fun-docker

-d는 detache , 터미널에서 실행했을때, 백그라운드에서 동작하게 만들어줌.

  • p는 port, 먼저나오는 8080은 로컬의 포트, 뒤의 8080은 container의 포트 각각 독립된 환경이기에 서로 포트를 연결 해줘야됨.
  • 마지막은 실행시킬 이미지

마찬가지로 간단한 명령어들이다. 다양한 명령어는 홈페이지를 참고하자

이제 실행되고 있는 도커 컨테이너의 로그나 상태등은 terminal을 이용해서 확인 가능 하며, Docker Desktop UI를 이용해서도 확인 가능하다.

  • 이미지 배포

dockerhub를 많이 사용한다. 레포지토리를 만들어서 이미지 push를 하면 된다.

JIB 와 쿠버네티스 이용

쿠버네티스 -? 다운로드 받아서 설치

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 - 코드 수정이 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
profile
공부 정리 블로그

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

뛰어난 글이네요, 감사합니다.

답글 달기