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'