1. Docker란?
기존 컴퓨터 시스템에서는 여러 개의 프로세스(애플리케이션)를 관리하면서 발생하는 패키지 버전관리와 환경 변수 충돌 문제로 인해 서버를 운영하고 관리하기 매우 어려웠다.
이러한 문제를 해결하기 위해, 하나의 컴퓨터 하드웨어 자원을 공유하면서 애플리케이션 별로 패키지, 환경설정 할 수 있는 독립적인 환경을 구성할 수 있도록 가상화라는 개념이 나왔다.
서버 가상화 기술 중 Hypervisor라는 기술이 등장했는데, Hypervisor는 서버 가상화를 구현할 수 있는 소프트웨어로 Hypervisor를 이용해 여러개의 VM(Virtual Machine)에 Geust OS를 생성해 독립적인 환경을 구성하는 기술이다.
하지만, 직접 OS를 설치해야 하는 번거러움과 하드웨어 자원을 효율적으로 사용할 수 없다는 문제가 있었다...
VM의 문제점을 해결하기 위해 가상화 기술이 발전하면서, OS 레벨에서 가상화할 수 있는 Container 기술이 등장했다. 컨테이너 기술은 애플리케이션을 그 실행 환경과 함께 패키징하여, 어디서든 동일하게 실행할 수 있도록 한다.
Container 기술의 대표적인 구현이 Docker로 오픈 소스 Linux Container(LXC) 기술 기반 가상화 플랫폼이다.
2. Docker 설치
필자는 윈도우 11 환경을 사용 중이므로 아래 포스팅을 참고해서 설치를 진행했다.
docker는 리눅스 기반이기 때문에 윈도우 환경에서 docker를 사용할 때 wsl을 활성화해야 한다고 한다.(필수는 아님)
[Docker] 윈도우 도커 설치방법(window 11)
Window11 도커 설치하기 (1) WSL2 활성화 Docker는 리눅스를 기반으로 합니다. 따라서 리눅스 운영체제 위에서 Docker를 실행시켜야 합니다. 윈도우 환경에서 리눅스를 사용할 수 있도록 도와주는 WSL2를
axce.tistory.com
3. Docker 이미지와 컨테이너
a. Docker 이미지란?
이미지는 애플리케이션과 해당 애플리케이션을 실행하는데 필요한 모든 종속성을 포함하는 템플릿이다.
도커 이미지가 어떻게 만들어 지는지 살펴보자.
Ubuntu 이미지를 만들기 위해서는 Layer1과 Layer2가 필요하다.
다음은 My JDK 도커 이미지를 만들기 위해서는 이미 만들어 놓은 Ubuntu용 이미지를 베이스 이미지로 사용하여 PostgreSQL만 추가해 주면 된다. 그렇다면 실직적으로는 Layer1, Layer2, JDK가 포함된 이미지가 만들어진다.
My WAS 이미지를 만들기 위해서는 My JDK 이미지를 베이스 이미지를 사용하면, 실직적으로는 Layer1, Layer2, JDK, WAS를 포함한 이미지가 만들어진다.
즉, 도커 이미지는 여러 계층으로 구성할 수 있으며, 각 계층은 이전 계층 위에 쌓인다.
도커 이미지는 Dockerfile을 사용하여 생성된다. 이미지를 만드는 스크립트 예시를 보자.
Dockerfile 예시
# 베이스 이미지 선택
FROM openjdk:17-jdk-slim
# 작업 디렉터리 설정
WORKDIR /app
# 애플리케이션 JAR 파일을 컨테이너로 복사
COPY target/my-spring-boot-app.jar app.jar
# 포트 노출
EXPOSE 8080
# 애플리케이션 실행 명령어
ENTRYPOINT ["java", "-jar", "app.jar"]
b.Docker 컨테이너
컨테이너는 앞에서 언급했듯이 애플리케이션을 독립적으로 실행할 수 있는 공간이라고 설명했다.
컨테이너는 동일한 호스트 운영 체제 커널을 공유하면서도 독립적인 파일 시스템, 네트워크 및 프로세스를 가진다. VM 보다 경량화된 방식으로 애플리케이션을 배포하고 실행할 수 있도록 해준다.
컨테이너를 실행하기 위해서는 도커 이미지(애플리케이션-재료)만 있으면 된다.
컨테이너 실행 예시
docker run -d --name my-container \
-p 8080:80 \
-e SPRING_PROFILES_ACTIVE=prod \
-v /host/config:/app/config \
--network my-network \
my-image
c. 옵션
-d; 백그라운드 실행
-p: 호스트와 컨테이너 간의 포트 매핑
-e: 컨테이너 내부에서 사용할 환경 변수 설정
-v: 호스트와 컨테이너 간의 볼륨을 마운트
-- name: 이름 지정
--rm: 컨테이너가 종료되면 자동으로 제거
-it: 인터랙티브 모드로 실행(터미널 입력 활성화)
--network: 컨테이너가 연결된 네트워크를 지정
-h: 컨테이너의 호스트 이름 설정
--restart: 컨테이너 재시작 정책 설정
-u: 컨테이너 내부에서 사용할 사용자와 그룹 설정
4. Docker Comose란?
여러 개의 Docker 컨테이너들을 하나의 서비스로 정의하고 구성해 하나의 묶음으로 관리하기 위한 도구로, 하나의 설정 파일로 여러 서비스들을 정의할 수 있다.
서비스: 컨테이너를 의미함.
프로젝트: 서비스들의 집합을 의미함.
Docker Comose로 사용하는 방법은 docker-copmose.yml 에 서비스를 정의하면 된다.
https://docs.docker.com/compose/
Docker Compose overview
Learn how to use Docker Compose to define and run multi-container applications with this detailed introduction to the tool.
docs.docker.com
docker-compose.yml 파일 예제
- 하나의 설정파일로 web 서비스와 database 서비스를 정의했다.
- 옵션들은 docker 옵션을 보면 유추가 가능하다.
- image: 이미지 지정
- environment: 컨테이너 내부 환경 변수 설정
- volumes: 호트와 컨테이너 간 볼륨 설정
- networks: 컨테이너가 연결될 네트워크를 지정
version: '3'
services:
web:
image: my-web-app
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
volumes:
- ./config:/app/config
networks:
- my-network
database:
image: postgres:13
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
volumes:
- db-data:/var/lib/postgresql/data
networks:
- my-network
volumes:
db-data:
networks:
my-network:
docker-compose.yml에 정의된 서비스 시작
docker-compose up -d
5. Docker 명령어 정리
docker images # 이미지 목록 조회
docker pull [OPTIONS] NAME[:TAG|@DIGEST] # 이미지 다운로드
docker rmi <image-id> # 이미지 삭제
docker ps # 도커 컨테이너 목록 조회
docker start <container-id> # 컨테이너 시작
docker stop <container-id> # 컨테이너 중지
docker rm <container-id> # 컨테이너 삭제
'DevOps > Docker & K8s' 카테고리의 다른 글
[Docker] Docker Compose 설치 (0) | 2024.09.02 |
---|---|
[Docker] CentOS에서 Docker 설치 (인터넷, 폐쇄망) (0) | 2024.07.19 |