docker로 이미지를 만들어보자!
우선 도커파일이 필요하다!
도커파일 안에는 예를 들어 아래의 포맷으로 구성되어져있다.
FROM : 이미지를 생성할 때 사용할 기반 이미지를 지정.
openjdk:8-jdk-alpine 라고 하면 알파인 OS에 JDK 8을 설치한 이미지 이다.
RUN : 이미지를 생성할 때 실행할 코드를 지정한다.
아래에서는 패키지를 설치하고 파일 권한을 변경하기 위해 사용.
WORKDIR : 작업 디렉토리를 지정. 해당 디렉토리가 없으면 새로 생성한다.
작업 디렉토리를 지정하면 그 이후 명령어는 해당 디렉토리를 기준으로 동작한다.
COPY : 파일이나 폴더를 이미지에 복사한다. 상대경로를 사용할 경우 WORKDIR로 지정한 디렉토리를 기준으로 복사한다.
ENV : 이미지에서 사용할 환경변수 값을 지정. 아래에서 PROFILE을 dev로 지정했는데 이 경우 컨테이너를 생성할 때 PROFILE 환경 변수를 따로 지정하지 않으면 default로 dev를 사용한다.
ENTRYPOINT : 컨테이너 구동 시 실행할 명령어를 지정한다.
아래의 Dockerfile을 보면 필요한 것이 2가지이다.
jar 그리고 jar를 실행하기 위한 쉘스크립트 파일
ex) java 관련
FROM openjdk:8-jdk-alpine
RUN apk --no-cache add tzdata && cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime
WORKDIR /
COPY target/java-collector.jar target/java-collector.jar
COPY build_docker.sh run.sh
RUN chmod 774 run.sh
ENV PROFILE=production
ENTRYPOINT ["./run.sh"]
이제 체크 및 만들어보자! 프로젝트 그리고 run을 할 수 있는 환경을!
내가 테스트 하려고 하는 프로젝트의 내용 중에 아래와 같이 토폴리지를 수행하는 shell이 있다.
아래의 내용이며 cmd=부분에 storm으로 jar를 실행시켜주는 즉, 토폴로지를 실행하는 부분이 있다.
#!/usr/bin/env bash
# current dir
#declare curpath=`dirname $(readlink -f $0)`
declare curpath=`dirname $0`
# load env
. $curpath/environment.sh
# submit topology
echo "Submitting topology"
cmd="$STORM jar $DEPLOY_FILE org.apache.storm.flux.Flux --remote --resource $FLUX_TOPOLOGY_RESOURCE_FILENAME --filter /${FLUX_FILTER_FILENAME}"
echo "Submit command: $cmd"
eval $cmd
retval=$?
exit $retval
그런데 storm에서 topology를 수행하려면 storm 명령어를 수행할수 있어야하며 프로젝트 jar파일이 필요하다.
토폴로지를 코딩한 스톰 프로젝트는 가지고 있으며 jar를 뽑아 낼 수 있다.
그런데 storm 명령어를 수행하려면 이미지를 만들때 storm이 베이스가 되어야 한다.
그래서 우선 스톰 베이스 이미지를 먼저 만들고 그 베이스를 가지고 jar 및 storm running을 하는것을 만들어보자.
첫번째 storm base image!
FROM adejonge/jre
# Loosely based on wurstmeister containers
ENV STORM_VERSION 2.3.0
ENV STORM_HOME /opt/apache-storm-${STORM_VERSION}
RUN wget -q -O - http://mirrors.sonic.net/apache/storm/apache-storm-${STORM_VERSION}/apache-storm-${STORM_VERSION}.tar.gz | tar -xzf - -C /opt
RUN ln -s $STORM_HOME/bin/storm /usr/bin/storm
VOLUME /mnt/storm
ADD storm.yaml $STORM_HOME/conf/storm.yaml
ADD log-config.xml $STORM_HOME/logback/cluster.xml
ENTRYPOINT ["/usr/bin/storm"]
docker build -t 태그명:1.0 . 등으로 위의 도커파일을 가지고 이미지를 만들었다.
Dokcerfile 외 아래와 같은 파일이 있어야 한다.
log-config.xml
<?xml version="1.0"?>
<configuration scan="true" scanPeriod="60 seconds">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
</Pattern>
</layout>
</appender>
<appender name="ACCESS" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${storm.log.dir}/access.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>${storm.log.dir}/access.log.%i</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>9</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>100MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSZZ} %c{1} [%p] %m%n</pattern>
</encoder>
</appender>
<appender name="METRICS" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${storm.log.dir}/metrics.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>${storm.log.dir}/logs/metrics.log.%i</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>9</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>2MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%d %-8r %m%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
<logger name="backtype.storm.security.auth.authorizer" additivity="false">
<level value="INFO" />
<appender-ref ref="ACCESS" />
</logger>
<logger name="backtype.storm.metric.LoggingMetricsConsumer" additivity="false" >
<level value="INFO"/>
<appender-ref ref="METRICS"/>
</logger>
</configuration>
storm.yaml
storm.zookeeper.servers:
- "zookeeper"
storm.local.dir: "/mnt/storm"
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
nimbus.host: "nimbus"
이것을 도커 허브에 push해준다.
docker push 태그명
'CM > docker' 카테고리의 다른 글
Dockerfile 명령어 정리 (0) | 2022.06.10 |
---|---|
Docker 리서치 (0) | 2021.02.03 |
Docker ? (0) | 2017.06.27 |
about docker (0) | 2017.04.27 |