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
마지막으로 도커가 어떻게 동작하는지 정리해보자. 도커의 생명주기는 위와 같다.
- 도커 레지스트리에서 이미지를 PULL 해와서
- 컨테이너를 CREATE 하고
- START 명령어로 메모리에 올린다.
- 종료할 때는 STOP 명령어로 메모리에서 부터 내리고,
- RM 명령어로 띄워진 컨테이너를 지워준다.
- [선택] 이미지도 지우고 싶다면 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
-
해당 지식의 원천 및 자료는 아래 강의를 참고하였습니다.
댓글