Today
-
Yesterday
-
Total
-
  • 도커 Docker 🐳
    OS/Ubuntu 2023. 12. 9. 00:01

    보고 배운 인강

    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 설치를 진행한다.

    귀여운게 생겼닼ㅋㅋ

    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

    #### ![](XChangeXChangeXChangeXChangeXChangeXChangeXf1595feb-98d0-4ffb-aeb8-b266333a7413-)
    
    
    <br/>
    
    #### 2. hub.docker.com 무료 플랜 가입 및 로그인
    https://hub.docker.com
    
    <br/>
    
    #### 3. docker compose 설치
    docker compose 는 `Mac` 또는 `Windows` 의 경우
    
    `Docker desktop` 을 설치한 경우라면 
    
    docker compose 설치를 진행할 필요가 없으며, 
    
    `Linux의 경우 추가적으로 docker-compose 설치가 필요하다.`
    
    #### ubuntu 22.04에 docker compose 설치
    ```bash
    # 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

Designed by Tistory / Custom by 얼거스