도커가 등장하기 이전의 개발자
새로운 프로젝트를 시작하게 되면 가장 먼저 하는 것은
해당 프로젝트를 개발하기 위한 프로젝트 환경 세팅이다.
프로젝트를 할 때마다 새로운 프로그램을 설치해야 하고,
프로젝트마다 실행환경도 다르며,
가장 큰 문제는 분명 똑같이 환경 세팅을 했는데
어떤 팀원은 프로젝트가 잘 동작하는데 다른 팀원은 프로젝트가 동작하지 않는 경우도 많다.
왜냐하면 프로그램도 프로그램이지만 사람마다 컴퓨터를 사용하는 방식이 다르기 때문이다.
해당 프로젝트 이외의 다른 프로젝트에서 사용한 프로그램이 문제가 될 수도 있고,
윈도우같은 경우에는 사용자명에 한글이 들어가서 특정한 프로그램이 문제가 되는 경우도 있다.
그런 상황을 마주할 때마다 개발자들은 많은 시간을 할애해서 문제를 고쳐야 한다.
도커의 등장 배경
아주 약간의 차이점으로 프로젝트 실행이 안 되는 경우는 흔하다.
사람마다 환경설정이 조금씩이라도 다를텐데 이걸 해결할 방법은 없을까?
사실 해결방법은 간단하다.
모두 동일한 개발환경을 사용하도록 만들면 된다.
이 때 바로 도커가 활용된다.
도커는 컨테이너
와 이미지
라는 것을 바탕으로
동일한 환경 설정을 할 수 있게 해준다.
도커를 사용하는 이유
도커에는 이미지
라는 것이 있다.
대략적으로는 하나의 프로그램이라고 보면 되는데,
예를 들면 실제 이름하고는 다르지만 “자바8”이라는 이미지가 있다고 가정해보자.
그리고 이와 별개로 운영 중인 서비스 중에 자바8 버전으로 개발된 애플리케이션이 있다고도 가정해보자.
만약에 어느 기점에 뭐 서비스 리뉴얼이라던가 아니면 뭔가의 이슈로 자바의 버전을 8에서 17로 변경한다고 가정해보자.
그러면 서버 컴퓨터에 자바17을 설치해야할 것이다.
그런데 만약에 서버가 1대가 아니라면 어떨까?
n대의 서버 컴퓨터만큼 자바 버전을 올려줘야 할 것이다.
하지만 이를 도커의 컨테이너
와 이미지
를 활용하면 쉽고 빠르게 해결할 수 있다.
도커는 일종의 환경 구성을 도와주는 프로그램이다.
여기서 컨테이너
라 함은 하나의 환경을 구성하고 있는 상자를 의미하고,
이미지
는 해당 컨테이너 내부에서 환경을 구성하는 자바나 MySql같은 프로그램을 의미한다.
기존에는 마이그레이션을 해야 한다면 새로운 버전의 프로그램이나 다른 프로그램을
각 서버 컴퓨터마다 설치를 해줘야 했다.
하지만 도커에서는 새로운 환경을 이미지
를 통해 컨테이너
로 만들면 끝이다.
그러면 서버 컴퓨터가 여러 대인 경우는 이렇게 만든 컨테이너를 복사해서 사용하면 된다.
그래서 테스트 환경을 구축하거나, 서버 확장을 할 때 도커가 많은 도움이 된다.
도커는 완전히 새로운 기술이 아니다.
도커는 사실 기존에 이미 있던 기술을 발전시킨 것이다.
원래 리눅스에는 가상화된 공간을 생성하기 위해 chroot
, namespace
, cgroup
이라는 리눅스 자체 기술이 있다.
도커는 리눅스의 이러한 기술들을 활용해서 프로세스 단위의 격리 환경을 만든다.
도커의 특징
- 컨테이너를 생성할 때 기존 리눅스에 이미 존재했던 자체 기능들을 사용해서 프로세스 단위의 격리 환경을 만든다.
- VM과 달리
하이퍼바이저(HyperVisor)
를 거치지 않아도 되기 때문에 성능 손실이 거의 없는 수준으로 줄어든다.
- VM과 달리
가상머신(VM)
과 달리 커널을 공유해서 사용한다.- VM이 게스트 OS를 사용할 때처럼 라이브러리나 커널 등을 포함하지 않아도 되기 떄문에 용량이 작다.
- 컨테이너 안에는 라이브러리 및 실행파일만 존재한다.
- VM이 게스트 OS를 사용할 때처럼 라이브러리나 커널 등을 포함하지 않아도 되기 떄문에 용량이 작다.
도커의 장점
- 한 대의 물리 서버에 여러 대의 서버를 띄울 수 있다.
- 각 컨테이너가 독립적인 실행환경이기 때문에 가능하다.
- 필요에 따라서 서버를 추가하거나 줄이는 확장성이 뛰어나다.
- 컨테이너를 생성하고 삭제하는 과정이 간단하고 빠르기 때문에 가능하다.
- 시스템의 규모를 유연하게 조정할 수 있는 가장 큰 특징이다.
- 동일한 환경을 구현하기 매우 쉽다.
- 동일한 이미지로 패키징하기만하면 다른 서버에서도 동일하게 사용할 수 있다.
- 개발/테스트/배포 환경을 일관성있게 유지할 수 있다.
- 도커가 운영체제, 하드웨어, 네트워크 환경 관계없이 동일한 환경을 제공하기에 가능하다.
- 서버 이동 및 백업이 용이하다.
데이터 볼륨
을 활용해 백업 및 복원을 쉽게 할 수 있다.- 컨테이너 단위로 이동이 가능하다.
- 구성 변경이 용이하다.
- 컨테이너를 만드는 건 매우 쉽기 때문에 변경점이 있으면 포함되는 이미지 구성만 변경하면 된다.
- 다만 기존 컨테이너의 이미지를 변경하기 보다는 변경된 이미지 구성으로 컨테이너를 새로 만드든 것이 좋다.
도커의 단점
- 호스트 OS와 도커 간에 성능 차이가 발생할 수 있다.
- VM을 사용하는 것보다는 훨씬 성능이 좋다.
- 다만 결국은 가상화 컨테이너이기 때문에 약간의 성능 차이는 발생할 수 있다.
- 리눅스용 소프트웨어만 지원한다.
- 애초에 도커 자체가 리눅스의 가상화 컨테이너 기술을 발전시킨 것이다.
- 그래서 유닉스나 윈도우 서버는 아예 지원하지 않는다.
- 보안에 대한 추가 고려가 필요하다.
- 도커 컨테이너가 기본적으로 격리된 독립적인 환경인건 사실이다.
- 하지만 결국 컨테이너라는 것은 호스트 서버 컴퓨터에서 띄우는 것이기 때문에 호스트 서버에 문제가 생기면 모든 컨테이너에 영향이 간다.
- 또한 컨테이너 내부에서 호스트 OS나 다른 컨테이어에 대한 공격이 가능하므로, 보안을 유지하려면 추가적인 보안 조치가 필요하다.
- 데이터를 영구적으로 저장하거나 관리하는 것이 어렵다.
- 도커 컨테이너는 무상태(Stateless)를 원칙으로 한다.
- 데이터를 영구적으로 저장하려면 별도의 데이터 볼륨을 설정하거나 외부 데이터베이스를 사용해야 한다.
- 어느 정도 서비스의 규모가 있어야지 효과를 볼 수 있다.
- 컨테이는 기본적으로 여러 개를 사용하는 형태를 가정한다.
- 단일 컨테이너만 사용한다면 호스트 컴퓨터만 사용하는 것이랑 다를게 없다.
- 단일 컨테이너만 사용한다면 도커 엔진은 오히려 오버헤드가 되버린다.
도커 구성 요소
도커 클라이언트 (Docker Client)
- 이름 그대로 도커를 실행하는 클라이언트
docker-cli
라고 부른다.- 명령문을 통해 dockerdAPI를 활용해 build, pull, run같은 명을 내린다.
도커 데몬
과 통신한다.
도커 데몬
- 백그라운드에서 실행되는 데몬 프로세스
dockerd
라고 부른다.- 도커 API 요청을 수신하고 도커 이밎, 컨테이너 등과 같은 도커와 관련된 객체를 관리한다.
containerd
- 컨테이너 실행과 관리에 필요한 기능을 수행하는 오픈소스 컨테이너 런타임
- 컨테이너의 생명주기를 모두 관리한다.
- 고수준 컨테이너 런타임에 해당한다.
런씨
와 통신함으로써 컨테이너를 실행한다.
containerd-shim
containerd
와runc
사이에서 중개자 역할을 수행하는 중간 프로세스
runc
- 컨테이너 실행과 관련된 작업을 수행한다.
- 저수준 컨테이너 런타임에 해당한다.
컨테이너
- 소프트웨어를 배포할 때 필요한 코드, 라이브러리, 환경 설정 파일들을 한데 모아 격리시킨 후 실행가능한 패키지로 만든 것
flowchart LR
A[docker-cli] --> B(dockerd)
B --> C[containerd]
C --> D1[containerd-shim]
C --> D2[containerd-shim]
C --> D3[containerd-shim]
D1 --> E1[runc]
D2 --> E2[runc]
D3 --> E3[runc]
E1 --> F1[컨테이너]
E2 --> F2[컨테이너]
E3 --> F3[컨테이너]
도커 생명주기
flowchart LR
A[(Docker Hub)] --> B["생성 (create)"]
subgraph 컨테이너
B --> C["실행 (run)"]
C --> D["정지 (stop)"]
D --> E["삭제 (remove)"]
E --> B
end
도커 설치하기 (Windows OS 기준)
- 다운로드 사이트 이동하기
- 설치 프로그램 다운로드 받기
- 다운로드 받은 설치 프로그램 실행해서 Docker Desktop 설치 시작하기
- Configuration 화면에서 “Use WSL 2 instead of Hyper-V” 옵션 체크되있는지 확인하고 넘기기
- 설치 완료 후 재부팅하기
- 재부팅 후 자동 시작되는 “Docker Desktop”에서 서비스 약관 동의 진행하기
- 자동으로 실행되지 않으면 직접 실행하기
- WSL 커널 업데이트 안내 알럿이 발생하면 확인하고 다운로드 사이트로 이동하기
- 알럿 내용이 “Docker Desktop - WSL kernel version too low”라고 노출됨
- WSL2 Linux 커널 업데이트 패키지 다운로드 하기
- 다운받은 업데이트 패키지를 실행해서 WSL2 Linux 커널 업데이트하기
- PowerShell을 실행해서 WSL2를 기본 버전으로 설정하기
wsl --set-default-version 2
를 입력
- Docker Desktop을 재실행해서 좌측 하단에 “Engine running” 메시지가 출력되는지 확인
- CMD를 실행해서
docker version
을 입력해서 도커 명령문이 잘 실행되는지 확인하기
- 참고
- WSL2가 설치되어 있지 않으면 Docker Desktop 설치 시 오류가 발생할 수 있음
- 오류가 발생하면 게시글 참고
맛보기
웹 서버인 nginx를 통해서 간단한 테스트를 진행해보자.
- CMD 실행
docker pull nginx
를 실행해서 Nginx 이미지 다운로드 받기docker image ls
를 실행해서 다운로드 된 이미지 확인하기ls
는 list의 약자로 목록을 확인하는 명령어
docker run --name webserver -d -p 80:80 nginx
를 실행해서 Nginx 서버 실행시키기- 웹 브라우저에서
localhost:80
으로 접속해서 Nginx 서버가 잘 실행되는지 확인하기 docker ps
를 실행해서 실행되고 있는 모든 컨테이너 상태 확인하기docker stop webserver
를 실행해서 방금 실행한 컨테이너를 정지시키기- 웹 브라우저에서
localhost:80
으로 접속해서 Nginx 서버가 잘 정지됬는지 확인하기 docker ps -a
를 실행해서 정지되어 있는 모든 컨테이너 상태 확인하기docker rm [컨테이너 ID]
를 실행해서 컨테이너 삭제하기- 정지되어 있는 컨테이너의 ID는
docker ps -a
를 통해 확인 가능
- 정지되어 있는 컨테이너의 ID는
docker ps -a
를 실행해서 정지되어 있는 모든 컨테이너 상태 확인하기
출처
비전공자도 이해할 수 있는 Docker 입문/실전
[Docker] 도커란? - 도커 개념 정리
<Docker> 도커의 구조와 장단점
원리부터 이해하는 도커 - 컨테이너, 가상화, 구성요소
[Docker] Docker Desktop - Unexpected WSL error in Windows11 Home