docker로 amazon-corretto 21 버전으로 배포하는 과정을 기록하고자 이 글을 적게 되었다. 중간중간에 에러도 있었고 배운 것도 많았기 때문에..
https://docs.aws.amazon.com/corretto/latest/corretto-21-ug/generic-linux-install.html
위 링크 타고 들어가면 alpine-linux 환경에서 어떻게 jdk 설치하는지 나와있다
alpine-linux 말고도 다양한 os 있음
참고해서 Dockerfile 내용 변경
FROM에 pull 받아져 있는 os가 없으면 알아서 pull 받아지는 것 같다
FROM alpine:3.19.1
RUN wget -O /etc/apk/keys/amazoncorretto.rsa.pub https://apk.corretto.aws/amazoncorretto.rsa.pub && \
echo "https://apk.corretto.aws/" >> /etc/apk/repositories && \
apk update && apk add amazon-corretto-21 && \
mkdir /app && mkdir /app/[프로젝트이름] && mkdir -p /logs/[프로젝트이름] && \
wget https://downloads.apache.org/tomcat/tomcat-9/v9.0.89/bin/apache-tomcat-9.0.89.tar.gz -P /app && \
mkdir /usr/local/tomcat && \
tar -xvf /app/apache-tomcat-9.0.89.tar.gz -C /usr/local/tomcat --strip-components=1
COPY ./app/[프로젝트이름] ./app/[프로젝트이름]
COPY ./app/[프로젝트이름] ./usr/local/tomcat/webapps
RUN chmod -R 755 /app/[프로젝트이름]/bin
COPY ./app/[프로젝트이름] ./usr/local/tomcat/webapps
COPY ./app/[프로젝트이름] ./app/[프로젝트이름]
RUN chmod -R 755 /app/[프로젝트이름]
COPY ./app/[프로젝트이름] ./app/[프로젝트이름]
RUN chmod -R 777 /app/[프로젝트이름]
CMD ["/bin/sh","-c","./app/[프로젝트이름].sh"]
원래 mkdir /app/[프로젝트이름] 실행문이 있어야되는데 왜인지 폴더 자체가 복사가 되어서 일단 뺐음
원래는 잘됐던 것 같은데;;
#issue 1
위 도커파일 기반으로 jdk21 환경에서 해주는 거랑 동일하게 빌드를 했는데 wget 구문에서 에러가 났다
WARNING: updating and opening https://dl-cdn.alpinelinux.org/alpine/v3.20/main:
temporary error (try again later)
이런 에러 였는데 build 실행문 옆에 - -network host 라는 옵션을 주니까 해결됐는데 지금 생각해보니까 ifup ens33을 안해서 났던 오류였던 것 같다 ㅠ ;; → 다시 테스트
참고 : https://github.com/gliderlabs/docker-alpine/issues/334
위 도커 파일 기반으로 새로운 container 생성해줌
docker run 실행문으로 실행시켜보니 exited 돼서 docker logs로 로그를 살펴보니 로그파일을 열 수 없다는 오류가 떠있었다 예전 이랬던 경우에는 실행 쉘 파일에 log 관련 라이브러리 경로가 이상하게 되어있어서 로그가 생성이 안됐적이 있었다. 근데 경로는 그대로 였음
근데 한 번더 실행해주니까 로그 제대로 생성됨 뭐임 ?
#issue 2
docker exec 실행문으로 서버에 접속을 해보니 프로그램 실행이 안되어서 xtorm system_2102.out 로그를 보니까
There is insufficient memory for the Java Runtime Environment to continue.
이런 에러가 떠 있었는데 검색을 해보니 JVM_OPT xmx 및 xms 사이즈 변경을 해줘야한다고 나와 있어서 반씩 내려줬다
2048 → 1024 / 1024 → 512
#issue 3
기존 aws에 구축되어있던 postgres 가 안돼서 따로 로컬에 postgres를 구축해줘야하는 상황이 발생했다.
그래서 db도 docker 컨테이너로 띄워서 연결해보기로 했다
우선 docker pull postgres을 실행시켜 postgres 이미지를 pull 받아주었다.
pull 받은 postgres 컨테이너를 run 시켜서 실행시켜주고 접속이 잘 되는지 확인해보았다.
docker run --name postgres -e POSTGRES_PASSWORD=postgre1234 -d --network postgres-test -p 15432:5432 postgres
db 컨테이너를 실행해줄 떄 더 다양한 옵션들이 많은데 나는 이렇게만 일단 사용했고
여기서 db password를 설정할 수 있고 나중에 접속할 때도 여기에 적은 정보로 접속하면 된다.
기본 username은 postgres
network는 나중에 밑에서 적을거고
-p : : → 호스트와 컨테이너의 포트를 연결한다. (헷갈리니까 port 번호를 다르게 하는 게 좋은 것 같다)
port 옵션에서는 a : b 이렇게 적었을 때 a에 해당하는 port가 외부에서 접속하기 위한 port고 b에 해당하는 port는 내부 접속용 port이다.
외부에서 docker container를 접속할 때는 a 에 해당하는 port로 접속해주거나 방화벽을 해제해주면 된다.
docker exec -it postgres bash
이렇게 뜨면 접속 성공한 것
docker container도 잘 뜨는 것을 확인하였으니 window 로컬 환경 dbeaver 에서 vm에 띄운 도커 디비 컨테이너에 접속하고자 했다.
이렇게 접속을 하면 되는데 처음에는 timeout request인가 그런 에러가 떴다
생각해보니 15432 port에 대한 방화벽 해제를 안해준 것… 하단 페이지 참고
원래는 localhost부분에 postgres 컨테이너 이름을 써줬다. 예전에 그렇게 했던 기억이 있어서.. 근데 실행이 안돼서 error log를 살펴보니
connection 오류가 떴다. 근데 생각해보니 이렇게 적는건 컨테이너 간의 통신을 위한 방식이고
지금은 DB만 컨테이너로 올라가 있는 상태이기 때문에
dbever에서 접속할 때도 ssh ip로 접속했으니까 localhost로 적으면 되지 않을까? 생각해서 localhost로 적어주니 연결에 성공하였다.
컨테이너 내부 통신이기 때문에 port number도 5432로 설정해준다.
docker run --network <network name>
명령을 사용하면 모든 컨테이너를 하나의 동일한 네트워크에 넣을 수 있다.
모든 컨테이너가 서로 통신할 수 있는 네트워크 생성
도커에서
--network
옵션을 사용해도 볼륨과는 달리 자동으로 네트워크를 생성하지 않는다. 따라서 네트워크 컨테이너를 만들어주어야 한다.
docker network create <network name>
명령으로 도커 내부 네트워크를 생성한다.
test container bash에 접속해서 db 컨테이너 이름으로 통신이 되는지 확인해야 한다
container name
test → 도커 postgres 컨테이너로 프로그램 설치해본 것 (openjdk21)
alpine-corretto21 → corretto21로 설치하다가 aws posrgres 막혀서 중단한거