이번 글에서는 Docker에 대해 공부한 것을 간략하게 정리하려고 한다.
이전글과 이어지니 안보고 오신 분들은 보고 오는 것을 추천한다.
Docker 이해하기 - 1. 가상화 (Virtualization)
Docker 이해하기 - 1. 가상화(Virtualization)
이 글에서는 Docker를 공부한 내용을 정리하려고 한다. Docker를 알기전에는 가상화에 대해서 알아야한다. 먼저, 가상화를 정의해보자면 하나의 물리적 컴퓨터 자원을 여러 개의 가상 환경으로 나
laewonjeong.tistory.com
🐳 What is Docker?
`Docker`는 컨테이너 기반의 오픈소스 가상화 플랫폼이다.
애플리케이션과 그 실행 환경을 컨테이너라는 가벼운 단위로 묶어 배포하고 실행할 수 있는 플랫폼이라 생각할 수 있다. 또한, 이식성과 효율성을 동시에 제공하여 개발, 테스트, 배포 과정을 간소화하는 데 도움을 주어 다양한 곳에서 유용하게 사용된다.
`Docker`는 2013년 PyCon이라는 컨퍼런스에서 솔로몬 하이크스(Solomon Hykes)에 의해 공개되었다. 발표 이후 큰 인기를 얻으며 dotCloud라는 회사명을 Docker Inc.로 변경하고 `Docker` 플랫폼을 중점적으로 다루게 된다.
`Docker`라는 이름의 유래는 항구에서 컨테이너를 관리하는 작업에서 비롯되었다고 한다. 이와 비슷하게 `Docker`도 소프트웨어와 그 환경을 표준화된 컨테이너에 담아 어디서나 일관되게 배포하고 실행할 수 있도록 해준다.
⚙️ 기본적인 Docker 동작 과정
`Docker`를 이용해 컨테이너를 실행하는 과정은 위 그림과 같다.
`Dockerfile`을 통해 `Docker Image`를 생성하고 이 `Docker Image`를 실행하여 컨테이너를 생성하게 된다.
`Docker Image`가 이미 있다면 `Dockerfile`을 통해 build하는 과정없이 바로 컨테이너를 생성할 수 있다.
(이미 build한 이미지가 있거나, DockerHub에서 이미지를 pull한 경우)
🧾 Dockerfile
`Dockerfile`은 `Docker Image`를 생성하기 위한 설정 파일로, 애플리케이션을 빌드하는 데 필요한 명령어들이 포함되어 있다.
아래와 같이 파일 안에 나열된 명령문을 차례대로 수행하며 `docker image`를 생성한다.
`Dockerfile`의 대표적인 명령어는 다음과 같다.
- `FROM`: 기본 이미지를 지정한다. 예를 들어, FROM ubuntu:latest는 최신 우분투 이미지를 기반으로 한다는 것이다. 위 그림에서는 golang 이미지를 기반으로한다.
- `COPY` 또는 `ADD`: 파일을 복사하여 이미지를 구성하는 데 사용한다.
- `RUN`: 이미지 생성 중 실행할 명령어를 정의한다. 예를 들어, 필요한 패키지를 설치할 때 사용한다. 위 그림에서는 hello.go라는 파일을 build하는 명령어를 실행한다.
- `CMD`: 컨테이너가 실행될 때 기본으로 실행할 명령어를 설정한다.
즉 위에 `Dockerfile`은 golang이라는 베이스 이미지를 사용하면서,
`COPY`를 통해 현재 디렉토리(.)의 모든 파일을 컨테이너의 작업 디렉토리(.)로 복사한다. 즉, hello.go 파일을 포함하여 현재 디렉토리에 있는 로컬의 모든 파일이 컨테이너 내부로 복사되고,
`RUN`을 통해 이미지 생성 중 hello.go 파일을 빌드하여 실행 파일을 생성하고,
`CMD`를 통해 컨테이너가 시작되면 ./hello 실행 파일을 기본 명령으로 실행하는 이미지를 생성한다.
FROM, COPY, RUN, CMD외에도 명령어가 존재한다.
- `EXPOSE`: Docker 컨테이너가 어떤 포트를 외부에 공개할지 지정한다.
- `WORKDIR`: Docker 컨테이너의 기본 작업 디렉토리를 설정한다.
- `VOLUME`: 컨테이너와 호스트 간의 데이터 공유 및 지속성을 유지하기 위해 사용하는 디렉토리르 지정한다.
- `ENV`: 컨테이너에서 사용할 환경 변수를 설정한다.
등이 있으며, 모든 명령어는 Docker 공식 문서에서 확인할 수 있다.
🖼️ Docker Image
`Docker Image`는 `Dokerfile`을 빌드하여 생성한 결과물로, 일종의 템플릿 역할을 한다.
서비스 운영에 필요한 애플리케이션, 소스코드, 라이브러리, 실행 파일, 설정 값들을 묶어서 가지고 있는다.
즉, 애플리케이션을 실행하기 위한 모든 요소를 포함하고 있다.
Docker Image 특징
`도커 이미지`는 가상 머신의 비하면 굉장히 적은 용량을 가진다.
`도커 이미지`에는 애플리케이션과 환경이 포함되어있기 때문에 OS와 무관하게 어디서나 동일하게 실행될 수 있다.
`도커 이미지`는 상태 값을 가지지 않고 변하지 않는다. 즉, 도커 이미지에 포함된 애플리케이션이나 라이브러리는 이미지 생성 이후 변경되지 않으며, 각 컨테이너는 이 고정된 이미지에서 시작한다.
하나의 `도커 이미지`는 여러 컨테이너를 생성할 수 있고, 컨테이너를 삭제하더라도 이미지는 변하지 않고 그대로 남아 있는다.
`도커 이미지`들은 Docker Hub를 통해 버전 관리 및 배포(push & pull)가 가능하다.
Docker 장점 및 특징
- `격리 (Isolation)`
- 프로세스를 격리된 환경에서 관리한다. → 독립된 환경을 보장
- 다른 애플리케이션 간의 충돌 및 호환성 문제 방지
- `이식성 (Portability)`
- Docker로 만들어진 컨테이너는 Docker가 설치된 모든 환경에서 동일하게 실행된다.
- `경량 (Lightweight)`
- 가상머신과 달리 필요한 것들만 포함하고 있어 경량화 된다.
- 호스트 커널과 리소스를 공유하기 때문에 적은 오버헤드가 발생한다.
- `버전 관리`
- 이미지 빌드와 배포를 위한 버전 관리를 제공한다.
- `커뮤니티 및 이미지 공유`
- Docker Hub를 통해 다양한 Docker 이미지를 제공한다.
- 자신만의 Docker 이미지를 만들어 공유 가능하다.
마무리
이번 글에서는 `Docker`와 `Dockerfile`, `Docker Image`에 대해 공부한 것을 간단하게 정리해봤다. 다음 글에서는 Docker 설치 및 간단한 실습과 명령어에 대한 내용을 포스팅을 할 예정이다.
'Docker 및 Kubernetes > Docker' 카테고리의 다른 글
[Docker] 5. Docker Hub란 (0) | 2025.01.21 |
---|---|
[Docker] 4. 간단한 Docker 실습 (0) | 2024.11.19 |
[Docker] 3. Docker 설치 및 명령어 (1) | 2024.11.19 |
[Docker] 1. 가상화(Virtualization) (0) | 2024.11.13 |