보고 배운 인강

1. 도커란 ?

컨테이너를 사용하여

응용프로그램을 더 쉽게 만들고, 배포하고 실행할 수 있도록 설계된 도구이며

컨테이너 기반의 오픈 소스 가상화 플랫폼이다.


일반 컨테이너 개념에서 물건을 손쉽게 운송해주는 것처럼

어플리케이션 환경에 구애받지 않고 손쉽게 배포 관리를 할 수 있게 해준다.


컨테이너 기반 배포 방식은

구글을 비롯해 대부분의 서비스 회사가 컨테이너로 서비스 운영 중이다.


2. 도커를 사용해야 하는 이유

2대의 서버가 있을 때,

2대의 서버 세팅 시기가 다르다면 ,

운영체제 버전부터 컴파일러, 설치된 패키지까지 완벽하게 같게 하기가 쉽지 않다.


이러한 차이로 인해 문제가 발생하기 쉬운데,

도커는 서버마다 동일한 환경을 구성해주기 때문에

이러한 문제를 해결할 수 있다.


또한,
docker를 사용하면 동일한 환경을 구성하기 때문에 auto scaling에 유리하다.



3. 도커와 기존 가상화 기술 (VM) 의 차이

Hypervisor

Hypervisor는 (VM)

호스트 시스템 (윈도우, 리눅스 등)에서

다수의 게스트 OS (가상머신) 를 구동할 수 있게 하는 소프트웨어이다.


각 VM 마다 독립적으로 동작한다.


Container

Container는 (Docker)

하이퍼 바이저 구조를 토대로 등장했으며,

VM보다 훨씬 가볍게 동작하기 때문에 성능에 유리하다.


Hypervisor 와 Containers 비교 사진

출처 : https://www.virtasant.com/blog/hypervisors-a-comprehensive-guide



 

4. 도커의 이미지와 컨테이너

  • 이미지란
    코드, 런타임, 시스템 도구, 시스템 라이브러리 및 설정과 같은
    응용 프로그램을 실행 하는데 필요한 모든 것을 포함하는 패키지이다.

  • 이미지는 Github와 유사한 서비스인 https://hub.docker.com 을 통해 버전 관리된다.

  • 컨테이너란

    • 도커 이미지를 독립된 공간에서 실행할 수 있게 해주는 기술이다.
    • 하나의 이미지는 여러개의 컨테이너를 실행할 수 있다.
    • 컨테이너를 이미지 인스턴스라고 부르기도 한다.

 

5. 도커 파일이란?

도커 이미지를 구성하기 위해 있어야할

패키지, 의존성, 소스코드 등을 하나의 file로 기록하여

이미지화 시킬 명령 파일 이다.


즉,
이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에,

더 이상 새로운 서버가 추가되면

의존성 파일을 컴파일하고 이것 저것 설치할 필요가 없다.



6. 도커 파일 주요 명령어

FROM

새로운 이미지를 생성할 때 기반으로 사용할 이미지를 지정 이미지 이름:태그

# ex. jdk 11 이 있는 컨테이너 사용
FROM openjdk:11

ARG

이미지 빌드 시점에서 사용할 변수 지정

ARG JAR_FILE=build/libs/app.jar

COPY

호스트에 있는 파일이나 디렉토리를 Docker 이미지의 파일 시스템으로 복사

COPY ${JAR_FILE} ./app.jar

ENV

컨테이너에서 사용할 환경 변수 지정

# TimeZone 환경 변수
ENV TZ=Asia/Seoul

ENRTYPOINT

컨테이너가 실행되었을 때 항상 실행되어야 하는 커맨드 지정

ENRTYPOINT ["java", "-jar", "./app.jar"]

 

7. 도커 컴포즈란?

  • Docker Compose란
    멀티 컨테이너 도커 어플리케이션을 정의하고 실행하는 도구이다.

  • Application , Database , Redis , Nginx 등
    각 독립적인 컨테이너로 관리한다고 했을 때
    다중 컨테이너 라이프 사이클을 어떻게 관리해야 할까?
    -> 도커 컴포즈로 관리!

  • 여러개의 도커 컨테이너로 부터 이루어진 서비스를 구축 ,
    네트워크 연결 , 실행 순서 를 자동으로 관리 해준다.

  • docker-compose.yml 파일을 작성하여 1회 실행하는 것으로
    설정된 모든 컨테이너를 실행.



 

8. Docker 설치

1. 각 OS에 맞게 Docker 설치를 진행한다.

  • windows : https://docs.docker.com/desktop/install/windows-install/

    귀여운게 생겼닼ㅋㅋ

  • Linux Ubuntu

    • ubuntu 22.04에 docker 설치 : ubuntu 설치 참고 링크
      # 우분투 시스템 패키지 업데이트
      sudo apt-get update
      # 필요한 패키지 설치
      sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
      # Docker의 공식 GPG키를 추가
      curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
      # Docker의 공식 apt 저장소를 추가
      sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
      # 시스템 패키지 업데이트
      sudo apt-get update
      # Docker 설치
      sudo apt-get install docker-ce docker-ce-cli containerd.io
      # version 확인
      docker -v


2. hub.docker.com 무료 플랜 가입 및 로그인

https://hub.docker.com


3. docker compose 설치

docker compose 는 Mac 또는 Windows 의 경우

Docker desktop 을 설치한 경우라면

docker compose 설치를 진행할 필요가 없으며,

Linux의 경우 추가적으로 docker-compose 설치가 필요하다.

ubuntu 22.04에 docker compose 설치

# https://github.com/docker/compose/releases 에서 최신 버전 확인후 설치
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 실행이 가능하게 권한을 세팅
sudo chmod +x /usr/local/bin/docker-compose
# 설치 버전 확인
sudo docker-compose -v


9. Docker 로그인

windows의 경우 power shell을 실행하고 아래 명령어를 입력한다.

ubuntu에선 shell에 바로 입력

docker login

windows

로그인 실패시 좌측 하단에 도커 데스크탑이 실행중인지 확인!


ubuntu


 

10. 단일 컨테이너 환경 실습

목표 : Spring Boot 어플리케이션 이미지화 후 컨테이너에서 실행


10-1. jar 파일 생성

인텔리제이 내장 terminal을 사용하면

프로젝트 현재 위치에서 실행되어 편하다.


인텔리제이로 프로젝트 실행 후 내장 터미널 열기.


10-1-1. 생성될 jar 파일 이름 설정

jar 파일 이름을 app.jar로 지정해서 생성되도록 하고자 한다.

build.gradle 파일을 실행 후 다음의 코드를 작성해준다.

bootJar {
    archiveFileName = 'app.jar'
}

10-1-2. build !

(windows)

.\gradlew clean
.\gradlew build


10-2. docker file 작성

10-2-1. 프로젝트의 루트 디렉토리에 파일 생성

파일 이름 : Dockerfile


10-2-2. 파일 내용 작성

#Dockerfile

FROM openjdk:11
ARG JAR_FILE=build/libs/app.jar
COPY ${JAR_FILE} ./app.jar
ENV TZ=Asia/Seoul
ENTRYPOINT ["java", "-jar", "./app.jar"]

10-2-3. docker file build

docker build -t {docker hub username}/{file name} {docker file 위치}

docker build -t zhyun/jar-docker-file-test .


생성된 docker images 확인!

docker images


10-3. docker 컨테이너 실행

docker run 명령어 사용!

docker run zhyun/jar-docker-file-test -p 8080:8080

-p : {host port}:{컨테이너 port}


docker 가 정상 동작중인지 확인을 위해 terminal을 하나 새로 열고

아래와 같이 명령어를 입력한다.

docker ps

실행중인 docker images 확인 가능!


+ 실행중인 컨테이너에 들어가보기

docker exec -it {container id} {shell}

docker exec -it 4d10189fd2a5 bash


우와 😀

 

11. 다중 컨테이너 환경 실습

11-1. 도커 컴포즈 파일에 작성해야 할 정보 : docker-compose.yml

version

도커 엔진버전에 따른 컴포즈 버전 선택
compose-v3
compose-v2

service

이곳에 실행하려는 컨테이너들을 정의

pharmacy-recommendation-app

서비스명 ( 네트워크 호스트명 ) / 같은 네트워크에 속한 컨테이너끼리 서비스 명으로 접근
가능

container_name

컨테이너 이름

build

dockerfile 이 있는 위치

depends_on

특정 컨테이너에 대한 의존관계

image

컨테이너 생성할 때, 사용할 도커 이미지 지정

environment

환경 변수

volumnes

호스트 디렉토리 : 컨테이너 디렉토리

ports

접근 포트 설정 (컨테이너 외부 : 컨테이너 내부)
--> docker run -p 옵션과 같으며, 개방할 포트를 지정하는 것

restart

컨테이너 실행 실패하는 경우 재시작 여부




11-2. 실습 : 로컬에서 mariadb , redis 컨테이너 띄워서 사용

11-2-1. Dockerfile 작성

mariadb

# /database/Dockerfile

FROM mariadb:10

ENV TZ=Asia/Seoul

redis

# /redis/Dockerfile

FROM redis:6

ENV TZ=Asia/Seoul

11-2-2. 도커 컴포즈 파일 작성

version: "3.8"

services:
  
  jar-docker-file-test-maria:
    container_name: /jar-docker-file-test-maria
    build:
      dockerfile: Dockerfile
      context: ./database
    image: zhyun/jar-docker-file-test-maria
    environment:
      - MARIADB_DATABASE=fc-pharmacy-directions
      - MARIADB_ROOT_PASSWORD=${SPRING_DATASOURCE_PASSWORD}
    volumes:
      - ./database/config:/etc/mysql/conf.d
    ports:
      - "3303:3306"  # localhost에서 3306 port 를 사용중이기 때문에 3303으로 접근

  jar-docker-file-test-redis:
    container_name: /jar-docker-file-test-redis
    build:
      dockerfile: Dockerfile
      context: ./redis
    image: zhyun/jar-docker-file-test-redis
    ports:
      - "6379:6379"

11-2-3. docker-compose 명령어로 컨테이너 띄우기

docker-compose -f docker-compose-local.yml up

컨테이너 동작 확인

docker ps


11-2-4. spring boot application.yml 에서 접속 정보 설정 후 어플리케이션 실행

# 실행 할 환경 정보 작성

spring:
  profiles:
    active: local
    group:
      local:
        - common
      prod:
        - common

---

# profile 설정 1 : common

spring:
  config:
    activate:
      on-profile: common

---

# profile 설정 2 : local

spring:
  config:
    activate:
      on-profile: local
  datasource:
    driver-class-name: org.mariadb.jdbc.Driver
    url: jdbc:mariadb://localhost:3303/fc-pharmacy-directions
    username: ${SPRING_DATASOURCE_USERNAME}
    password: ${SPRING_DATASOURCE_PASSWORD}

  redis:
    host: localhost
    port: 6379

  jpa:
    hibernate:
      ddl-auto: create
    show-sql: true

---

# profile 설정 3 : prod

spring:
  config:
    activate:
      on-profile: prod

profile
Hello velog! 

1개의 댓글

comment-user-thumbnail
2023년 7월 22일

글 잘 봤습니다.

답글 달기
Powered by GraphCDN, the GraphQL CDN