docker 빌드로 이미지를 만들어보자!(작성 중)

2022. 1. 25. 20:46CM/docker

반응형

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