본문 바로가기
Infra/Docker

[Docker] 도커에 대하여..

by 지구 2022. 8. 27.

Docker 에 대해 정리하기 전에, DevOps 에 대해 얘기하고자 한다.

DevOps: Development + Operations (개발 + 운영)
엔지니어가 개발에서 테스트, 배포, 운영에 이르기까지 전체 애플리케이션 수명 주기에 걸쳐 작업하고 단일 기능에 한정되지 않은 광범위한 기술을 개발합니다. -aws-

 

"DevOps" 는 나에게 예전부터 눈에 밟히던 단어다.

나는 직장생활을 하면서는 항상 인프라팀이 있었고, (자주 하진 않지만) 사이드 프로젝트를 구현할 땐 인프라까지 구현해본적이 없었기에 솔직히 말하자면 나는 인프라에 대해 제대로 아는 게 없다.

그래서 DevOps 라는 단어는 대단하고, 두려운 느낌을 주었다.

 

그치만 요즘 들어서는 '얉은 지식이라도 알아두는 게 좋다' 라는 생각을 가지고 있기에, 인프라의 첫 걸음이자 평소 배워보고 싶었던 "Docker" 에 대해 공부하고 그 내용을 블로그에 남겨두고자 한다.

 


Architecture

도커가 왜 나왔는지 알려면, 아키텍쳐의 변천사부터 얘기해야 한다.

컴퓨터 공학에서는 태초에(?) 하나의 애플리케이션에 모든 서비스가 들어가있던 모놀리스 아키텍쳐가 있었고,
장애/배포 등의 이슈로 인해 서비스과 애플리케이션을 1:1 구조로 분리하도록 개선된게 현재의 MSA 아키텍쳐이다.

  • Monolithic Architecture: 서비스가 하나의 애플리케이션으로 돌아가는 구조
  • MicroService Architecture: 애플리케이션의 각각의 기능을 분리하여 개발 및 관리하는 구조


그치만 MSA 아키텍쳐에서 분산 시스템 환경을 많이 사용하면서 Transaction 보장, 테스트, 배포, 관리가 복잡해졌고,
이 문제를 해결하기 위해 나온게 "이미지" "도커" "쿠버네티스" 라고 볼 수 있다.

이 후에 설명할 내용을 간단히 말하자면..

  • 도커를 사용하면 컨테이너를 편리하게 쓸 수 있게 해주고
  • 쿠버네티스를 사용하면 도커를 잘 다룰 수 있게 해준다.

 

 

이미지? 컨테이너?

그렇다면 도커를 배울 때 항상 등장하는 '이미지' 와 '컨테이너' 는 뭘까?

  • 이미지: 필요한 프로그램과 라이브러리, 소스를 설치한 뒤 만든 하나의 파일
  • 컨테이너: 그러한 이미지를 격리하여 독립된 공간에서 실행한 가상 환경
    • 가상머신처럼 하드웨어를 전부 구현하지 않기 때문에 매우 빠른 실행이 가능하다.
    • 실제로 컨테이너에서 실행 했을 때의 CPU 는 가상머신에서 실행했을 때 보다 훨씬 안정적이다.

 

 

Docker

공식 홈페이지: https://docs.docker.com/

도커는 컨테이너 기술을 지원하는 다양한 프로젝트 중에 하나, 사실상 '컨테이너 기술의 표준' 이다.
또, 애플리케이션에 국한되지 않고 의존성 및 파일 시스템까지 패키징하여 빌드, 배포, 실행을 단순화한다.

따라서 도커를 사용하면, 원하는 서비스를 백업하기도 쉽고 종속성 없이 빠르게 개발할 수 있는 환경을 만들 수 있다.

 

 

Docker Registry?

위에서 설명한 이 도커는, 그럼 어떻게 이미지를 내려받고 내 로컬에 띄울 수 있는걸까?

이 해답은 Docker Hub, Docker Registry 에 있다.

도커 허브 공식홈페이지: https://hub.docker.com/

도커 레지스트리는 누구나 이미지를 올리고 내려받을 수 있다.

따라서 도커 레지스트리에서 이미지를 받아와서 컨테이너화 시켜 내 로컬에 띄우는 게 가능한 것이다.

여기서, "누구나" 가능하다는 점은 조심해야 한다.
간혹 이 핵심을 이용해 악성 이미지를 배포하는 나쁜 사람들도 있으니, rating 이 높거나 official 딱지가 있는 이미지를 이용하도록 하자.

# 이미지 검색
$ docker search tomcat

# 이미지 다운
# $ docker pull {다운받을 이미지명}
$ docker pull amd64/tomcat

# 다운받은 이미지 확인
$ docker images

 

 

Docker Life Cycle

마지막으로 도커가 어떻게 동작하는지 정리해보자. 도커의 생명주기는 위와 같다.

  1. 도커 레지스트리에서 이미지를 PULL 해와서
  2. 컨테이너를 CREATE 하고
  3. START 명령어로 메모리에 올린다.
  4. 종료할 때는 STOP 명령어로 메모리에서 부터 내리고,
  5. RM 명령어로 띄워진 컨테이너를 지워준다.
  6. [선택] 이미지도 지우고 싶다면 RMI 명령어로 지워준다.

 

이때, 컨테이너를 만들고 메모리에 올리는건 RUN 명령어로 한 번에 할 수 있다.

$ docker run -d -p 80:8080 amd64/tomcat
  • pull 이 되어 있는 이미지라면 해당 이미지는 pull 을 또 하지 않는다.
  • 그렇다고 run 명령어를 막 쓰면, 중복된 컨테이너가 계속 생겨나므로 create 와 start 명령어를 명시적으로 분리해서 사용하는게 좋다.

 

또, 메모리에 올리고 컨테이너를 지우는 것도 처음에 `--rm` 명령어로 컨테이너를 띄우면, STOP 명령어만 해도 컨테이너가 지워지는 효과를 볼 수 있다. 정확히는 임시 컨테이너 실행 명령 옵션이다.

$ docker run -d -p 80:8080 --rm amd64/tomcat

 

 

Docker Example

  • 기존에 설치된 모든 컨테이너와 이미지 정지 및 삭제
    • ## -a: all, -q: container name
      $ docker stop `docker ps -a -q`
      $ docker rm `docker ps -a -q`
      $ docker rmi `docker images -q`
  • 도커 기능을 사용해 Jenkins 검색
    • $ docker search jenkins
  • Jenkins 를 사용하여 설치
    • $ docker pull jenkins/jenkins
      ## 오픈된 포트 확인
      $ docker inspect jenkins/jenkins
      $ docker run -d --name jenkins -p 8080:8080 jenkins/jenkins

 


해당 지식의 원천 및 자료는 아래 강의를 참고하였습니다.

https://www.inflearn.com/course/%EB%8D%B0%EB%B8%8C%EC%98%B5%EC%8A%A4-%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0/dashboard

반응형

댓글