Dockerfile
- wildfly에서 이렇게 하라고 제공한다. 거기에 내가 원하는 대로 조금 수정했다.
- (TODO 나중에 원본 스크립트의 링크를 넣어두자)
FROM jboss/base-jdk:8
ENV DEBIAN_FRONTEND noninteractive
## Set the WILDFLY_VERSION env variable
ENV WILDFLY_VERSION 18.0.1.Final
ENV WILDFLY_SHA1 ef0372589a0f08c36b15360fe7291721a7e3f7d9
ENV JBOSS_HOME /opt/jboss/wildfly
USER root
RUN groupmod -g 2000 jboss && usermod -u 2000 jboss
RUN cd $HOME \
&& curl -O https://download.jboss.org/wildfly/$WILDFLY_VERSION/wildfly-$WILDFLY_VERSION.tar.gz \
&& sha1sum wildfly-$WILDFLY_VERSION.tar.gz | grep $WILDFLY_SHA1 \
&& tar xf wildfly-$WILDFLY_VERSION.tar.gz \
&& mv $HOME/wildfly-$WILDFLY_VERSION $JBOSS_HOME \
&& rm wildfly-$WILDFLY_VERSION.tar.gz \
&& chown -R jboss:0 ${JBOSS_HOME} \
&& chmod -R g+rw ${JBOSS_HOME}
COPY instance.conf /opt/jboss/instance.conf
COPY run-standalone.sh /opt/jboss/run-standalone.sh
RUN chown jboss:jboss -R /opt/jboss && chmod a+x /opt/jboss/run-standalone.sh
## RUN mkdir -p /opt/jboss/wildfly/standalone/log && \
## ln -sf /dev/null /opt/jboss/wildfly/standalone/log/server.log
## RUN mkdir -p /opt/jboss/wildfly/standalone/log && chown -R jboss.jboss /opt/jboss/wildfly/standalone/log
## VOLUME /opt/jboss/wildfly/standalone/log
## Expose the ports we're interested in
EXPOSE 8080
## Ensure signals are forwarded to the JVM process correctly for graceful shutdown
ENV LAUNCH_JBOSS_IN_BACKGROUND true
USER jboss
## Set the default command to run on boot
## This will boot WildFly in the standalone mode and bind to all interface
## CMD ["/opt/jboss/run-standalone.sh", "-b", "0.0.0.0"]
## CMD ["/opt/jboss/run-standalone.sh"]
docker.compose.yml
version: '3'
services:
was1:
build:
context: .
image: was-s0101
container_name: c-was-s0101
restart: unless-stopped
environment:
MY_INSTANCE_NAME: s0101
ports:
- 8001:8080
volumes:
- /app/NAS/project/kmac:/NAS
- /app/root/data/project/kmac/web-admin:/project/web-admin
- /app/root/log/s0101:/project/logs
- /app/root/data/wildfly/s0101/deployments:/opt/jboss/wildfly/standalone/deployments
command: /opt/jboss/run-standalone.sh
networks:
- mybridge
networks:
mybridge:
external: true
scripts
docker-compose up명령을 타이핑 하기 귀찮아서 스크립트를 만들었다.s0101, s0102인스턴스를 띄울 수 있는 설정이다.- 아직은 좀 부족하다
원래 하고자 하는 내용은 이건데
-d는detach모드를 의미한다. 백그라운드 데몬으로 실행한다.
$ docker-compose -f docker-compose.s0101.yml up -d
-d를 제거하면 포그라운드로 동작한다. 스크립트 동작 테스트할 때 요렇게 사용한다.
$ docker-compose -f docker-compose.s0101.yml up
실제로 요렇게 작성했다(보완필요)
instance_name=$1
extra_option=$2
## check clone folder
if [ "$instance_name" == "" ];then
echo "Usage:"
echo "$0 <instance_name> [extra-options]"
echo "example: $0 s0101 "
echo " $0 s0101 -it bash"
echo " $0 s0101 -d"
exit 1
fi
instance_config_file="docker-compose.${instance_name}.yml"
if [ ! -e $instance_config_file ]
then
echo "No such file: $instance_config_file"
exit 2
fi
mkdir -p /app/root/log/$instance_name
mkdir -p /app/root/data/wildfly/$instance_name
sudo chown app.root -R /app/root/log/$instance_name
sudo chown app.app -R /app/root/data/wildfly/$instance_name
# -f docker-compose.yml \
# -d \
instance_name=$instance_name \
docker-compose \
-f docker-compose.$instance_name.yml up \
-d \
--build $extra_option
WILDFLY 서버 설정
TODO
wildfly와 도커에 대한 고민
- 도커에 wildfly 컨테이너를 띄울때, war 파일이 포함된 이미지를 만드는 것이 바람직한 사용법이다. 그래야 컨테이너를 여러 개 띄우기가 좋고, 시스템 독립적으로 도커를 사용하게 된다.
- 하지만 각 컨테이너마다 설정이 달라야 한다면 그것은 같은 이미지가 아닌 것이다. 여러 컨테이너들이 누가 누구인지를 식별해야 하기 위해, 컨테이너마다 ID를 부여해야 하는데, 이를 위해 환경변수에 컨테이너의 ID를 부여했다. 각 컨테이너마다 다른 환경변수를 설정해야 하므로, 같은 이미지를 사용할 수가 없었다.
- 그래서 거의 비슷한 docker-compose.xml을 각 인스턴스별로 만들어야 했다. 더 좋은 아이디어가 필요하다.
Wildfly 서버 설정
Wildfly 인스턴스
-
실제 운영서버에서는 한 호스트에 두 개의 Wildfly 인스턴스를 띄우는 경우도 있다.
- 개발서버는 그럴 필요가 없지만, 운영환경과 동일한 설정으로 테스트해야 할 경우도 있으므로, 운영서버처럼 두 개의 인스턴스를 띄울 수 있는 구성을 했다.
-
개발서버는 평상시에는 인스턴스 1개로 운영하다가, 필요할 때만 잠깐 2개로 운영할 수 있으면 된다.
-
스크립트 또는 폴더, 파일이름에 s0101 또는 s0102가 포함된 경우가 있는데
s0101은 1번 서버의 1번 인스턴스를 의미하고,s0102는 1번 서버의 2번 인스턴스를 의미한다. - 개발서버의 운영은
s0101에서만 한다. 그리고 필요할 때만 잠시s0102를 운영할 것이다.
폴더 구조의 이해
standalone 모드를 기준으로 개발하는 것을 가정한다.
wildfly에서 공식 배포한 docker의 설정에서 기본 디렉토리는 아래와 같다. 컨테이너 내부의 디렉토리이다.
/opt/jboss/wildfly/standalone/
/opt/jboss/wildfly/standalone/log
/opt/jboss/wildfly/standalone/deployments
/opt/jboss/wildfly/standalone/configuration
deploy 하기
- war 파일을 배포하기 위해 wildfly 컨테이너의
/opt/jboss/wildfly/standalone/deployments폴더에 war 파일을 복사하면 된다. - 나는 war 파일이 포함되지 않은 빈 wildfly 도커 이미지를 컨테이너로 띄우고, war 파일은 호스트 OS의 특정 폴더에 복사하면 배포되도록 하고 싶다.
- 이를 위해 deployments 폴더에 대해 도커의 볼륨 매핑을 하면 된다.
docker-compose.yml파일에 아래와 같이 볼륨 매핑을 설정했다.
volumes:
- /app/root/data/wildfly/s0101/deployments:/opt/jboss/wildfly/standalone/deployments
- 이제 war 파일은 호스트 OS의
/app/root/data/wildfly/s0101/deployments에 복사하면 자동으로 배포된다.wildfly의 기본 설정에 autodeploy 옵션이 enable 되어 있어서 복사만 하면 자동으로 배포된다. 보통 운영서버에서는 수동으로 deploy를 한다.
WAR 파일 업로드
-
개발자 PC에서 war 파일을 업로드 하는 위치는
/app/NAS/opt/wars/kmac/폴더로 결정했다. 개발자는 이 폴더에 war파일을 업로드 한 후deployments폴더에 복사하면 war 파일이 배포된다. 이를 위해 간단히 스크립트를 작성해두었다.(kmac는 샘플 프로젝트명이다) -
개발자 PC에서 개발서버로 WAR 파일 업로드하기 위해
_build_dev.sh파일을 만들었는데, 이 스크립트에서 업로드 부분은 다음과 같다.
$ scp build/libs/kmac.war app@192.168.x.x:/app/NAS/opt/wars/kmac/kmac.war
디플로이
- 업로드 한 후에는, 개발 서버에 접속해서 WAR 파일을 디플로이한다.
$ cd /app/services/wildfly/scripts/s0101/kmac
$ ./deploy.sh
## 또는 undeploy
$ ./undeploy.sh
deploy.sh는 업로드한 war 파일을/app/root/data/wildfly/s0101/deployments폴더에 복사하는 스크립트다. 별거 없다.
redeploy 앨리어스 만들기
매번 폴더를 찾아서 deploy 하기는 번거로우니 아래와 같이 alias를 만든다.
alias redeploy1-kmac='/app/services/wildfly/scripts/s0101/kmac/deploy.sh'
alias redeploy2-kmac='/app/services/wildfly/scripts/s0102/kmac/deploy.sh'
alias redeploy-kmac='redeploy1-kmac'
- 이제 아무 폴더에서
redeploy-kmac를 실행하면 디플로이 된다.
로그 보기
-
wildfly 도커 컨테이너는
/opt/jboss/standalone/log/server.log에 로그를 남긴다. 그리고 stdout으로도 로그를 남기는데, 이것은 docker log 명령으로 확인할 수 있다. - 이리 저리 시도해보다가, docker log보다는 특정 파일에 로그를 남기는 것이 더 나을 것 같아서 도커 컨테이너의
/opt/jboss/standalone/log/server.log를 호스트 OS의/app/root/log/s0101/server.log에 남도록 볼륨 매핑을 설정하기로 했다. - 그리고 wildfly의 기본 로그 폴더를 변경하고 싶었다. 경로가 너무 길어서 잘 안외워져서
/project/logs에 로그를 남기도록 했다. - 즉, 도커 컨테이너는
/project/logs/server.log에 로그를 남기게 되고, 이 파일은 호스트 OS의/app/root/log/s0101/server.log에서 볼 수 있다. docker-compose.xml파일에 아래와 같이 볼륨 매핑을 설정했다.
volumes:
- /app/root/log/s0101:/project/logs
- ... 다른 매핑은 생략 ...
- 호스트 OS의
instance1.conf는s0101 도커 컨테이너의 설정이 담겨있는 파일이다.
아래와 같이 로그 디렉토리를 설정하고 있다.
$ cat /app/services/wildfly/instance1.conf
LOG_DIR="/project/logs"
... 생략 ...
- 이제 호스트 OS에서 로그를 보려면 아래와 같이
tail명령을 사용할 수 있다.
$ tail -f /app/root/log/s0101/server.log
- 자바 개발자에게 익숙한 jlog 앨리어스를 만들어둔다.
$ cat ~/.bashrc
alias jlog1='tail -f /app/root/log/s0101/server.log'
alias jlog2='tail -f /app/root/log/s0102/server.log'
alias jlog='jlog1'