[배포 자동화 도전기 1/2] Docker 란 무엇일까? ( 개념편 )

BlackBean99·2022년 8월 16일
26

Docker

목록 보기
1/1
post-thumbnail

어플리케이션 배포 환경의 변화

기존의 배포방식의 문제점이 있었습니다. 서버에 OS , App, HardWare 모든 설정을 정해놓고 실행을 하면, 갑자기 서버가 불타버리거나 침수되거나, 해킹당하거나 하면 다른 컴퓨터에서 실행시킬 수가 없겠죠?

기존의 배포방식에 에 문제가 있어 이를 가상화 하기로 했습니다. 1개의 OS에서 1개의 환경에서 배포 환경이 정해진 것을 Wrapping하여 Hypervisor 를 사용하여 가상 컴퓨터를 여러 개 구동할 수 있게 되었죠. 이 두개의 가상환경은 서로 간섭하지 않아서 다중화되니 분산 처리를 할 수 있게 됩니다. 하지만 이 방법도 컴퓨터마다 가상환경을 일일이 다 설치해줘야 하기 때문에 힘들었죠.

그래서 나온 방식이 Container 방식의 배포입니다.

Container이란?

프로그램 구동을 위해 매번 OS 설치할 필요 없이
컨테이너는 기존 OS를 가상화 시키던 것과 달리 컨테이너는 OS Level의 프로세스를 격리시켜 동작하는 방식으로 이루어집니다.

그럼 Container 방식이 OS가상화 방식보다 좋나요? 꼭 그런건 아니구요
OS가상화는 컨테이너기반 가상화보다 더 높은 격리 레벨을 지원합니다. 이는 보안적인 측면에서 더욱 유리합니다.

그럼에도 불구하고 Docker를 쓰는 이유가 있죠
컨테이너 기반 가상화는 Docker 엔진 위에 Application 실행에 필요한 바이너리만 올라가게 됩니다. OS 가상화를 보면 Host OS와 완전히 분리되는 장점은 있지만 OS위에 OS를 올리기 때문에 무겁고 느릴수 밖에 없습니다. 하지만 컨테이너 기반 가상화는 Host OS 그리고 Docker 엔진위에서 바로 동작하며 Host의 커널을 공유합니다. 커널을 공유하게 되면 io처리가 쉽게 되어 성능의 효율을 높일 수 있습니다.

  • 성능향상
  • 뛰어난 이식성
  • 쉽게 Scale Out을 할 수 있는 유연성

이런 장점이 있어서 Container 방식중 하나인 Docker의 구성요소를 알아보겠습니다.

Docker 구성

1. Docker Image

Docker Image란 컨테이너를 실행할 수 있는 실행파일, 설정 값 들을 가지고 있는 것이라고 생각 하면 됩니다. 여러분들 프로젝트에 담겨있는 DB 설정, SpringBoot 개발환경 모두 Images로 담을 수 있다고 생각하면 되겠죠

그림과 같이 Image를 컨테이너에 담고 실행을 시킨다면 해당 프로세스가 동작하게 되는 것이죠.

Image 생성과정

이 그림을 잘 보면 Ubuntu 의 Base Image에 Nginx를 올린 것이죠. 그 올린 이미지 위에 우리가 개발한 Web App Source를 올려서 이미지를 생성합니다.
매번 ubuntu 와 nginx 를 새로 생성해서 올리는게 아니라 이미 만들어진 이미지에 Web App만 올려 Image를 생성하게 됩니다.

그럼 Image 를 실제로 만들어주는 DockerFile을 볼까요

2. DockerFile

배포할때 생성하는게 Shell Script라면 Docker Image를 생성하기 위해 만든 Script를 DockerFile이라고 생각하면 편합니다.

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

이런식으로 다양한 설정들을 포함하여 Docker Image 를 생성할 수 있습니다.

3. DockerHub

DockerHub란? 여러분들 프로젝트나 코드들 버전관리를 위해 GitHub를 사용하죠? Docker Image를 관리하기 위한 서비스라고 생각하시면 됩니다!
Docker Hub를 이용하면 손쉽게 imagepull 받아 컨테이너에 적용 시킬 수 있습니다.

GitHub랑 개념이 똑같습니다! 덕분에 저도 프로젝트에 적용시키는데 금방 익힐 수 있었어요!

DockerHub를 사용하려면 회원가입도 해야합니다 GitHub랑 똑같은데 코드가 아니라 개발환경의 버전관리 시스템이라고 생각합시다!


PS. Docker Image url 설정

다음은 Docker Image를 Pull받기 위한 url을 설정해줘야 합니다. 그림과 같이 앞에있는 url을 적지 않으면 default로 Docker Hub에서 Image를 pull 받게되고 url을 적어준다면 사설 저장소에서 이미지를 받을 수 있습니다. 사설 저장소는 개별 public 하지 않은 Docker Registry
라는 비공개적 격리된 저장소라고 생각하시면 됩니다.


조심할 점

하지만 Ip를 url로 설정하지 마세요!
동일 Host상에 다른 Container 간의 통신은 Private IP로 통신을 합니다
Container 의 IP는 언제든 바뀔 수도 있기 때문이죠.
그래서 ip기반이 아니라 --link 옵션을 통해서 run (실행) 을 시켜야 합니다.

docker run -d --name project --link mysql httpd
docker run 을 이용해 webe02 container를 띄울때, --link 옵션을 이용해 mysql container 와 link를 맺을 것을 설정한다. 이렇게 설정하면, project containermysql container 를 IP 가 아닌 container의 이름을 이용해 통신할 수 있다. 

Docker 사용 명령어 관련해서는 다음 포스팅에 올려드리겠습니다!!

Docker Archetecture

Build & Deployment Script

./gradlew build -x test
cd build/libs
rm -rf tcono-0.0.1-SNAPSHOT-plain.jar
cd ../..
sudo docker login
sudo docker build --build-arg DEPENDENCY=build/dependency -t {DockerId}/{containerId} {배포 dir}
sudo docker push {DockerId}/{containerId}
sudo docker run --cap-add=NET_ADMIN -it -p 8080:8080 {DockerId}/{containerId}:commitMessage

위는 제가 SpringBoot 프로젝트를 배포할때 사용한 배포 Script입니다. 이 플로우로 Docker Archtecture를 이해해봅시다!

0. project build

./gradlew build -x test
test를 돌리지 않고 빌드하는 코드입니다. 빌드를 해서 jar 파일을 생성합니다.

0-1. plain jar을 지우기.or 안생기게 설정하기

저는 초기에 이 세팅을 몰라서 스크립트에 매번 plain을 지워줬답니다.. 바보..

plain이 붙어있는 jar은 실제 코드가 담겨져 있지 않은 jar입니다.
따라서 build.gradle 에 jar { enabled = false } 을 추가해줘야 2개의 jar파일이 생성되지 않아요.

1. Docker Login

GitHub에서 git config --global user.email {email} 이런식으로 업로드 하기 위해 로그인 설정을 하는 것처럼 docker login 하면 Docker 에서 로그인을 합니다 pull 이나 push 하기 전에 필요한 절차이죠.

2. Docker build

Docker build --build-arg DEPENDENCY=build/dependency -t {DockerId}/{containerId} {배포 dir}
설정을 추가하긴 했는데 --build-arg DEPENDENCY 를 통해 dependency를 제 project 의 dependency와 맞춰 Docker Image를 여기서 생성합니다.

3. Docker push

docker push {DockerId}/{containerId}
DockerHub에 생성한 Docker Image를 push합니다.

4. Docker run

docker run --cap-add=NET_ADMIN -it -p 8080:8080 {DockerId}/{containerId}:commitMessage
run을 통해 현재 Container위에 있는 이미지를 실행시킵니다. 배포를 하는 것이죠.

5. Docker pull

docker pull Docker Hub에 올려둔 Docker Image를 가져올 수도 있습니다!

바로 이해가 가진 않을 수 있지만 DockerHub가 GitHub의 동작과정과 매우 유사하다는 점을 상기시키며 이해해봅시다!!

다음엔 Docker 활용법 및 Kubernatis를 공부해보겠습니다 빠셍!!

Reference

출처:

profile
like_learning

1개의 댓글

comment-user-thumbnail
2022년 8월 25일

This is a recent up-and-coming actress right? I really like her, there is a dolphin in tunnel rush she must really like it.

답글 달기