전체 프로젝트에 대한 Docker 이미지 생성하기

김한규·2023년 6월 27일
0

Docker

목록 보기
4/4
  1. 해당 모듈에 Docker 설정해줄 Dockerfile 만들기
    예시) FROM openjdk:11 RUN mkdir -p deploy WORKDIR /deploy COPY ./build/libs/api-0.0.1.jar api.jar ENTRYPOINT ["java" , "-jar" ,"/deploy/api.jar"]

** 여러개의 빌드 시 docker-build.sh 라는 파일을 만들어 해당 파일로 순서에 맞게 빌드하도록 만든다.

예시)

#!/bin/sh

#Setting Versions
#shellcheck disable=SC2034
VERSION='1.0.1'

cd ..
./gradlew clean build -x test

#shellcheck disable=SC2006
ROOT_PATH=`pwd`
echo $ROOT_PATH

echo 'api docker image build... Start'
cd $ROOT_PATH/api && docker build -t api:$VERSION .
echo 'api docker image build... Finish'

echo 'consumer docker image build... Start'
cd $ROOT_PATH/consumer && docker build -t consumer:$VERSION .
echo 'consumer docker image build... Finish'

echo 'css docker image build... Start'
cd $ROOT_PATH/css && docker build -t css:$VERSION .
echo 'css docker image build... Finish'

echo 'nginx docker image build... Start'
cd $ROOT_PATH/nginx && docker build -t nginx:$VERSION .
echo 'nginx docker image build... Finish'
  1. Docker Image 생성하기
    : docker build -t test-consumer:0.1 .
  2. Docker Image 생성이 잘 되었는 지 확인하기
    : docker images
  3. 해당 Container 실행하기
    : docker run test-consumer:0.1

5.Network 관리를 위한 docker compose
: docker compose를 위해선 docker-compose.yml 설정 파일을 하나 만들어야 한다.
docker compose up -d 로 docker-compose 파일에 설정해놓은 대로 실행시키기

  1. 실제 실행해야하는 프로젝트와 하지 않아도 되는 프로젝트가 있었으며 이를 위해 실행하지 않아도 되는 프로젝트에 bootJar.enabled = false 라는 옵션을 주었음.

  2. 모든 설정 및 변경을 마치고 Docker Container 들 모두 연결시키도록 하였는데 2가지의 문제가 발생하였음.
    1) DB 연결 실패
    해당 문제는 docker network ls를 하여 보니 network 가 여러 개 있는 것을 발견하였고 그래서 잘못 잡힌 것으로 추정하여 DB 에 하기의 옵션을 추가하였더니 해결되었다. 한 2-3 시간 골머리를 썩었다..
    --network docker_fintech (해당 네트워크로 모든 docker container들을 실행시킴)

    **추가적으로 이를 위해 사용하였던 옵션은
    docker network inspect [Network명]
    이였는데 이를 통해 다른 컨테이너들이 어느 Network에 떠 있는지 확인할 수 있었다.

2) Kafka 연동 이상
테스트해보니 Producer 에서 발행이 잘 되지만.. consumer가 정상적으로 작동하지 않는다. 확인해보니 consumer의 bootstrap.servers가 계속해서 localhost:9092로 설정 되기 때문인데.. 도대체 이를 어떻게 고쳐야할 지 모르겠다. 구글링을 해보고 이것저것 찾아봤는데도 도무지 되질 않아서 지금은 살짝 손을 놓은 상태.. 혹시 이 글을 보신 고수님이 계신다면 알려주시면 감사하겠습니다..
제가 몇 번이나 확인하여 설정들은 다 정상적인 것으로 확인했는데.. 놓친 부분이 있을지 모르겠습니다. 코드는 하기와 같습니다.

KafkaConfig 파일

companion object {
        const val bootstrapServer = "kafka:9092"
        const val groupIdConfig = "groupId"
        const val autoOffsetResetConfig = "earliest"
    }

 @Bean
    fun producerFactory() : ProducerFactory<String , String> {
        val configurationProperties = HashMap<String, Any>()
        configurationProperties[ProducerConfig.BOOTSTRAP_SERVERS_CONFIG] = bootstrapServer
        configurationProperties[ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG] = StringSerializer::class.java
        configurationProperties[ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG] = StringSerializer::class.java

        return DefaultKafkaProducerFactory(configurationProperties)
    }

    @Bean
    fun consumerFactory() : ConsumerFactory<String , String> {
        val configurationProperties = HashMap<String, Any>()
        configurationProperties[ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG] = bootstrapServer
        configurationProperties[ConsumerConfig.GROUP_ID_CONFIG] = groupIdConfig
        configurationProperties[ConsumerConfig.AUTO_OFFSET_RESET_CONFIG] = autoOffsetResetConfig
        configurationProperties[ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG] = StringDeserializer::class.java
        configurationProperties[ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG] = StringDeserializer::class.java

        return DefaultKafkaConsumerFactory(configurationProperties)
    }

    @Bean
    fun kafkaListenerContainerFactory() : ConcurrentKafkaListenerContainerFactory<String, String> {
        val factory = ConcurrentKafkaListenerContainerFactory<String, String> ()
        factory.consumerFactory = consumerFactory()
        return factory
    }

    @Bean
    fun kafkaTemplate() : KafkaTemplate<String, String> {
        return KafkaTemplate(producerFactory())
    }

KafkaListener 하는 부분

@KafkaListener(topics = ["topic"] , groupId = "groupId" , containerFactory = "kafkaListenerContainerFactory")
    fun loanRequestTopicConsumer(message : String) {
        val loanRequestKafkaDto = objectMapper.readValue(message , LoanRequestDto::class.java)

        loanRequestService.loanRequest(loanRequestKafkaDto)
    }

docker-compose.yml에 kafka설정부분

  kafka:
    image: wurstmeister/kafka:2.12-2.5.0
    container_name: kafka
    ports:
      - "9092:9092"
    networks:
      - network
    environment:
      KAFKA_ADVERTISED_HOST_NAME: kafka
      KAFKA_ZOOKEEPER_CONNECT : zookeeper:2181
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
profile
사회에 기여하는 개발자가 되기 위해 성장하고 있습니다!

0개의 댓글