일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- AWS
- grafana
- kubeadm
- aws s3
- zookeeper
- MAC address
- Trino
- JavaScript
- CVAT
- log
- jvm
- Python
- Spring
- PostgreSQL
- ip
- CSV
- kubectl
- kubernetes
- airflow
- java
- Packet
- helm
- OS
- Operating System
- docker
- Kafka
- EC2
- Vision
- tcp
- Network
- Today
- Total
JUST WRITE
Docker버전 제품 만들기(1) - image 만들기 본문
2020년에 다니고 있는 회사 내부 프로젝트에서 기술적인 부분만 발췌해서 정리한 글입니다.
Docker 버전 제품 만들기 프로젝트에서 가장 먼저 한 것은 제품의 docker image를 만드는 작업이었다.
회사 제품의 구성은 아래 3가지 구성이었다.
- 제품 Repository
- Java 기반 Web Application
- Database 관련 데이터 수집하는 Daemon Program
차례대로 image화 작업을 진행하였다.
Repository Image 만들기
Database 선정
회사 제품은 Oracle, PostgreSQL 2가지 Database를 지원하였다.
2가지 Database 중 공식적으로 docker Image를 제공하는 PostgreSQL로 결정하였다.
image 분리
PostgreSQL docker에서는 아래와 같이 간단하게 초기 Script를 실행시켜주는 방법이 존재하였다.
FROM library/postgres
# 초기 script 파일 적재 -> container 생성시 해당 Path에 있는 파일 실행
COPY init.sql /docker-entrypoint-initdb.d/
하지만 이미 초기 Script를 실행해 제품 Repository 설치해주는 서비스가 개발되어 있었다.
Script도 이미 해당 서비스 프로젝트에서 관리되고 있어 서비스를 활용하기로 결정하였다.
서비스 Image로 Container를 실행하여 PostgreSQL Container에 초기 데이터 적재하도록 구성하기로 하였다.
제품 Repository 쪽은 PostgreSQL 기본 Image + Repository 설치 서비스 Image 2가지 Image로 구성하였다.
Dockerfile 만들기
PostgreSQL은 기본 Image를 사용하는 거라 따로 작업하지 않았다.
Repository 설치 서비스를 docker image화 시키기 위해 Dockerfile를 작성하였다.
우선 해당 서비스가 Groovy로 개발되었기 때문에 JVM 환경이 필요하였다.
그래서 기본 Image를 OpenJDK로 선정하였다.
# 기본 image
FROM openjdk:8-slim
RUN apt-get upgrade && apt-get update && apt-get -y install netcat-openbsd
RUN mkdir -p /opt/encore
COPY target/repository_install_service.tar.gz /opt/repository_install_service.tar.gz
WORKDIR /opt
RUN tar zxvf repository_install_service.tar.gz
WORKDIR /opt/repository_install_service
RUN chmod 755 ARInstaller.sh
# java option 추가
ENV JAVA_OPTS="$JAVA_OPTS -Xms512M -Xmx1024M"
# 서비스 실행
CMD ./repository_install.sh -i ${AR_IP:-localhost} -p ${AR_PORT:-5432} -s ${AR_SID:-swjeong} -u ${AR_USER:-swjeong} -pw ${AR_PASSWORD:-swjeong}
** 제품명이 드러나는 부분으로 임의 명칭으로 대체
주요 부분
- OpenJDK Image 중 Java 8버전, 최소화를 위해 slim 버전으로 선정
- netcat-openbsd 패키지 설치 : 다른 container와의 통신을 위해 설치, 자세한 사항은 docker-compose 글에서 정리
- PostgreSQL 접속 정보를 서비스 실행 Argument로 전달 -> JCommander Library를 활용하여 개발
Web Application Image 만들기
기본 Image 선정
제품은 Spring 기반으로 만들어진 Web Application이다.
JVM, WAS 기반의 환경이 필요하였다.
그래서 오픈 소스이면서 가장 많이 사용되고 있는 Tomcat를 기본 Image로 하였다.
Dockerfile 만들기
FROM tomcat:8.5-jdk8-openjdk-slim
ENV CATALINA_HOME /usr/local/tomcat
WORKDIR $CATALINA_HOME
ENV MANAGER_USER swjeong
ENV MANAGER_PASS 123456
RUN apt-get update && apt-get install -y procps
RUN apt-get install -y libfontconfig1
# war 파일 복사
COPY target/product.war /usr/local/tomcat/webapps/product.war
# java option 추가
ENV JAVA_OPTS="$JAVA_OPTS -Xms4096M -Xmx4096M"
# docker container의 timezone을 서울로 변경
ENV TZ=Asia/Seoul
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
WORKDIR /usr/local/tomcat
# 8080포트
EXPOSE 8080
** 제품명이 드러나는 부분으로 임의 명칭으로 대체
주요 부분
- Tomcat Image 중 Java 8버전, 최소화를 위해 slim 버전으로 선정
- procps(프로세스 확인), libfontconfig1(글꼴 관련 필요 패키지) 패키지 설치
- 제품 war 파일 배포
Daemon Program Image 만들기
기본 Image 선정
제품 구성에서 Web Application와는 별도로 Daemon Program이 포함되어 있다.
해당 서비스는 Database 관련 데이터를 수집하여 제품 Repository에 적재하는 역할을 한다.
해당 Daemon은 Spring Boot 기반으로 만들어졌다.
JVM 환경이 필요하므로 OpenJDK를 기본 Image로 하였다.
Dockerfile 만들기
FROM openjdk:8-slim
# Docker Compose시 타 Container 종료 확인 할 수 있게 관련 패키지 설치
RUN apt-get upgrade && apt-get update && apt-get -y install vim && apt-get -y install iputils-ping
# war 파일 복사
COPY target/daemon.tar.gz /opt/daemon.tar.gz
WORKDIR /opt
RUN tar zxvf daemon.tar.gz
WORKDIR /opt/daemon
RUN chmod 755 *.sh
RUN mkdir logs
# java option 추가
ENV JAVA_OPTS="$JAVA_OPTS -Xms512M -Xmx1024M"
# docker container의 timezone을 서울로 변경
ENV TZ=Asia/Seoul
RUN ln -snf /opt/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 사용포트
EXPOSE 5001
# Daemon 실행
WORKDIR /opt/daemon
CMD ./daemon_start.sh ${AR_IP:-localhost} ${AR_PORT:-5432} ${AR_SID:-swjeong} ${AR_USER:-swjeong} ${AR_PASSWORD:-swjeong}
** 제품명이 드러나는 부분으로 임의 명칭으로 대체
주요 부분
- OpenJDK Image 중 Java 8버전, 최소화를 위해 slim 버전으로 선정
- iputils-ping 패키지 설치 : 다른 container와의 통신을 위해 설치, 자세한 사항은 docker-compose 글에서 정리
- PostgreSQL 접속 정보를 서비스 실행 Argument로 전달
정리
docker 버전 제품은 총 4가지 docker image로 구성되었다.
- PostgreSQL 기본 Image
- 제품 Repository 설치 서비스 Image(OpenJDK image 기반)
- Web Application Image(Tomcat image 기반)
- Daemon Program Image(OpenJDK image 기반)
다음 글에서는 어떻게 제품 Image를 관리, 자동 배포까지 하는지 정리하겠습니다.
'MLOps > Docker' 카테고리의 다른 글
Docker 제품 만들기(5) - Container 운영 (0) | 2021.10.04 |
---|---|
Docker 제품 만들기(4) - Image 배포 (0) | 2021.10.03 |
Docker 제품 만들기(3) - Image 빌드 개선 (0) | 2021.10.02 |
Docker버전 제품 만들기(2) - 자동 배포 (0) | 2021.09.25 |
Docker버전 제품 만들기(0) - 시작 (0) | 2021.09.18 |