Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- Java
- TypeScript
- 디자인패턴
- Transaction Pattern
- 타입스크립트
- Parallel Old GC
- thread
- 알고리즘
- 체인 패턴
- Resilinece4j
- spring batch
- 디자인 패턴
- Spring Cloud Netfilx Eureka
- 멀티스레드
- saga pattern
- The law of Demeter
- JPA
- 스레드
- 생산자 소비자 패턴
- 스프링 배치
- 배치
- MSA
- Action Pattern
- 사가 패턴
- spring cloud
- java 정렬
- Serial GC
- 키클락
- Spring Boot Actuator
- zipkin
Archives
- Today
- Total
PSD( Private-Self-Development )
도커( Doker ) 본문
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 |