PSD( Private-Self-Development )

도커( Doker ) 본문

Backend/기타

도커( Doker )

chjysm 2024. 4. 29. 16:21

Docker ?

컨테이너 가상화 서비스

컨테이너 가상화를 실행하고 이를 제어하는 어플리케이션

 

OS 가상화

  • Host OS 위에 Guest OS 전체를 가상화
  • 자유도가 높으나, 시스템 부하가 많고 느림

컨테이너 가상화

  • Host OS 의 리소스를 적게 사용하며, 필요한 프로세스 만 실행
  • 최소한의 라이브러리와 도구만 사용한다.
  • 가볍고 빠르다

 

Container Image

  • Container 실행에 필요한 설정 값
  • Image 를 가지고 실체화 한 것이 Container

 

Docker 안에 Local 이라는 저장소에 이미지들을 보관하고 

이를 필요할 때 실행 구현하여 Container 를 운영한다.

 

Dockerfile

  • docker image 를 생성하기 위한 스크립트 파일
  • 자체 DSL(Domain-Specific Language) 문법 사용
FROM mysql:5.7 				# mysql 이미지를 만들겠다.

RUN apk add gettext 		# 이미지 빌드 과정에서 실행할 명령어 
RUN ["executable", "param1", "param2"]

ARG VERSION=latest			# 이미지 빌드 시 사용할 변수 

CMD ["mysqld"] 				# 컨테이너 실행 시 실행할 명령어

ENTRYPOINT command param1 param2
ENTRYPOINT [
	"java",
    "-Djava.security.edg=file:/dev/./urandom",
    "-jar",
    "user.jar",
]			 				# 컨테이너가 시작 되고 나서 실행하는 커맨드

EXPOSE <port> [<port>...] 	# 컨테이너가 리스닝할 포트 

COPY target/user.jar user.jar # 로컬 파일 이미지 내부에 복사 

ADD ../db_mount /var/lib/mysql 
	# COPY 기능 + 추가 기능
	# 원격 URL 로 다운로드 하여 복사 
	# 자동 압축 해제 기능 포함
    # COPY 를 권장 (더 투명하고 예측 가능하기 때문)
	# 원격 파일 다운로드가 필요한 경우, ADD 대신 RUN 명령어와 wget/curl을 사용하는 것이 권장됩니다. 이는 이미지 크기를 줄이고 레이어를 최소화하는 데 도움이 됩니다

VOLUME /tmp 				# 컨테이너 안에 디렉토리 설정

WORKDIR /usr/src/app 		# 작업 디렉토리 설정


ENV MYSQL_ALLOW_EMPTY_PASSWORD true 
ENV MYSQL_DATABASE mydb 	# 환경변수 설정

LABEL version="1.0" description="This is my app" # 이미지 메타데이터 설정 

FROM mysql:5.7 				# 새로운 stage 시작

 

docker-compose.yml

여러 컨테이너를 정의 및 실행 하도록 하는 정의서

networks: # 브릿지 네트워크 설정 해당 네트워크 로 설정된 컨테이너들은 서로 통신 가능 하다.
  test-net:
    driver: bridge

services: # 컨테이너들 정의
  mariadb:
    build: # 이미지 빌드
      context: . # 빌드 디렉토리 경로
      dockerfile: Dockerfile.mariadb # 해당 도커 파일로 빌드 해라
    image: test/test-mariadb # 컨테이너 생성에 사용할 이미지 dockerfile 할 경우 이 이름으로 빌드된 이미지가 태그된다.
    container_name: mariadb # 컨테이너 이름 지정
    environment: # 컨테이너 내에서 사용할 환경 변수 배열 형식 지정
      - MARIADB_ROOT_PASSWORD=${MARIADB_ROOT_PASSWORD}
    ports: # 호스트와 컨테이너 간 포트 맵핑
      - "${MARIADB_PORT:-3306}:${MARIADB_PORT:-3306}"
    healthcheck: # 컨테이너의 건강 상태를 검사하는 테스트의 구성입니다. 테스트, 시작 기간, 인터벌, 시간 초과, 재시도 수를 정의하여 서비스의 건강 상태를 점검합니다.
      test: [ "CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MARIADB_ROOT_PASSWORD}" ]
      start_period: 10s
      interval: 10s
      timeout: 5s
      retries: 3
  	env_file:  # 외부 파일에서 환경 변수 로드 
    	- .env 
    command: --default-authentication-plugin=mysql_native_password # 컨테이너가 시작될 때 실행될 명령을 지정, 이는 Dockerfile 내의 CMD 지시어를 덮어쓴다.
    networks: # 컨테이너가 연결될 네트워크를 지정합니다. 여기에서 지정한 네트워크는 파일 상단의 networks 섹션에 정의되어야 합니다.
      - test-net
      
keycloak:
    depends_on: # 컨테이너 시작 순서 제어
      mariadb:
        condition: service_healthy # 컨테이너의 상태 지정 가능
    networks:
      - test-net

  keycloak-healthcheck:
    image: alpine # 가벼운 리눅스 운영체제 
    entrypoint: > # 컨테이너가 실행될 때마다 호출되는 명령을 오버라이드합니다. 이는 Dockerfile 내의 ENTRYPOINT 지시어를 덮어씁니다. 컨테이너의 기본 작업을 시작하기 위해 사용됩니다.
      /bin/sh -c "
      apk add --no-cache curl; \
      while ! curl --head -fsS http://keycloak:9000/health/ready; do \
        echo 'Waiting for Keycloak to be ready...'; \
        sleep 5; \
      done; \
      echo 'Keycloak is ready.'"
    depends_on:
      keycloak:
        condition: service_started
    networks:
      - test-net

  keycloak-init:
    volumes: #호스트와 컨테이너 간의 데이터 볼륨을 마운트합니다. 이를 통해 애플리케이션 데이터를 보존하거나 컨테이너 사이에 데이터를 공유할 수 있습니다.
      - ./keycloak-init.sh:/opt/keycloak/keycloak-init.sh:ro
    networks:
      - test-net

 

Docker 명령어

docker image ls # 이미지 리스트
docker images # 이미지 리스트
docker container ls -a # 컨테이너 리스트

docker run [OPTION] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
# -d : 백그라운드 모드 실행
# -p : 호스트와 컨테이너의 포트 연결
# -v : 호스트와 컨테이너의 디렉토리 연결
# -e : 환경 변수 설정
# -name : 컨테이너 이름 설정
# -rm : 프로세스 종료 시 컨테이너 삭제
# -it : 터미널 입력 옵션 
# -link : 컨테이너 연결
# run 의 경우, 이미지가 없으면 다운 받고 실행중인 컨테이너가 있으면 종료 후 실행한다.

docker system prune # 불필요 리소스 전부 삭제
docker stop mysql
docker container rm [container ID]
docker exec -it mysql bash # 컨테이너에 명령어 전달 할때

docker build -t [계정이름]/user-service:1.0 .[도커파일 명] # 이미지 생성
docker push [계정이름]/user-service:1.0 # repository 에 올린다 
docker pull [계정이름]/user-service:1.0 # repository 애서 다운

# 네트워크 
# 1. Bridge Network
docker network create --gateway 172.18.0.1 --subnet 172.18.0.0/16 ecommerce-network
docker network create --drive bridge [브릿지 이름] # 가상의 네트워크 를 구축하고 이를 포트포워딩 하겠다.

# 2. Host Network
# 호스트 네트워크 그대로 사용 포트포워딩 X

# 3. None Network 
# 네트워크 사용 X

docker network ls 
docker network inspect [네트워크 명] # 네트워크 설정 상세 보기


docker compose up -d --build --force-recreate "$SERVICE_NAME"
docker compose -f docker-compose.local.yml up -d --build --force-recreate $SERVICE_NAME
# -f : Docker Compose 파일 지정**
# up : 해당 파일에 있는 모든 서비스 올려라**
# -d : detached 모드 실행 ( 백그라운드 실행 )**
# --build : 서비스를 시작하기 전에 이미지 빌드, 이는 Dockerfile의 변경 사항이 있을 때 유용**
# --force-recreate : 컨테이너를 강제로 다시 생성 해라**
# -f 로 지정하지 않은 경우 **docker-compose.yml** 을 기본으로 올린다

docker compose down # 컨테이너들 정지
# -v  : volum 까지 다운 

docker logs -f 컨테이너이름 # 로그 확인 

docker image prune -f # 미사용 이미지 정리

 

'Backend > 기타' 카테고리의 다른 글

Maven 다중 프로젝트 설정  (0) 2024.12.17
헥사고날 아키텍처(Hexagonal Architecture)  (0) 2024.07.15
최소 지식 원칙( 데메테르의 법칙 )  (0) 2023.05.23
Nginx 란?  (0) 2023.01.19
DDD(Domain Driven Design)  (0) 2022.12.01