티스토리 뷰

반응형

도커란 개발 시 application을 쉽고 빠르게 구축, 공유 및 실행할 수 있는 소프트웨어이다. 만약 프로젝트 시작 시, 환경설정부터 기본 세팅을 해야 한다. 하지만 도커를 사용하면 프로젝트마다 반복되는 세팅을 할 필요가 없다. 이러한 도커에 대한 기초에 대한 총정리를 아래의 글을 통해 풀어볼까 한다. 가능한 전부를 담기위해 노력했고 계속 업데이트 중이다. 이 글을 통해 도커 초급을 졸업하자. 

 

 

 


 

0. 도커의 탄생

도커란, 컨테이너 기반의 오픈소스 가상화 플랫폼이다. 실행환경을 컨테이너라는 것을 활용하여 추상화하여 동일한 인터페이스를 제공하기 때문에 프로그램의 배포 및 관리를 단순하게 해 준다. 사실 도커 이전의 개발자들은 개발 시 코드를 수정했을 때, 내  PC에서는 잘 돌아가지만 다른 PC에서는 에러가 생기는 경우를 많이 경험했을 것이다. 이러한 인프라의 가변성에 대한 문제는 항상 존재한다고 할 수 있다. 이러한 문제는 Docker가 나오면서 해결이 됐다고 할 수 있다. 

 

즉, docker가 다루는 근본적인 문제는 개발을 시작하기 위한 서버 셋팅에서 시작된다고도 할 수 있다. 기본적으로 자체 서버를 운영하려면 다음과 같이 복잡한 순서를 따라야 한다.

 

0.1. 자체서버운영

도커가 없는 시기에는 아래와 같은 프로세스를 통해 서버를 설치하고 운영하였다.

  1. 용량 산정
  2. 서버 구매
  3. IDC 입고
  4. Network 연결
  5. OS 설치
  6. SW 설치
  7. 운영 관리
  8. 실시간 감시

위의 내용은 디테일하게 알 필요는 없고, 많은 시간과 리소스가 들어간다. 그리고 상태 관리를 하기 위해서는 하나하나 명령어를 쳐서 수행을 해야 하고, Human Error가 언제든 발생 가능하는 문제점이 있다. 이러한 자체 서버 운영에 대한 어려움 때문에 서버를 안정적이고 용이하게 변경하기 위해 아래와 같이 발전을 하게 된다.


자체서버운영 -> 설정관리도구 -> 가상머신 -> 클라우드 -> PaaS -> Docker -> Kubernetes

자체서버운영부터 발전하는 과정을 간단하게 이해해 보자.

 

 

0.1.1. 설정 관리 도구

CHEF, PUPPET 등으로 서버의 상태를 기술한 코드 파일로 서버의 상태를 관리하는 방식이다. 서버의 상태를 모아서 파일로 한 번에 기술하기 때문에 빠르고, 비용 및 리스크가 절감될 뿐만 아니라 서버의 상태를 재현하는 것도 용이해졌다. IaC(Infrastructure as Code)로 코드가 인프라 관리가 가능하다고도 할 수 있다.

 

 

0.1.2. 가상 머신

가상 머신은 설정 관리와 같이 나왔다. 쉽게 말하면 물리적 머신을 가상화시켜 가상의 머신을 구성하는 방식이다. 물리적 머신 위에 OS를 설치, OS 위에  Hyper-v 설치, 그 위에 여러 다른 OS 설치, 각각의 설치된 OS마다 다양한 실행환경 돌리기 가능하게 구성된다. 따라서 하나의 물리 머신을 여러 대의 가상 머신으로 나누어 다양한 버전의 SW 설치가 가능해진다. 그리고 이때, 가상 머신을 이미지 형태로 저장이 가능하기 때문에 이미지 기반으로 동일한 상태를 가진 서버 구축이 가능해졌다고 할 수 있다. 이를 변하지 않는 인프라로 Immutable Infrastructure라고도 한다. 일회용 종이컵처럼 서버의 상태가 변경 시, 서버를 변경하지 않고 삭제하고 새롭게 서버를 만드는 개념이다. 이러한 개념은 가상 머신에서 처음 등장했고, 앞으로 나올 도커에서 꽃을 피우게 된다. 

 

 

0.1.3. 클라우드

클라우드가 나오기 전까지는 자체 서버 운영에 적혀있는 용량 산정, 서버 구매부터 실시간 감시에 이르는 모든 과정을 진행했어야 했다. 이러한 비용과 시간이 많이 드는 서버 설치를 안 하기 위해 나온 것이 클라우드라고 생각해도 좋다. 즉, 서버 설치와 같은 IT 자원에 대한 관리는 AWS가 전담하고 기업들은 핵심 비즈니스에 집중할 수 있게 하는 컨셉이 클라우드이다. 기본적으로 amazon, microsoft, google(알파벳 A), naver 등과 같은 기업들이 지원을 하고 있다.

 

클라우드의 가장 큰 장점은 초기 비용(매몰비용)이 없고 서비스 이용하는 필요한 만큼만 비용이 들어간다. 가상 환경이기 때문에 이미지 기반으로 서버 관리가 가능하다. 이미지만 있으면 동일한 서버를 쉽게 만들기가 가능하다. 추가적으로 유기적 확장이 가능하다. 만약 오늘 선착순 티켓팅이 있어서 트래픽이 몰린다면, 마우스 몇 번만 클릭을 하면 트래픽이 몰리는 시간대에만 서버 확장이 가능하다. 하지만 인프라의 가변성이 존재는 하기 때문에 서버 구축은 쉽게 가능했지만 application은 항상 같은 환경에서 실행은 힘들다. 이러한 문제를 해결하기 위해 나온 개념이 컨테이너다.

 

 

0.1.4. 컨테이너

컨테이너는 외부 환경으로부터 격리된 공간에서 프로세스가 동작하는 기술이다. 이는 application을 표준화 되게 패키징하여 동일한 방법으로 배포가 가능하게 한다. 컨테이너 자체를 가상화 기술 중 하나로 생각할 수도 있다. 하지만 컨테이너는 호스트에서 다수의 게스트 OS를 구동할 수 있도록 하드웨어를 가상화하는 소프트웨어인 hypervisor를 포함하지 않기 때문에 다양한 장점이 존재한다. 간단히 호스트인 infrastructure(=AWS EC2)를 설치하고 위에 도커만 설치 하면 된다. 그러면 도커 위에 다른 OS 설치 없이 process 만으로 실행이 가능하다. 자세한 내용은 여기를 눌러 참고하자.

 

 

1. 도커란

dotCloud라는 회사가 2013년도에 오픈소스를 공개하면서, Docker.Inc로 사명을 변경하면서 도커라는 회사가 생겼다. 도커는 컨테이너 기반의 기술이다. 쉽게 말하면 컨테이너에 기술을 넣으면, 모든 기술들의 실행 방법이 다 같아진다. 이러한 방법을 리눅스에서도 cgroups. navespaces, libcontainer 같은 모듈로 컨테이너 기술을 사용 가능하지만, 너무 어렵다. 그래서 도커를 추천하고 많이 사용한다. 따라서 세팅, 운영과 배포 시 사실상 Docker가 필수인 시대가 되어가고 있다.

 

Docker만 설치되어 있다면, OS와 CPU에 상관없이 컨테이너를 사용 가능하다. 즉, Spring, Nodejs, Django, Nextjs 등등에 관련 없이 컨테이너에만 넣으면 모두 동일하게 실행이 가능하다. 이때 주의해야 할 점은 컨테이너를 삭제하면 내부의 데이터가 모두 삭제되기 때문에 주요한 데이터는 외부 스토리지에 저장이 필요하다.

 

조금 더 욕심을 내보자. 도커와 함께 자주 나오는 용어인 오케스트레이션, Docker Swarm, Kubernetes에 대해 조금 더 알아보자.

 

 

1.1. 컨테이너 오케스트레이션(Container Orchestration)

컨테이너 오케스트레이션의 대표적인 예는 kubernetes로 여러 대의 서버와 여러 개의 서비스를 관리하여 자동화하는 기술이다. 소분류로는 스케줄링, 서비스 디스커버리, 모니터링, 로깅 등등이 있다.

 

스케줄링

- 이름과 비슷하게 컨테이너를 스케줄링해서 가상 머신에 배치하는 역할을 한다. 배치 시 컨테이너 스택에 매칭 되는 가상 머신을 자동으로 선택하고, 문제 발생 시 자동으로 다시 배치를 한다고 할 수 있다.

 

서비스 디스커버리

- 수많은 컨테이너들이 생성과 종료를 반복한다. 이때 매번 IP, Port 정보를 알 수가 없기 때문에 이를 자동으로 매칭 한다.

 

 

1.2. Docker Swarm

Docker Inc에서 만든 컨테이너 오케스트레이션 tool로 기능이 단순하여 쉽게 사용 가능하다. 하지만, 대용량 분산 환경과 같은 복잡한 시스템에서는 적합하지 않아서 Kubernetes(쿠버네티스)를 많이 사용한다.

 

1.3. Kubernetes

Google Inc이 개발한 컨테이너 오케스트레이션 tool로 대규모 분산 환경에 최적화된 기능을 제공한다. 넓은 생태계가 구축이 되어 있기 때문에, 사실상 컨테이너 오케스트레이션에서는 표준이라고 해도 된다. 너무 많이 사용되기 때문에, 관련된 내용은 추가로 정리하도록 하겠다.

 

 


 

2. 도커 기초 개념

앞에서 설명한 것과 같이 기본적으로 도커는 Immutable Infrastructure 패러다임을 실현하는 기술이다. 따라서 서버 구축 후에는 변경이 불가능하다. 변경이 필요하다면 삭제 후 다시 구축을 한다. 이러한 컨셉은 모든 서버가 항상 동일한 상태임을 보장해 줄 수 있고, 환경 세팅에 어려움을 없애준다.

 

도커의 큰 cycle을 보면 git과 어느 정도 비슷하다고 할 수 있다. Dockerfile을 빌드를 해주면, DockerImage가 생긴다. 이 DockerImage를 push 하면 Repository로 들어간다. 그리고 필요한 서버에서 pull 받아서 실행하면 된다. 

 

도커 개념을 Image, Container, Dockerfile, Registry 용어를 통해 조금 더 알아보자.

 

Image - image는 프로그램이라고 생각하면 된다. image layer들의 집합으로 image를 만들기도 가능하다. 읽기만 가능(read-only)하고 immutable 하다. 

Container - container는 프로세스라고 생각하며 된다. 쓰기가 가능하며, 휘발성으로 메모리에 상주한다.

Dockerfile - instruction set으로 도커 이미지를 만드는 설명서라고 생각하면 좋다.

Registry - github과 같은 이미지 저장소이고 대표적인 public registry으로 DockerHub가 있다.

 

 


 

3. 도커 설치

기본적으로 도커는 GUI와 CLI 설치가 있다. 둘 다 설치해보자. window는 GUI로 하고, AWS EC2 우분투는 CLI 설치를 진행해 보자. 현재 GUI를 상업적으로 이용하면 유료긴 하지만, 개인 프로젝트 사용 시 별 관계없으므로 아래의 url에서 GUI를 설치하면 된다.

 

3.1. 도커 GUI window 설치(Docker Desktop)

 

https://docs.docker.com/get-docker/

 

Get Docker

 

docs.docker.com

 

\

위에서 운영체제에 맞게 설치를 하면 된다. 만약 2020년 이전에 산 노트북이라면 가상화 설정을 해줘야 한다.

 

 

위와 같이 가상화 부분이 사용인지 우선적으로 확인을 하자. 그러나 설치하고 실행해보면, 

 

 

Docker Desktop stopping이라고 뜨면서 안 돌아간다. 그 이유는 WSL을 설치하지 않아서 그렇다. 가상 환경을 위한 WSL 설치를 아래를 참고해서 진행하자.

 

[WSL 2 기초 개념] WSL은 무엇인가

 

[WSL 2 기초 개념] WSL은 무엇인가

WSL은 Windows Subsystem for Lunux의 줄인말이다. 쉽게 말하면, Window에서 Linux처럼 사용하겠다는 이야기이다. 보통은 Virtual Machine으로 셋팅을 해야 Linux를 사용할 수 있었다. 그러나 우리는 WSL을 통해..

han-py.tistory.com

 

위의 url을 참고해서 version 2로 세팅을 하고 Ubuntu 20.04 LTS를 추가로 설치해서 실행하면 Ubuntu가 실행된다. 컴퓨터를 재부팅 후에 docker를 실행해보면 설치가 완료될 것이다. 

 

$ docker run -d -p 80:80 docker/getting-started

 

위와 같이 터미널에서 실행을 하면 도커가 실행될 것이다.

 

 

3.2. 도커 CLI Ubuntu 설치(AWS EC2)

아래의 url을 들어가자.

https://docs.docker.com/engine/install/

 

Install Docker Engine

 

docs.docker.com

 

위와 같이 Ubuntu를 클릭해준다. 다른 환경이라는 본인의 환경에 맞게 클릭을 해주자.

 

https://docs.docker.com/engine/install/ubuntu/

 

Install Docker Engine on Ubuntu

 

docs.docker.com

 

위의 홈페이지에 맞게 쭉 쳐주면 된다. 간단히 정리하면 아래와 같다.

 

// 이전 버전 삭제
$ sudo apt-get remove docker docker-engine docker.io containerd runc
$ sudo apt-get update

// 저장소 셋업
$ sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

// official GPG key 세팅
$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

// 제장소 세팅
$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  
  // 도커 엔진 설치
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

 

위에서도 GUI를 설치했지만, 같은 명령어로 가능이 하기 때문에 통합으로 ubuntu로 조금 더 실습을 진행하겠다.

 

 

3.3. 도커 Mac 설치

 

https://docs.docker.com/desktop/install/mac-install/

 

Install on Mac

 

docs.docker.com

 

공식문서에 들어가서 인스톨을 눌러준다. 나는 M1이니까 아래 그림에서 Mac with Apple sillicon을 눌러준다.

 

 

 

설치하고 아래 그림처럼 application에 넣어준다.

 

 

 

설치 완료 후에 도커를 한번 실행 시킨다. 그 후에 terminal에서 아래와 같은 명령어를 치고 설치가 완료 됐는지를 판단한다.

 

$ docker

 

 

 


4. 도커 실습

사실 도커 명령어를 칠 때마다, sudo를 앞에 넣어줘야 한다.  먼저 sudo를 안 넣어도 되게 세팅을 해보자.

 

$ sudo usermod -aG docker $USER

 

세팅이 끝났다. 도커를 실행해 보자.

 

$ docker

 

먼가 돌아가면, 설치는 완료된 것이다. 먼저 version 확인을 해보자.

 

$ docker version

 

 

버전 확인을 해보면, 위와 같이 Docker Engine이 Client와 Server, 즉 2개로 존재하고 우리는 2개를 다 사용할 수 있다. 좀 더 쉽게 이야기하면, 위의 명령어로 실행을 하면 Client Docker Engine이 실행되는 것이다. 그 후에 client는 server로 requret(요청)을 하고, 다시 server가 client로 response를 돌려 준면, cmd창에 표시된다고 보면 된다.

 

4.1. 도커 컨테이너 실행 방법

간단히 도커 컨테이너를 실행하는 방법을 확인하고 이번 글을 마쳐볼까 한다. 추가적인 Nginx, redis, spring 등등 과 같은 image 실행은 다른 글에서 추가하겠다. 컨테이너를 실행하는 명령어는 아래와 같다.

 

$ docker container run [옵션] [이미지:태그]

 

이미지:태그 부분은 예를 들면 centos:7과 같이 사용할 이미지(centos)와 버전(7)을 명시해 주면 된다. 기본적으로 실행하려는 이미지가 없다면 pull을 local에 다운로드하여서 실행을 한다. 그 후 재실행시에는 설치되어 있기 때문에 pull 없이 바로 실행된다.

 

 

4.2. 도커 ubuntu 실행

아래의 예시를 보면 단순히 ubuntu 들어가서 명령어를 치는 것과 같다.

 

$ docker container run ubuntu:latest /bin/echo 'Hello'

 

명령어를 정리하면, 최신 우분투를 받은 다음에 명령어를 실행하라는 말이다. 만약 ubuntu이미지를 이전에 받은 것이 있다면, 바로 실행이 될 것이고, 없다면 다운 받은 후에 실행이 될 것이다. /bin/echo 'Hello' 명령어는 ubuntu 안에서 실행할 명령어이다. bin 안에 있는 echo를 실행한다. ubuntu:latest의 latest는 최신 버전이라 이해하면 된다. 다른 명령어도 아래와 같이 쳐보면서 실습을 해보자.

 

 

 

 

4.3. docker/whalesay 이미지 실행

다른 간단한 이미지를 사용하는 실습을 간단히 해보자. image검색은 아래 사진의 사이트인 dockerhub에서 검색이 가능하다.

 

위의 이미지를 사용해보자. 아래와 같이 명령어를 쳐보자.

 

$ docker run docker/whalesay cowsay boo
     _____ 
    < boo >
     ----- 
            \
             \
                \     
                                            ##        .            
                                ## ## ##       ==            
                         ## ## ## ##      ===            
                 /""""""""""""""""___/ ===        
        ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~   
                 \______ o          __/            
                    \    \        __/             
                        \____\______/

 

위와 같이 고래가 뜬다면 성공이다! cowsay 뒤에 인자 이름을 적어주면 된다.

 

로딩되는 cmd창을 좀 더 보면 위와 같다. 1번은 local에 image가 있는지를 찾는 것이다. 없기 때문에 2번에서 pull로 다운로드하여 설치를 하는 것이고, 3번에서 실행 결괏값이 나온다고 할 수 있다. 즉, 설치한 적이 없어도 알아서 나의 서버로 다운로드해서 실행시켜준다.

 

 

 

5. 도커 이미지 만들기

앞에서 도커 Image를 받는 실습을 해보았다. 이제 이미지를 만들어서 도커에 올려서 공유하는 실습을 해보자. 명령어부터 보면 아래와 같다.

 

$ docker build --tag <이미지이름:버전> <dockerfile위치>

or

$ docker build -t <이미지이름:버전> <dockerfile위치>

 

조금더 디테일한 예시를 적어보면, 아래와 같다.

 

// 예1
$ docker build -t hanpy:2.3.1 ./

// 예2
$ docker build -t hanpy:dev ./cicd/dev

 

이렇게 적어주면, 이미지가 생성 된다. 생성된 이미지를 확인하려면 아래와 같은 명령어를 적어주면 된다.

 

$ docker images

 

여기서 조금 더 봐야할 부분이 dockerfile이다. dockerfile이 있어야 이미지가 말린다. 우선 간단한 Dockerfile 예시부터 보자. 아래는 리액트를 도커에 이미지로 만드는 로직이다.

 

FROM node:16-slim

RUN apt-get update
RUN apt-get install -y build-essential
RUN apt-get install -y curl

WORKDIR /app
COPY ./package.json /app/package.json
WORKDIR /app
RUN npm install -g npm@8.19.2
RUN npm install

COPY . /app
RUN npm run build

EXPOSE 3010

CMD [ "npm", "run", "start" ]

 

해석을 하면, node환경에서(FROM node:16-slim) 배포를 위해 명령어를 치는 것을 기술한 것이다. 관련 세부적인 것은 구글링하면 나온다. 여기서는 큰 틀만 이해를 하자. 쉽게 말하면, 배포를 하기위해 치는 명령어를 기술해 두고, image 빌드 시 대신 실행해 주는 것이라 생각을 하면된다.

 

 

 

6. 이미지 올리기

빌드 하여 이미지를 만들었다. 그리고 이미지를 docker images로 확인을 했다. 그러면 이제 images를 위에서말한 dockerhub에 올려보자.

 

https://hub.docker.com/

 

Docker Hub Container Image Library | App Containerization

Deliver your business through Docker Hub Package and publish apps and plugins as containers in Docker Hub for easy download and deployment by millions of Docker users worldwide.

hub.docker.com

 

이미지 확인 결과 hanpy:dev라는 이미지를 생성했고 하자.

 

$ docker login

 

위 명령어를 친후에 dockerhub의 가입한 아이디로 로그인을 하자. 인터넷은 연결되어 있어야한다. 그리고 push를 해주면 올라간다. 

 

$ docker push <username>/<저장소이름>:<태크>

//ex
$ docker push twopy/hanpy:dev

 

명령어를 풀이하면, twopy라는 아이디에 hanpy:dev 이미지를 올린것이다. 이제 dockerhub 홈페이지에 가면, 내가 올린 이미지를 찾을 수 있다.

 

 

 

 

정리

여기까지가 docker 기초 전체를 간단히 확인했다. 4시간정도의 강의 분량으로 보인다. 적지 않은 양이지만, 아주 기초적인 부분이고 추후 Redis 나 Jenkins, 쿠버와 연관된 배포까지 심화과정으로 올려보겠다.

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함