[Docker] 도커(docker)
- 효율적인 배포와 확장:
- 도커는 컨테이너화 기술을 사용하여 애플리케이션과 모든 종속성을 포함하는 가상 환경을 만듭니다. 이는 배포가 훨씬 빠르고 간단해지며, 확장성이 뛰어납니다.
- 환경 일관성 유지:
- 도커 컨테이너는 모든 종속성과 환경 설정을 포함하기 때문에, 개발, 테스트, 스테이징, 프로덕션 등 모든 환경에서 동일한 환경을 유지할 수 있습니다.
- 리소스 분리와 격리:
- 도커는 호스트 시스템에서 각 컨테이너를 격리시켜 서로 영향을 주지 않고 독립적으로 실행할 수 있도록 합니다. 이는 성능을 최적화하고 보안을 강화하는 데 도움이 됩니다.
- 유연한 개발 및 테스트 환경:
- 도커는 로컬 환경에서 개발 및 테스트를 쉽게 할 수 있도록 도와줍니다. 개발 환경을 컨테이너로 패키지하고 간단히 공유할 수 있으며, 다양한 환경에서 실행할 수 있습니다.
- 마이크로서비스 아키텍처:
- 도커는 각 마이크로서비스를 독립적인 컨테이너로 실행하여 애플리케이션을 더 작고 모듈화된 형태로 유지할 수 있도록 도와줍니다.
- 클라우드 네이티브 애플리케이션 개발:
- 클라우드 네이티브 애플리케이션을 개발하고 운영하는 데 필수적인 기술로 도커가 활용됩니다. 컨테이너는 클라우드 환경에서의 확장성, 이식성, 관리 용이성을 높여줍니다.
구성
1. 도커 (docker)
2. 컨테이너
도커 컨테이너는 가상화된 환경을 제공하여 응용 프로그램을 실행하는 소프트웨어 패키지입니다. 이러한 컨테이너는 응용 프로그램을 실행하는 데 필요한 모든 것을 포함하며, 호스트 시스템과는 격리된 환경에서 실행됩니다. 이러한 격리는 응용 프로그램 간의 충돌을 방지하고 의존성 충돌을 해결하는 데 도움이 됩니다.
컨테이너는 베이스 환경의 OS를 공유하면서 필요한 프로세스만 격리하는 방식으로, 커널을 공유하기 때문에 호스트 OS의 기능을 모두 사용할 수 있습니다. 그렇기 때문에 컨테이너 위에서는 호스트 OS와 다른 OS를 구동할 수 없습니다.
3. 이미지레이어, 컨테이너레이어
- 이미지 레이어 (Image Layer):
- 이미지 레이어는 도커 컨테이너를 생성하는 데 사용되는 템플릿입니다.
- 각 이미지 레이어는 응용 프로그램 실행에 필요한 파일 및 설정과 같은 특정한 구성 요소를 포함합니다.
- 이미지 레이어는 여러 개의 읽기 전용 레이어로 구성됩니다. 이 레이어들은 상위에서 하위로 순차적으로 적용됩니다. 각 레이어는 기본적으로 이전 레이어의 변경사항만을 저장합니다. 따라서 동일한 레이어를 공유하는 이미지는 디스크 공간을 절약할 수 있습니다.
- 이러한 이미지 레이어들은 도커 허브(Docker Hub)와 같은 이미지 저장소에 저장되어 다른 사용자들이 공유하고 사용할 수 있습니다.
- 컨테이너 레이어 (Container Layer):
- 컨테이너 레이어는 실행 중인 도커 컨테이너의 상태를 포함합니다.
- 각 컨테이너는 이미지 레이어 위에 생성되며, 컨테이너 레이어에는 응용 프로그램이 실행되는 동안 생성되는 변경 사항이 저장됩니다.
- 이 레이어는 읽기/쓰기 가능한 레이어로, 컨테이너가 실행 중에 변경된 파일이나 설정을 저장합니다. 이는 컨테이너가 종료되고 다시 시작되어도 변경 사항이 유지될 수 있도록 합니다.
- 컨테이너 레이어는 컨테이너가 종료되면 보존되지 않고 제거됩니다. 따라서 컨테이너의 상태는 컨테이너 레이어에서만 유지되며, 이미지 레이어는 컨테이너가 종료되더라도 변하지 않습니다.
docker inspect ${image name}
명령어
docker {대상} {커맨드} {옵션} {인자}
- container
- image
- volume
- network
docker [command 대상] --help
커맨드 | 설명 | 주요옵션 |
start | 컨테이너 실행 | -i |
stop | 컨테이너 정지 | |
create | 컨테이너 생성 | --name, -e, -p, -v |
run | 이미지를 내려받고 컨테이너를 생성 및 실행 | --name, -e, -p, -v, -d, -i, -t |
rm | 컨터이너 삭제 | -f, -v |
exec | 컨테이너에서 프로그램실행 | -i, -t |
ls | 컨테이너 목록 출력 | -a |
cp | 컨테이너와 호스트 간 파일 복사 | |
commit | 컨테이너를 이미지로 변환 |
대상 - image
커맨드 | 설명 | 주요옵션 |
pull | 이미지를 내려받음 | |
rm | 이미지 삭제 | |
ls | 가지고 있는 이미지 목록을 출력 | |
build | 이미지 생성 |
옵션
도커 컨테이너 포트
: 컨테이너는 가상 IP주소를 할당받기 때문에 외부에서 컨테이너 접근은 불가능하다. 포트 포워딩을 통해 외부와의 연결통로를 뚫어야 합니다.
docker run -p 8080:80 httpd
도커파일 (Dockerfile)
: Docker 컨테이너 이미지를 생성하기 위한 텍스트 파일입니다. Dockerfile에는 Docker 이미지를 빌드할 때 사용되는 명령어와 설정이 기술되어 있습니다. Dockerfile을 사용하면 개발자는 자신의 애플리케이션을 컨테이너로 패키징하는 과정을 자동화할 수 있습니다.
# FROM : 베이스가 되는 기본이미지 OS 또는 런타임 이미지
FROM ubuntu:latest
# 작업 디렉토리 설정
# RUN, ENTRYPONT, CMD가 수행될 기본 디렉토리
WORKDIR /app
# 호스트의 디렉토리를 도커 컨테이너에 연결
VOLUME
# 의존성 설치
# RUN : 이미지를 빌드할 때 사용하는 커맨드를 설정
RUN apt-get update && apt-get install -y python3
# ADD : 이미지에 호스트의 파일이나 폴더를 추가
ADD
# 애플리케이션 파일 복사
# COPY : ADD와 비슷, 호스트의 파일이나 폴더를 이미지 안으로 복사
COPY . /app
# 환경 변수 설정 $name , ${name}으로 사용가능
ENV PORT=8080
# EXPOSE : 기본포트 설정
EXPOSE $PORT
# 실행 명령 설정
CMD ["python3", "app.py"]
# 도커 이미지가 실행될 때 사용되는 기본 커맨드를 지정
ENTRYPOINT
빌드
docker build ${option} ${dockerfile directory}
FROM httpd
COPY index.html /usr/local/apache2/htdocs
도커컴포즈 (docker-compose)
: Docker Compose는 여러 개의 독립적인 Docker 컨테이너를 사용하여 애플리케이션을 실행하기 위한 도구입니다. 주로 개발, 테스트, 스테이징 환경 등에서 복잡한 애플리케이션을 쉽게 관리하기 위해 사용됩니다. Docker Compose를 사용하면 여러 개의 컨테이너를 정의하고 구성하며, 한 번에 여러 컨테이너를 시작하고 중지할 수 있습니다.
일반적으로 Docker Compose는 YAML 파일을 사용하여 애플리케이션의 서비스와 해당 서비스를 실행할 때 필요한 설정을 정의합니다. YAML 파일에는 각 서비스의 이미지, 포트 매핑, 볼륨 마운트 등과 같은 설정이 포함됩니다. 그런 다음 Docker Compose 명령을 사용하여 이 파일을 기반으로 여러 컨테이너를 관리합니다.
image | 컨테이너의 이미지를 정의 |
build | Dockerfile의 경로를 지정해서 빌드 |
dockerfile | 도커파일의 명을 다른 명으로 사용할때 |
ports | 바인딩될 포트 |
volumes | 호스트이 지정된 경로로 컨테이너의 볼륨을 마운트 |
container_name | 컨테이너의 이름을 설정 |
command | 컨테이너 실행 후 컨테이너에서 실행시킬 쉘 명령어 |
environment | 환경변수 설정 |
env_file | 환경변수를 파일로 설정 |
depends_on | 컨테이너간 의존관계 설정 ex) DB, APP을 같이 올릴때 DB먼저 올릴 경우.. |
restart | 컨테이너의 재시작관련 설정 // docker restart <컨테이너_ID> |
실행
docker-compose -f ${yaml파일명} up -d -p ${프로젝트명}
Dockerfile의 장점:
- 단일 컨테이너 관리: Dockerfile을 사용하면 단일 컨테이너를 정의하고 빌드할 수 있습니다. 이는 단일 애플리케이션을 컨테이너화하고 배포하는 데 유용합니다.
- 자세한 제어: Dockerfile을 사용하면 컨테이너를 빌드하는 데 필요한 모든 단계를 명시적으로 제어할 수 있습니다. 이를 통해 컨테이너 이미지를 정확하게 커스터마이징할 수 있습니다.
Docker Compose의 장점:
- 다중 컨테이너 관리: Docker Compose는 여러 컨테이너로 구성된 애플리케이션을 관리하는 데 특화되어 있습니다. 이를 통해 여러 컨테이너 간의 관계를 쉽게 정의하고 한 번에 시작, 중지 또는 삭제할 수 있습니다.
- 간편한 설정: Docker Compose 파일을 사용하면 여러 컨테이너의 설정을 하나의 파일에 정의할 수 있습니다. 이는 환경 변수, 볼륨, 네트워크, 포트 매핑 등을 포함합니다.
- 스케일링 및 확장: Docker Compose는 서비스를 확장하고 여러 인스턴스를 실행하는 데 유용합니다. 이를 통해 테스트 또는 프로덕션 환경에서 애플리케이션을 쉽게 확장할 수 있습니다.
도커허브에서 이미지 pull
docker pull mariadb:10.6
docker pull redis
services:
aroundhub_db:
image: mariadb:10.6
container_name: db_master
restart: always
environment:
MARIADB_ROOT_PASSWORD: woo
MARIADB_DATABASE: woo
MARIADB_USER: woo
MARIADB_PASSWORD: woo
#volumes:
# - ./master_db/data:/var/lib/mysql
# - ./master_db/config/:etc/mysql/conf.d
ports:
- "3308:3306"
aroundhub_redis:
image: expert/ledisdb:6.6.4
restart: always
ports:
- "6380:6379"
도커 커밋
docker commit ${container_name} ${image_name}
도커 이미지/컨테이너 파일로 저장
도커 이미지 파일은 일반적으로 Docker Hub와 같은 이미지 레지스트리에 업로드되거나, 로컬 머신의 파일 시스템에 저장됩니다. 도커 이미지는 레이어로 구성되어 있으며, 각 레이어는 파일 시스템의 변경 사항을 나타냅니다.
docker save -o {저장할파일명.tar} {이미지이름:태그}
docker load -i {이미지파일.tar}
docker import {파일명.tar} {이미지명:태그}
docker export {컨테이너명} > {파일명.tar}
도커 SpringBoot 프로젝트 실행
Dockerfile
FROM openjdk:17.0.1-jdk
WORKDIR /app
COPY ./springboot_test.jar springboot_test.jar
ENV PROVILE="DIV"
ENTRYPOINT java -jar -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true springboot_test.jar --spring.profiles.active=$PROFILE
이미지생성
JVM 메모리 옵션
- InitialRAMPercentage: JVM이 시작될 때 사용할 총 시스템 RAM의 백분율을 설정합니다. 이것은 초기 힙 크기를 결정하는 데 사용됩니다. 예를 들어, -XX:InitialRAMPercentage=50은 시스템의 총 RAM의 50%를 초기 힙 크기로 사용하도록 지시합니다.
- MinRAMPercentage: JVM이 사용할 수 있는 최소한의 총 시스템 RAM의 백분율을 설정합니다. 이는 힙 크기가 축소되는 경우에만 사용됩니다. 예를 들어, -XX:MinRAMPercentage=10은 시스템의 총 RAM이 10% 미만으로 내려가지 않도록 합니다.
- MaxRAMPercentage: JVM이 사용할 수 있는 최대 총 시스템 RAM의 백분율을 설정합니다. 이것은 힙 크기가 확장되는 경우에만 사용됩니다. 예를 들어, -XX:MaxRAMPercentage=80은 JVM이 시스템의 총 RAM의 80%까지 사용할 수 있도록 합니다.
FROM openjdk:11
# JVM 옵션 설정
ENV JAVA_OPTS="-XX:InitialRAMPercentage=40 -XX:MinRAMPercentage=20 -XX:MaxRAMPercentage=80"
# 애플리케이션 실행
CMD [ "java", "-jar", "application.jar" ]