Docker란 무엇인가

Terror·2024년 9월 22일
0

등장 배경

  • docker라는게 왜 생기게 됐는지 이유를 먼저 알아보자
  • 우리의 간단한 프로젝트를 실행시키기 위해서는 부가적인 프로그램들이 필요합니다
  • 대표적으로 mySql을 꼽을수있는데, 맨처음 설치할때 꽤나 번거로웠고, 설치하는데 익숙해졌어도 설정하는건 매번 귀찮습니다
  • 요즘은 모놀리틱 아키텍처(한곳에 몰아서 사용하는 서버)보다는 MSA(서버 분산환경) 환경을 많이 선호하고 있습니다

  • 사용자들이 많아지고, 이것을 하나의 서버에서 전부 감당하면 부하가 심하기 때문에 분산환경으로 처리해야함을 필수이다
  • 그리고 여러개의 서버를 배포할때 각각의 컴퓨터마다 일일히 mysql설치하고, 이것저것 세팅하면 얼마나 힘들겠는가
  • 이래서 생겨난것이 "Docker" 이다

컨테이너

  • 컨테이너 개념을 서비스하는 정말 많은 서비스가 있지만, 그 중 대표적으로 사용되는것이 docker이다
  • 컨테이너란 어플리케이션에 필요한 환경설정들을 모아서 패키징하고, 이를 다른 컨테이너와 독립된 환경에서 실행 할 수 있도록 하는 기술입니다

뭔 갑자기 컨테이너개념?

  • 이런 개념들은 갑자기 생기는 것이 아니라, 보통 이전에 있었던 개념을 사용하다 활용되는 부분들이 있다

  • 컨테이너 개념 등장 이전에 Linux에서 이와 관련된 개념을 사용하고 있었는데 그것이 "커널 네임스페이스","cgroups"가 있었다

  • 이 개념들은 어플리케이션을 서로 독립적으로 격리된 환경에서 실행할 수 있게 해주는 것이고, 이를 활용해서 만든 서비스가 docker 이다

  • 그래서 모든 도커는 "Linux 운영체제에서 동작" 합니다

    Linux ?
    서버개발, 클라우드, DevOps 분야에서 많이 사용됩니다
    오픈소스이고 커스터마이징이 가능하여 개발자들이 선호합니다
    특히 우분투(ubuntu) 같은 배포판이 많이 사용됩니다
    macOS: 특히 IOS앱 개발자나 디자인과 관련된 작업을 하는 개발자들이 많이 사용합니다, macOS는 "유닉스 기반"이라 터미널을 통해 리눅스와 유사한 개발 환경을 제공합니다
    윈도우: 윈도우에서만 지원되는 소프트웨어 개발이나, 게임 개발에 많이 사용됩니다, 최근에는 WLS로 리눅스 환경도 지원하여 더많은 개발자들이 윈도우를 사용하고 있습니다

  • 우리는 지금 Docker를 윈도우든,맥북이든 바로 깔아서 사용 가능합니다

  • 그것은 어떤 OS든 "리눅스 커널" 이라는 서비스를 가상화 시켜서 시행하기 때문입니다

  • 따라서 도커를 설치하면, 도커에서 알아서 리눅스 커널을 가상화하여 기반을 만들어주기때문에 편하게 사용하기만 하면된다

어디서든 돌아가게 해주는거..? 이거 Java에서 봤는데

  • 맞습니다 바로 "JVM"입니다
    • JVM은 "자바 애플리케이션"이 "OS와 상관없이" 실행될 수 있도록 "중간 레이어" 역할을 합니다
    • 이를 통하여 자바 프로그램이 다양한 플랫폼에서 호환됩니다
    • docker와 언뜻보면 비슷해보이지만, JVM은 "프로그램 실행 환경을 가상화" 하는것이고, docker는 "운영체제 자체를 가상화"를 한다는 차이가 있습니다

  • 가상머신은 OS를 독립적으로 사용하는 반면, 컨테이너는 운영체제를 공유하여 docker에서 처리되고 있는 모습이다

Docker 이미지 ?

  • 그럼 docker의 재미없는 역사에 대해서 알아보았다
  • 결국 docker는 개발환경을 자동으로 세팅해주는 좋은 친구인걸 알았다, 그럼 Docker 이미지라는게 무엇인가?
  • 나의 스프링버젼은 3.3.1이고, Java는 17버젼, MySql은 8버젼을 사용하겠다
  • 라는 식으로 어떤 환경으로 셋팅할건지 "저장"하여 가지고 다니는 개념이다
  • 도커는 이렇게 만들어진 도커이미지를 실행시키는 "View" 역할이다
  • 동영상 파일은 도커이미지
  • 동영상을 실행시키는것이 도커
  • 정도로 인식하면된다

Docker File

#!/bin/bash

# base 이미지 설정
FROM openjdk:17-jdk-slim

# jar 파일을 컨테이너 내부에 복사
COPY build/libs/*.jar app.jar

# 외부 호스트 8080 포트로 노출
EXPOSE 8080

# 실행 명령어
CMD ["java", "-jar", "app.jar"]
./gradlew build -> 스프링에서 서버를 실행할 수 있는 jar 파일을 만들어줌
docker build -t {원하는 테그 이름} .
docker run -d -p 8080:8080 --name {원하는 컨테이너 이름} {테그 이름}

Docker compose

  • 1개 이상의 도커이미지를 하나의 어플리케이션으로 관리 할 수 있는 도구입니다
  • docker-compose를 사용하면, 여러 서비스를 포함하는 (spring,redis,mysql) 애플리케이션을 손쉽게 실행할 수 있습니다
version: '3'
services:
  service1:
    image: "이미지_이름"
    ports:
      - "호스트_포트:컨테이너_포트"
    environment:
      - "환경변수1=값"
    volumes:
      - "호스트_디렉토리:컨테이너_디렉토리"

  service2:
    build: .
    depends_on:
      - service1
    ports:
      - "호스트_포트:컨테이너_포트"

Docker hub

  • docker image들의 저장소, 코드의 저장소인 github과 같은 느낌이다
  • 여기에 큰 회사들은 거의 본인들의 서비스를 이미지로 만들어서 공유하고있습니다
  • 물론 내가 만들고, 커스텀한 이미지도 올리거나 다운로드가능합니다

Docker Layor

  • 위에서 Docker hub은 github과 비슷하다고 하였는데
  • 우리가 github에 올린 프로젝트를 수정하고, 저장하고 싶을 땐 commit & push를 합니다
  • 그 다음, 프로젝트를 최산화하거나, 원격저장소에 있는 내용을 내려받고 싶을때는 git pull을 합니다
  • 자 생각해보자, 그럼 docker로 Spring Boot 이미지를 만들고, 애플리케이션을 실행한다고 하였을때
  • (’스프링 버전 3.3.1을 사용할 것이고 자바는 17 버전을 사용할 것이고 Mysql은 8 버전을 사용하겠다 ‘)
  • 이런 설정을에서, 코드가 수정될때마다 스프링을 다시받아야할까요, 자바를 다시 받아야할까요

컨테이너 오케스트레이션

  • 컨테이너로 개발환경은 자동화 시켰지만, 컨테이너가 너무 많아서 켜져있는지 꺼져있는지 확인하기 어려워서 생긴개념이 컨테이너 오케스트레이션 이다

Docker Volume

  • 도커는 휘발성 데이터를 관리하는 경향이 크기때문에, 컨테이터 데이터를 "영구적"으로 저장하고 싶을때 사용하는것이 도커 불륨이다
dokcer run -v redisinsight:/db -p 8001:8001 redislabs/redisinsight
redisinsight:/db
// 앞에있는거 : 뒤에 있는거
// 내 컴퓨터 도커 말고 내 컴퓨터에 어떤 저장 파일을 만들건지
// -> (앞에 있는거) 내 컴퓨터에 redisinsight 라는 이름의 폴더를 만들겠다
// -> (뒤에 있는거) 컨테이너 안에 어떤 값을 저장할것인지
// 호스트의 redisinsight 폴더를 도커 컨테이너의 /db 디렉터리에 마운트하겠다는 뜻

실제로 한번 사양해보자

  1. 도커 설치를 한다
  2. docker hub에서 redis 이미지를 다운로드 받아보자
docker pull redis

  • 열심히 다운로드 받아진다

    혹시 윈도우 11인데 안되는사람은, 도커 데스크탑 업데이트 하길 권장한다

  • 도커 이미지에도 잘 있는 모습이다
docker images

  • 내 로컬 컴퓨터에 어떤 이미지를 갖고있는지 알 수 있다
  • redis를 한번 실행시켜보자
docker run -it  -d --rm -p 6379:6379 redis:6.2

// 뜻
docker run : 컨테이너를 실행시켜라
-it : 실행중인 컨테이너의 터미널 접근을 가능하게 해라
-d : 컨테이너를 백그라운드에서 실행시켜라
--rm : 컨테이너가 종료되면 시스템에서 컨테이너를 자동으로 제거해라
-p : 컨테이너 포트를 6379로 지정해라
     호스트_포트:컨테이너_포트
(redis:6.2에서 버젼 생략하면 최신버젼으로 긁어옴)
(내 컴퓨터의 6379 포트로 연결하면, 컨테이너에있는 6379 포트와 연결해줄게)


  • 도커 컨테이너에서 잘 실행되는 모습이다
  • 그다음 현재 실행중인 컨테이너의 정보를 확인해보자
docker ps

  • 음 잘나오는것을 볼 수 있다
  • 다음은 실행중인 컨테이너에 접근해보자
  • docker ps를 입력하면 컨테이너의 ID가 조회된다
  • 다음과 같이 입력해보자
winpty docker exec -it 56849b131c56 redis-cli -p 6379

docker에
exec 접속하겠다
-it 뒤에 나올 컨테이너에
56849b131c56 이것에 접속하는데
redis-cli 명령어를 입력할거야
-p 들어갈 포트 설정해주기

  • 잘 들어가지는 모습이다 (윈도우 11환경에서는 왜인지는 모르겠는데 winpty 붙이라고해서 붙였다..)
  • 명령창에 ping을 입력했을떄, pong이 응답되는 모습을 볼 수 있다

마치며

  • 도커 이미지는 컨테이너가 종료되면 그 안에 이미지들도 사라지는 휘발성이 강하다
  • 그래서 영구적으로 저장시키기 위한것이 docker volume이다
  • 도커 컨테이너는 독립적인 환경에서 독자적으로 실행된다 (내컴퓨터에 있는 포트와, 컨테이너에 있는 포트는 서로 다르다)

정리

  • 도커란? OS에 상관없이 프로그래믈 실행시키게 해주는것
  • 도커 이미지란? 환경 설정들을 공통적으로 편하게 해주기위해 미리 만들어놓은것
  • 도커 컨테이너란? 도커 이미지를 실행시키는것
  • 도커 파일이란? 도커 이미지를 어떻게 생성할지 설정하는곳
  • 도커 허브란? 도커 이미지들을 모아둔곳 (깃헙같은곳,끌어와서 쓸수도있음)
  • 도커 컴포즈란? 1개 이상의 도커 이미지를 어플리케이션으로 관리 할 수 있는 도구
  • 도커 레이어란? 만약 a이미지,b이미지,c이미지가 있을떄 b이미지에 변경사항이 있고 다시 도커 이미지화 시키면 a,c는 그대로니까 이전 리소스를 그대로 이용하고, b만 변동된다는 뜻이다
profile
테러대응전문가

0개의 댓글