2024.09.26.목.TIL Docker

김기남·2024년 9월 26일
post-thumbnail

안녕하세요, 오늘은 Docker 에 대해 정리해 보았습니다.

개요

💡 내 컴퓨터에서 Application을 만들기 위해서는 운영체제에 여러 소프트웨어를 설치해야 한다. 우리가 만들고있는 Web Application이라면 Web Server, Database 등이 필요하다. 하지만 여러 Software를 설치하는 작업은 아주 까다로운 작업이다.

예시 1.

  • Web Application을 위해 다양한 Software를 준비하는 상황

  • 설치 전문가가 서버 컴퓨터를 구비하고 적당한 OS를 설치하여 각각의 Software들을 설치해준다면?
    1. OS위에 Web Server가 설치된 컴퓨터 제공
    2. OS위에 Database가 설치된 컴퓨터 제공
    • 전문가의 손길이 닿았기 때문에 잘 실행되는건 당연지사
  • 참고
    • AWS와 같은 Cloud Service의 경우 위의 서버 컴퓨터들을 빌려준다.

  • 개발자가 만든 Web Application이 Network 통신으로 만들어진 Software를 사용할 수 있다면?
    • 개발자는 Web Application만 만들면되니 엄청나게 편리해진다.

하지만, 위와같은 방법을 채택하면
컴퓨터 3대가 필요하고 그만큼 비용이 증가하게 됩니다.
그럼 어떻게 이 문제를 해결해야 할까요?

가상 컴퓨터

  • 하나의 컴퓨터에 가상으로 컴퓨터를 만든다면?

    • 가상 컴퓨터에 OS와 필요한 Software들을 설치한다.
  • 위와같은 방식을 채택하게되면 추가적으로 컴퓨터를 구매하지 않아도 됩니다.

  • 대표적인 예시로 VMware, VirtualBox 가 위와같은 원리로 동작한다.

    • 사용해보신분 있으면 이해가 쉬우실거에요!

OS 즉, 운영체제는 아주 거대한데
하나의 DB, 하나의 Web Server를 위해 운영체제 위에 또 운영체제를 설치하니
실행속도 또한 아주 느려지는 현상이 발생한다.
불편함을 참지 못하는 개발자들은 이 문제를 Container로 해결하였다.

Container

  • 한대의 컴퓨터 안에서 각각의 Software를 실행시키는 방식

    • OS가 설치된 컴퓨터는 주인의 의미를 가진 HOST 라고 칭한다.
  • 각각의 Software는 격리된 환경에서 실행된다.

    • HOST에서 실행되는 격리된 각각의 실행환경을 Container 라고한다.
  • 각각의 Container에는 OS 전체가 설치되어 있는것이 아니다.

    • App을 실행하는데 필요한 라이브러리, 실행파일만 가지고 있다.
  • OS는 이미 HOST에 존재하는 OS를 Container와 서로 공유한다.

    • 운영체제가 하나인 만큼 속도가 느려지지 않는다.
    • 저장장치 용량을 아낄 수 있다.
  • 우리가 많이 사용하는 Linux OS는 이러한 Software 실행방법이 내장되어 있다.

    • 이 기술을 Container 라고 말한다.

Docker

💡 Docker는 컨테이너 기술을 이용한 소프트웨어 중 압도적인 점유율을 가지고 있다.

  • Docker의 사전적 의미 : 부두에서 컨테이너를 다루는 노동자
  • 아래 본문에서 Docker를 어떤 경우에 사용하는지 알아보자

환경의 불일치

  • 예시상황

    1. 개발자의 컴퓨터는 Window OS를 사용한다.
    2. 실제 운영되는 서버는 Linux OS를 사용한다.
  • Docker는 이러한 환경 불일치 문제를 해결해준다.

    • Docker는 서로 다른 환경에서도 같은 환경을 구현할 수 있도록 만들어준다.

  1. 개발자 Window 환경에 Docker를 설치한다.
  2. 서버의 Linux 환경에 Docker를 설치한다.

Docker File

  1. Docker File을 만들고 여기에 구현하고 싶은 환경을 설정

    • ubuntu, git, python 등등..
  2. 만들어진 Docker File을 서버와 개발자 모두에게 준다.

  • 각 환경에 설치된 Docker가 Docker File을 읽는다.
  • Docker File에 설정된 정보를 기반으로 필요한것들을 다운로드 받는다.

  • 즉, 설정한 환경과 같은 Virtual Container(가상 컨테이너, 예시는 Ubuntu)를 만든다.

    • 서버에 필요한것들을 모두 다운로드 받는다.
  • 최종적으로 개발자가 서버에 DockerFile과 함께 코드를 업로드하면 두 환경 모두에서 잘 작동된다.

  • 컨테이너는 각각 독립적으로 존재하고 동작한다.

    • 하나의 서버에 각기 다른 수많은 컨테이너를 가질 수 있다.
    • ex) Java 컨테이너, Python 컨테이너, MySQL 컨테이너 등등..

  • Docker 덕분에 다양한 컨테이너들을 쉽게 관리할 수 있다.
    • Java 컨테이너에 부하가 발생하면 Java Server를 늘리는것에도 매우 용이하다.
    • 단순히 컨테이너 개수를 늘리면 된다.
    • 부하가 줄어들면 다시 컨테이너 수를 줄이면 된다.

  • Docker 덕분에 새로운 서비스를 만들때마다 새로운 서버를 사거나, 설정할 필요가 없어졌다.

정리

  1. 원하는 개발 환경을 DockerFile로 만든다.
  2. Docker는 어떠한 환경에서도 DockerFile로 만들어놓은 동일한 환경을 구축해준다.
  3. 구축된 환경들은 컨테이너로 독립적으로 존재한다.
    1. 어떠한 환경이여도 모듈식으로 편리하게 관리할 수 있다.
    2. Java, DB, Node.js 등 환경별로 서버를 추가로 살 필요가 없어졌다.
  4. 모든 독립적 운영이 Docker 하나로 가능해진다.
  5. 개발자는 앞으로 원할때마다 docker를 통해 동일한 환경을 생성할 수 있다.

Docker 사용

💡 Docker를 실제 사용하는 사례와 함께 어떻게 써야하는지 더 자세히 알아보자.

예시

  • 소프트웨어 설치 기사에게 사장님이 A회사에 가서 설치해! 라는 일을 준다.

  • 오랜 시간동안 시스템을 구축하기 위해 다양한 부품(DB, JAVA 등등..)들을 사용하여 구축을 완료했다.

  • 완전히 같은 시스템 구축을 B 회사에도 되도록 요청한다.

  • 너무나 비효율적이다!

정리

  1. Server를 운영하기위해 환경을 구축하는것은 아주 복잡한 일이다.

    1. 언어, Web Server, DB, CI/CD 등..
  2. 실제로 서버를 운영해보면 더 좋은 서버로 옮겨가는 경우가 발생한다.

    1. 하드웨어 성능이 더 뛰어난 서버로 옮기는 경우. Scale Up
  3. 증가한 트래픽에 따라 서버를 확장시키는 경우도 발생한다.

    1. 완전히 같은 환경의 서버를 여러개로 늘리는 경우. Scale Out
  4. 이때마다 처음부터 새로 서버를 구축한다면..?

    1. 일 안한다. 굉장히 골치아픈 일이다.
    2. 어딘가 하나라도 잘못 설치 되었다면..?
  5. 같은 서버에 여러 서비스를 운영하는 경우

    1. 기존 서비스 : Java 8 환경
    2. 새로운 서비스 : Java 17 환경
    3. 정상적으로 동작하게 하기위해 맞출것이 너무 많다..!

바로 이런 상황들에서 Docker는 깔끔하게 문제들을 해결해준다.

Docker Image, Docker Hub

  • Docker Image는 공식적으로 제공하기도 한다.
  1. 부품들이 설치된 그 상태로 문서처럼 사본(Docker Image)으로 저장한다.

    1. 부품 하나하나 사본으로 만들 수 있다.
    2. 전체 구성 자체를 사본으로 만들 수 있다.
  2. 한번 저장된 사본(Docker Image)들은 언제든지 재사용할 수 있다.

    • 만들어진 Docker Image는 Docker Hub라는 저장소에 저장된다.
  3. 만들어진 사본을 그대로 다른곳에 설치할 수 있다.

  • 마치 Cloud Service를 사용하는것처럼 어디서든 Docker Image를 다운받을 수 있다.

Docker Container

  • Docker는 Docker Image로 부터 각각의 독립된 가상 공간인 Container로 Image를 복원한다.

  1. 서로 다른 환경이 필요한 서비스들도 Container에서 독립적으로 동작하기 때문에 서로에게 영향을 주지 않음
  2. Container는 실행 환경만 독립적으로 동작하도록 한다.
    1. 컴퓨터에 직접 설치한것과 별 차이없는 성능을 발휘하도록 만들어준다.

  1. 팀 프로젝트시 로컬 환경설정이 각각 다름
    1. Git으로 application.yml 과 같은 설정 파일을 공유한다.
    2. 각각의 컴퓨터에 세팅된 DB 정보가 달라서 정상적으로 동작하지 않는다.
    3. Docker를 활용하여 Local DB 환경을 통일시킬 수 있다.

Docker 를 사용하기 위해 알아야하는 키워드


  1. DockerFile - 만드는법
  2. Docker Image - 만드는법
  3. Docker Container - 만드는법
  4. Docker Hub - push, pull 하는법
  5. CI/CD - Docker를 활용하는 방법
  6. Docker Compose - 꼭 봐야할 키워드
  7. Docker Network - 서로다른 Container끼리 통신하는 방법
  • Docker 공식 홈페이지

Docker: Accelerated Container Application Development

오늘의 코드카타

class Solution {

    public String solution(String my_string, String alp) {
        String answer = my_string.replace(alp, alp.toUpperCase());

        return answer;
    }
}
public class Main {

    public static void main(String[] args) {

        Solution solution = new Solution();

        System.out.println(solution.solution("programmers","p"));
        System.out.println(solution.solution("lowercase","x"));
    }
}

특정한 문자를 대문자로 바꾸기

profile
새로운 시작~!

0개의 댓글