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'
5.Network 관리를 위한 docker compose
: docker compose를 위해선 docker-compose.yml 설정 파일을 하나 만들어야 한다.
docker compose up -d 로 docker-compose 파일에 설정해놓은 대로 실행시키기
실제 실행해야하는 프로젝트와 하지 않아도 되는 프로젝트가 있었으며 이를 위해 실행하지 않아도 되는 프로젝트에 bootJar.enabled = false 라는 옵션을 주었음.
모든 설정 및 변경을 마치고 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