각 마이크로서비스와 관련 소프트웨어(db, kafka, rabbitmq 등)를 docker 컨테이너 가상화 시켜서 어플리케이션 배포에 활용한다.
Dockerfile은 Docker 이미지를 만들기 위한 스크립트 파일로서, 베이스 이미지 / 애플리케이션 jar 복사 / 패키지 설치 / 환경변수 설정 등의 명령어가 포함
FROM openjdk:17-ea-slim
VOLUME /tmp
COPY build/libs/auth-service-0.0.1-SNAPSHOT.jar auth-service.jar
ENTRYPOINT ["java", "-jar", "auth-service.jar"]
Dockerfile 을 기반으로 Docker 이미지를 생성하는 명령어
docker build [OPTIONS] [PATH]
[OPTIONS]
[PATH] : Dockerfile이 위치한 [로컬 Path || 원격 URL]
auth-service docker build 명령어
docker build -t auth-service:latest .
현재 디렉터리에 있는 Dockerfile 을 사용해서 auth-service:latest Docker 이미지 생성
로컬에서 생성한 docker image를 원격 Docker Registry(Docker Hub, AWS ECR 등) 에 업로드 하는 명령어
docker push [OPTIONS] NAME[:TAG]
[OPTIONS]
NAME[:TAG]
docker push onlydev7777/auth-service:latest
Docker Hub의 onlydev7777 계정에 auth-service:latest 이미지를 Push
Docker Registry(Docker Hub, AWS ECR 등) 에서 Docker 이미지를 다운로드하여 로컬 시스템에 저장하는 명령어
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
[OPTIONS]
NAME[:TAG|@DIGEST]
docker pull onlydev7777/auth-service
Docker Hub의 onlydev7777 계정에 auth-service:latest 이미지를 Pull
docker 컨테이너 간의 네트워크 통신을 가능하게 하는 사용자 정의 네트워크를 생성한다.
기본적으로 docker 컨테이너는 서로 격리된 환경에서 실행하지만, 동일한 네트워크 설정을 통해 컨테이너간의 통신을 허용할 수 있다.
docker network create [OPTIONS] NETWORK_NAME
[OPTIONS]
docker network create --gateway 172.18.0.1 --subnet 172.18.0.0/16 ediary-service-network
생성된 Docker 이미지를 기반으로 컨테이너를 생성하고 실행하는 명령어
docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]
[OPTIONS]
IMAGE[:TAG]
실행할 Docker 이미지의 이름과 태그
[COMMAND]
컨테이너 내에서 실행할 명령어
[ARG]
명령어에 전달할 인수(환경변수 아님)
docker run -d --name ediary-rabbitmq --network ediary-service-network \
-p 15673:15672 -p 5673:5672 -p 15672:15671 -p 4370:4369 \
-e RABBITMQ_DEFAULT_USER=guest -e RABBITMQ_DEFAULT_PASS=guest \
ediary-rabbitmq
docker run -d --network ediary-service-network --name ediary-prometheus \
-p 9091:9090 -v ./prometheus.yml:/etc/prometheus/prometheus.yml \
ediary-prometheus
docker run -d --network ediary-service-network \
--name ediary-auth-service \
-e "spring.cloud.config.uri=http://config-service:8888" \
-e "spring.rabbitmq.host=rabbitmq" \
-e "eureka.client.serviceUrl.defaultZone=http://discovery-service:8761/eureka" \
-e "logging.file=/api/logs/catalog-ws.log" \
ediary-auth-service:0.0.1
현재 호스트 서버에 빌드되어 있는 Docker Image 리스트 조회
docker images
Docker Image name 변경
docker image tag auth-service:0.0.1 ediary-auth-service:0.0.1
Docker Image 삭제
docker image rm IMAGE
현재 호스트 서버에 실행 되고 있는 컨테이너 리스트 조회
docker container ls
현재 호스트 서버에 등록 되어 있는 컨테이너 리스트 전체 조회
docker ps -a
컨테이너 실행/중단/리스타트/강제종료
docker container start CONTAINER
docker container stop CONTAINER
docker container restart CONTAINER
docker container kill CONTAINER
컨테이너 로그 출력
docker container log CONTAINER
컨테이너 삭제
docker container rm CONTAINER
사용하지 않는 이미지 삭제
docker image prune
중단 상태의 컨테이너 삭제
docker container prune
사용하지 않는 볼륨 삭제
docker volume prune
사용하지 않는 네트워크 삭제
docker network prune
사용하지 않는 Docker 시스템 삭제
docker system prune
docker-compose 는 여러 개의 Docker 컨테이너를 정의하고 동시에 관리하는 도구
docker-compose.yml 파일을 사용해서 Docker 컨테이너를 정의하고 단일 명령어로 여러 개의 Docker 컨테이너를 실행할 수 있다.
zookeeper 와 kafka 컨테이너를 정의한 docker-compose.yml 파일
networks:
emotion-service-network:
external: true
services:
zookeeper:
image: confluentinc/cp-zookeeper
container_name: emotion-zookeeper
environment:
ZOOKEEPER_SERVER_ID: 1
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
ports:
- "22181:2181"
networks:
- emotion-service-network
kafka:
image: confluentinc/cp-kafka
container_name: emotion-kafka
hostname: kafka
ports:
- "29092:29092"
networks:
- emotion-service-network
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
depends_on:
- zookeeper
networks:
emotion-service-network:
external: true
services:
zookeeper:
image: confluentinc/cp-zookeeper
container_name: emotion-zookeeper
hostname : zookeeper
environment:
ZOOKEEPER_SERVER_ID: 1
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
ports:
- "22181:2181"
networks:
- emotion-service-network
services:
kafka:
image: confluentinc/cp-kafka
container_name: emotion-kafka
hostname: kafka
ports:
- "29092:29092"
networks:
- emotion-service-network
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
depends_on:
- zookeeper
docker-compose.yml 파일에 정의된 서비스들을 이미지, 컨테이너 생성 및 백그라운드 실행
docker-compose up -d
docker-compose.yml 파일에 정의된 모든 컨테이너를 중지 하고 제거
docker-compose down
docker-compose.yml 파일에 정의된 모든 컨테이너를 중지
docker-compose stop
docker-compose.yml 파일에 정의된 모든 컨테이너를 리스타트
docker-compose restart
docker-compse.yml 에 정의된 서비스들의 이미지 빌드
docker-compose build
docker-compse.yml 에 정의된 서비스들의 컨테이너 상태 확인
docker-compse ps
이미 실행중인 컨테이너 내에서 명령어 실행
# kafka 서비스에 bash 셸 실행
docker-compose exec kafka bash
front-end("front-msa" 브랜치) : https://github.com/onlydev7777/emotion-diary-react
back-end : https://github.com/onlydev7777/emotion-diary-msa
docker-files : https://github.com/onlydev7777/emotion-diary-msa/tree/main/docker-files
inflearn-msa : https://github.com/onlydev7777/springboot-msa-3.0/tree/master