도커의 필요성
- 여러 장소에 동일한 어플리케이션 환경을 구축하는 것은 동일한 작업을 반복적으로 해야하는 것이다.
- 컴퓨터의 환경이 달라지면 이가 잘 작동하지 않을 가능성도 존재한다.
- 어플리케이션 실행 환경 전체를 이미지(image) 파일로 생성하여 어디서든 컨테이너라 부르는 격리된 공간에 어플리케이션 실행환경을 쉽게 복원할 수 있도록한다.
- 실행에 필요한 바이너리, 라이브러리, 구성 파일 등을 패키지로 묶어 이미지로 만든다.
- github나 도커허브를 이용하여 여러사람들과 이미지파일공유가 가능하다.
도커란?
- 어플리케이션 개발, 실행 및 공유를 목적으로한 개방형 플랫폼이다.
- 여러 컨테이너는 동시에 실행이 가능하며 작업하는 동안 컨테이너를 공유할 수 있으며 공유하는 모든 사람은 동일한 컨테이너를 갖게된다.
컨테이너란?
- 소스코드와 종속성을 패키징하는 표준 소프트웨어 단위로 어플리케이션이 다양한 컴퓨터환경에서 실행할 수 있도록 한다.
- chroot : 특정 디렉토리를 root로 인식하게하는 명령어
- namespace : mnt.pid,user,cgoup 등 자원을 관리하는 기능 제공
- cgroup : CPU, 메모리, 디스크, I/O, 네트워크 등의 자원사용량을 관리하여 특정 어플의 과도한 자원 사용을 자제하도록한다.
dockerfile
image
- 읽기 전용파일로 도커 엔진은 도커 이미지를 이용하여 컨테이너 생성이 가능하다.
- 하나의 이미지로 여러개의 컨테이너 생성 및 실행이 가능하다.
container
- 가상의 격리된 환경에서 독립된 프로세스로 동작한다.
가상머신과 컨테이너 비교
가상머신

- 물리적 하드웨어 가상화
- 호스트 OS 위에 가상화 소프트웨어인 하이퍼바이저(VMWARE, VirtualBox)를 이용하여 여러개의 게스트 os를 구성하는 방식이다.
- 하이퍼바이저는 가상머신을 생성, 실행, 모니터링하는 중간관리자 역할이다.
- 각 가상머신은 독립적으로 OS, 어플리케이션, 필수 바이너리 및 라이브러리 설치 및 동작한다.
컨테이너

- 프로세스 가상화 (운영체제 레벨 가상화)
- 여러 컨테이너가 호스트 OS의 커널을 공유하고 격리도니 프로세스로 실행이 가능하다.
- 하이퍼바이저와 게스트 OS가 없어서 가벼워서 어플을 많이 실행할 수 있고 이미지 파일의 복제, 배포가 쉽다.
- 게스트 OS를 부팅하지않아 어플의 시작이 빠르다.
도커 개발환경 구축
환경구축
-CPU 가상화 기능 활성화
- AMD : BIOS에서 SVM mode를 enable로 수정한다.
- Intel : BIOS에서 Virtualization을 enable로 수정한다.
- Window 기능에서 Linux용 Window 하위 시스템 체크박스를 활성화하다.
설치과정
- visual studio code 설치
- WSL(Windows Subsystem for Linux)에서 GCC 설치
- 도커 확장 설치
- Dev container 설치 - docker의 폴더나 저장소를 열어볼 수 있게한다.
컨테이너 생성
docker run -d -p 80:80 docker/getting-started
- -d 백그라운드에서 분리모드로 컨테이너 실행
- -p 80:80 호스트의 포트 80을 컨테이너의 포트 80에 매핑한다.
- docker/getting-started : image명 docker 내에서도 나옴.
컨테이너 중지 및 제거
$ docker ps //PORTS(Container ID) 확인
$ docker stop 컨테이너명
$ docker rm 컨테이너명
앱의 컨테이너 이미지 빌드
- 어플을 빌드하기 위해 Dockerfile 생성