본문 바로가기
IT

[Docker] 도커란? 도커의 등장과 사용법

by Dblog 2022. 2. 26.
728x90

Docker

컨테이너란?

격리된 환경에서 실행하는 운영체제 수준의 가상화 기술입니다. 가상 머신과는 다르게 하드웨어를 가상화 하지 않고 커널을 공유하고 있기 때문에 속도가 빠르고 오버헤드가 많이 없다는 장점이 있습니다. 호스트 OS기준에 컨테이너는 프로세스 수준으로 인식하고 운영하지만 컨테이너 관점으로는 독립 환경을 가진 머신으로 인식됩니다.

도커 이전에는?

어떠한 인프라에 서비스를 설치하고 설정하는작업이 생각보다 귀찮고 복잡한 과정이다, pc, 사용환경 마다 설정 값도 달라질 것이고 업데이트를 한다고 하면 서버를 하나 새로 파서 war혹은 jar를 올리고 다시 tomcat 내리고 다시 빌드해서 war/jar를 다시 tomcat에 올리는 이런 작업들에 불편했으며

예전 legacy 서비스에 대해 업데이트 할때 누가 어떻게 해놨나 보려면 로그를 보고 코드를 보는 과정이 상당히 불편해서 새로운 기술의 필요성이 추가되었습니다.

그래서 가상화 기술이 등장하기 시작했습니다. 처음에는 리눅스 가상화를 활용하는 방법부터 가상머신을 사용하는 방법까지 다양한 방법론이 제시 되었습니다. 하지만 리눅스 가상화는 기술 자체가 어려워서 사용하기 힘들고 가상머신을 사용하는 방법은 Guest OS에서 너무 많은 오버헤드가 발생하였습니다.

도커의 등장

2013년 3월 오픈소스를 공개한 이후 새로운 빛이 등장한 느낌이었습니다. 위에 간단하게 불편한 점을 설명했지만 저 사항들 이후에도 엄청나게 많았던 불편한 점 들이 도커 하나만드로 해결되는경우가 많았다고 생각합니다. 제 경우만 하더라도 서비스 설치를 요청한 사람들의 자리에가서 서비스를 설치해주던 작업들이 이제는 도커파일 하나 던져주고 docker build 해서 쓰세요~ 라는 내용 하나만으로 끝나게되었습니다.

개발자는 도커 파일만 잘 작성하면 되고 수정사항이 생기면 도커 파일만 수정해서 다시 전달해주면 되는 굉장히 편한 세상이 찾아온 것 같았습니다.

물론 이건 도커에 장점중에 굉장히 작은 부분입니다.

도커의 장점

  1. 운영체제 수준의 가상화

virtualbox의 가상머신에 비해 로딩 속도가 빠르고 동일한 격리 수준을 지원하며 리소스를 많이 사용하지 않는 장점을 가지고 있습니다. virtualbox는 host os 위에 guest os를 올리고 그 위에 어플을 올리기 때문에 리소스 소모가 도커보다 많을 수 밖에 없습니다. 또한 퍼포먼스 측면에서도 거쳐야될 path가 많기 때문에 결국 속도또한 도커보다 느릴수 밖에 없습니다.

  1. 형상, 설정관리

도커파일을 git과 같은 형상관리 툴에 업로드해서 코드로 관리 할 수 있습니다. 또한 환경변수에 대해 MYSQL_PASSWORD=1234 이런식으로 설정할 수도 있습니다.

  1. 높은 이식성 및 효율성

컨테이너를 실행하는 것이 프로세스를 실행하는 것과 큰 차이가 없어 생각보다 빠르게 실행됩니다. 또한 리눅스 환경 즉 리눅스 커널 환경을 사용하고 있는 장비에는 손쉽게 컨테이너를 실행할 수 있는 장점이 있습니다.

도커의 단점

  1. 특정 환경에서는 사용할 수 없다

가장 좋은 예시로 intell cpu에서 빌드한 도커 파일은 M1 chip Mac에서는 동작하지 않습니다. arm chip인 M1은 intell의 네이티브 라이브러리를 읽을수가 없어서 도커 빌드과정에서 에러가 생깁니다.

  1. 비 저장성, 변경 불가능

실제로 컨테이너에 접속해서 설정을 수정하는 방식으로 컨테이너 수정이 가능하긴 합니다. 하지만 본질적으로는 이미지로 부터 컨테이너의 부팅 및 세팅이 되기 때문에 컨테이너 자체는 사실상 이미지를 바꾸기 전 까진 변경이 불가능합니다.

또한 컨테이너에서 변경된 부분은 컨테이너가 종료될때 함께 삭제되어 변경이력이나 데이터를 저장할 수 없는 단점이 있습니다.

자주 사용하는 도커 명령어

docker run 컨테이너 실행

docker stop 컨테이너 정지  
docker commit 현재까지 컨테이너 변경사항 저장  
docker exec 컨테이너 내부에 명령어 실행  
docker ps 실행중인 컨테이너 리스트 출력  
docker rm 컨테이너 삭제  
docker rmi 이미지 삭제  
     

docker run options

  • -v
  • -i
  • -t

도커 이미지 만들기

dockerfile이라는 파일명으로 이미지를 빌드할 수 있는 파일을 만들수 있습니다. 파일로 도커이미지를 관리하게되면 git, svn과 같은 형상관리 툴에서 코드를 통해 컨테이너를 관리할 수 있어 편리하며 개발 이력을 남기는데 상당한 도움을 줄 수 있습니다.

layer

도커 파일에서 컨테이너를 만드는 방식은 절차지향언어와 비슷합니다. 코드 상단부터 한줄 한줄 실행하며 컨테이너를 생성합니다. 이 한줄한줄을 layer라고 표현 하며 한번 이미지를 빌드하면 컨테이너에 대한 캐시가 로컬환경에 남기 때문에 Dockerfile을 만들때, 최대한 캐시를 이용할 수 있는 방식으로 layer를 설계하면 조금더 빠른 속도로 이미지를 빌드할 수 있습니다.

options

아래 옵션혹은 추가로 옵션을 사용하며 컨테이너의 환경을 미리 정의 할 수 있습니다.

  • env
  • arg
  • cmd
  • entrypoint

여기서 비슷하지만 분명한 차이를 보이는 ENTRYPOINT와 CMD의 차이를 적어보겠습니다.

ENTRYPOINT vs CMD

결과적으로 해당 컨테이너가 수행해야 할 실행 명령을 정의하는데 있어 동일하게 동작합니다. 두 명령어는 결과적으로는 비슷한 일을 하지만 상세하게 바라보면 약간의 차이가 있습니다.

  • CMD

CMD의 경우 docker를 실행할때 run 마지막에 실행 명령어 값을 던져주면 CMD에 정의된 명령을 실행하지 않습니다.

예제 참고

https://bluese05.tistory.com/77

도커 파일예제

# Dockerfile 
FROM ubuntu 
CMD ["/bin/df", "-h"]

실행인자를 주지 않고 실행 했을때

❯ docker run --name jhsong-df jhsong/df

Filesystem      Size  Used Avail Use% Mounted on
overlay          59G  5.6G   50G  11% /
tmpfs            64M     0   64M   0% /dev
tmpfs          1000M     0 1000M   0% /sys/fs/cgroup
/dev/sda1        59G  5.6G   50G  11% /etc/hosts
shm              64M     0   64M   0% /dev/shm
tmpfs          1000M     0 1000M   0% /proc/acpi
tmpfs          1000M     0 1000M   0% /sys/firmware

실행인자를 주고 실행 했을때

❯ docker run --name jhsong-df jhsong/df ps -aef 
UID PID PPID C  STIME  TTY  TIME     CMD 
root 1  0    0  15:19  ?    00:00:00 ps -aef

  • ENTRYPOINT

이번에는 ENTRYPOINT를 사용해 실행 했을때의 예제입니다.

https://bluese05.tistory.com/77

도커 파일예제

# Dockerfile 
FROM ubuntu 
ENTRYPOINT ["/bin/df", "-h"]

실행인자를 주지 않고 실행 했을때

❯ docker run --name jhsong-df jhsong/df

Filesystem      Size  Used Avail Use% Mounted on
overlay          59G  5.6G   50G  11% /
tmpfs            64M     0   64M   0% /dev
tmpfs          1000M     0 1000M   0% /sys/fs/cgroup
/dev/sda1        59G  5.6G   50G  11% /etc/hosts
shm              64M     0   64M   0% /dev/shm
tmpfs          1000M     0 1000M   0% /proc/acpi
tmpfs          1000M     0 1000M   0% /sys/firmware

실행인자를 주고 실행 했을때

❯ docker run --name jhsong-df jhsong/df:entry ps -aef 
/bin/df: invalid option -- 'e' Try '/bin/df --help' for more information.

위 처럼 에러가 발생하는 것을 볼 수 있습니다. 에러가 나는 이유는 실질적으로 docker가 run 된 명령어가

df -h ps -aef # ENTRYPOINT : df -h / CMD : ps -aef

처럼 되어있어 정상적으로 명령어를 실행할 수 없는 상태가 되버린 이유입니다.

CMD 와 ENTRYPOINT 명령어는 사용시기를 정확하게 판단하여 사용하여야 합니다.

컨테이너가 실행될때 함께 실행될 명령어가 변경할 필요가 없거나 꼭 실행되어야 하는 명령어일 경우 CMD 보다는 ENTRYPOINT 를 사용하는 것을 권장합니다.

반면 default 값을 설정하고 상황마다 실행할 명령어가 달라질 여지가 있을땐 CMD 로 default 명령어를 선언하고 필요에 따라 인자값을 주어 실행 명령어를 변경하는 방법이 좋습니다.

도커에 대한 개인적인 의견

Docker가 등장한 이후로 하드웨어 장비의 인프라 즉 OS, 서비스 이중화 등 하드웨어적인 문제에서 완전하진 않지만 해결할 수 있게 되었다고 생각합니다.

Linux와 같은 컨테이너가 동작할 수 있는 환경만 구성되면 Winodws, Mac os, Unix등 다양한 OS 이미지들이 이미 docker Hub에 업로드 되어 있어 그냥 실행만 시키면 되고 버전을 올리거나 버그가 생겨 다른 서비스로 교체해야할 때는 장애가 있는 컨테이너를 내리고 멀쩡한 버전의 컨테이너만 새로 올리면 됩니다.

개인적인 생각으로는 도커가 등장하면서 이제는 인프라도 쓰고싶을 때 쓰고 필요없을 때는 버릴 수 있는 그런 환경이 시작되었다고 생각합니다.

728x90

'IT' 카테고리의 다른 글

Embulk  (0) 2022.06.20
개발자도구 console에서 API 테스트하기  (0) 2022.06.09
mac 단축키  (0) 2022.01.27
[Linux] bash shell if,  (0) 2021.10.16
[Linux] dd명령어 활용, dump  (0) 2021.09.01

댓글