Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly.
➡️ 도커는 애플리케이션을 컨테이너라는 단위로 패키징하고 실행할 수 있도록 해주는 오픈 소스 가상화 플랫폼
기존의 가상 머신(Virtual Machine)의 경우 OS를 통으로 올려야 했기 때문에 용량도 크고 실행 속도도 느리다는 단점이 존재함.
도커 컨테이너는 호스트 OS 위에서 필요한 라이브러리 및 실행 환경만 공유해 빠르고 가볍게 구동 가능
1. 이식성 (Portability)
: 개발 PC와 서버 환경이 달라도, 도커 이미지만 있으면 동일한 환경을 재현할 수 있음
2 확장성
: 필요하다면 빠르게 컨테이너 용량을 늘려 부하를 분산할 수 있음
3. 신속한 배포
: 컨테이너 실행 및 중지가 빨라 (VM 대비) 빌드-테스트-배포 사이클이 짧아짐
4. Docker Hub의 존재
: 컨테이너 이미지를 공유하고 배포하는 저장소, 타인의 이미지를 받아서 즉시 실행해 볼 수 있는 것 (필자의 MySQL 설치 방식)
도커를 처음 접하면 컨테이너가 도커인가? 할 수 있지만 컨테이너 기술 중 하나가 도커인 것이지 둘이 같은 의미가 아니다.
도커 이전 Linux Containers (LXC) 등 다른 컨테이너 기반 가상화 기술이 존재했고 현재도 도커 외에도 Podman(Redhat), containerd, CRI-O 등 다양한 컨테이너 기술이 존재한다.
또한 도커 컨테이너가 어떻게 격리되어 동작되는지는 리눅스 Namespaces 와 cgroups를 기반으로 가상머신처럼 보이지만 사실은 단일 리눅스 커널 내의 격리된 프로세스라 이해할 수 있다.
“Docker uses a client-server architecture. The Docker client talks to the Docker daemon, which does the heavy lifting of building, running, and distributing your Docker containers. The Docker client and daemon can run on the same system, or you can connect a Docker client to a remote Docker daemon. The Docker client and daemon communicate using a REST API, over UNIX sockets or a network interface. Another Docker client is Docker Compose, that lets you work with applications consisting of a set of containers.”
도커는 클라이언트 - 서버(데몬) 아키텍쳐를 기본으로 한다. 데몬이 컨테이너 관리를 대신 해주기 때문에 클라이언트 명령만 알면 편리하게 컨테이너를 다룰 수 있다.
도커 데몬 Docker Daemon
docker run
, docker build
등의 명령어를 입력하면 도커 클라이언트가 이 명령을 데몬에 전달하고 데몬이 이 일을 처리도커 클라이언트 Docker Client
docker
명령어나, GUI 기반 도커 관리 툴 모두 도커 클라이언트도커 레지스트리 Docker Registries
도커 객체 Docker Objects
도커 사용 시 이미지, 컨테이너, 네트워크, 볼륨, 플러그인 등의 객체를 만들고 사용함
도커 파일 Docker File
도커 이미지 Docker Image
도커 컨테이너 Docker Container
public class Hello {
public static void main(String[] args) {
System.out.println("Hello, Docker with Java!");
}
}
Dockerfile
생성# (1) 사용할 베이스 이미지 지정 (OpenJDK 17)
FROM openjdk:17
# (2) 컨테이너 내부에서 작업 디렉토리 생성 및 설정
WORKDIR /app
# (3) 현재 디렉토리(호스트)의 Hello.java를 /app 디렉토리에 복사
COPY Hello.java .
# (4) 도커 이미지 빌드 시 컴파일 수행
RUN javac Hello.java
# (5) 컨테이너 실행 시 main 메서드를 가진 클래스 실행
CMD ["java", "Hello"]
# 현재 디렉토리에 있는 Dockerfile을 이용하여
# my-java-app 이라는 이름의 이미지를 빌드
docker build -t my-java-app .
docker run --rm my-java-app
아주 간단하게 도커 겉핥기를 해봤는데 시리즈로 구상 중이라 컨테이너 간 통신 (도커 네트워크), 도커 볼륨, 컴포즈, Jenkins 연동 등 프로젝트 실례로 돌아오겠습니다