Docker 는 프로젝트를 '이미지' 로 가져와서 '컨테이너' 를 생성해 배포를 가능하게 해줍니다.
열심히 만든 프로젝트를 '이미지' 로 만들기 위해서는 먼저 Spring 프로젝트를 jar 혹은 war 파일로 빌드해주어야 합니다.
프로젝트를 Build 해주기 전에,
먼저 Dockerfile 을 프로젝트에 추가해주어야 합니다.

사진처럼 프로젝트의 최상단 경로에서 Dockerfile 을 생성해줍니다.
[ Dockerfile ]
FROM openjdk:11-jdk
ARG WAR_FILE=build/libs/*.war
COPY ${WAR_FILE} app.war
ENTRYPOINT ["java","-jar","/app.war"]
- Dockerfile은 DockerImage를 생성하기 위한 설정파일 스크립트 입니다.
- 빌드 시, Docker는 Dockerfile에 나열된 명령문을 차례대로 수행하며 DockerImage를 생성해줍니다.
=> jdk11 에서 .war 로 된 파일을 COPY 해서 app.war 로 만들겠다.
( jar 파일로 배포되는 프로젝트라면 war => jar 로 만 바꾸어주면 됩니다. )
이제 Docker 에게 보낼 명령서도 작성해 두었겠다, 배포파일로 Build를 진행합니다.
프로젝트로 가서
gitBash 등 터미널에서 ( 프로젝트 최상위 경로 ) 빌드를 해줍니다.

: 빌드하기전에 clean 으로 기존 빌드를 지우고, 새롭게 build
빌드를 해주면
build - libs 경로에 war / jar 파일이 생성됩니다.

이제 로컬에 있는 저 jar/war 파일을 ==> AWS 의 깡통서버에 옮겨야 합니다.
옮기는데는 DockerHub 를 이용해 주었습니다.
DockerHub에 새로운 Repository 를 만듭니다.

마찬가지로 프로젝트의 gitBash 등 터미널에서
docker build --build-arg DEPENDENCY=build/dependency -t backcoderjune/askproject .
~ ... -t 도커허브아이디/생성한리포지토리 .
도커허브의 리포지토리로 build를 해주면
=> Dockerfile 에 작성된 스크립트 내용대로 실행하며 '이미지' 로 빌드를 해주게 됩니다.
docker push backcoderjune/askproject
만들어진 이미지를 push 해줍니다.
( 마치 GitHub 에 push 하는 과정과 유사합니다. add . / push )
push 가 완료되면 dockerhub 사이트 레포지터리에 빌드해둔 프로젝트가 올라가 있는 상태입니다.
이제 AWS 깡통서버에 가서 Docker 를 이용해 DockerHub 에 있는 저 빌드된 프로젝트를 PULL 해올겁니다.
docker pull 을 해주면 dockerHub 에 있는 우리의 프로젝트는 빌드된 상태의 '이미지' 로 docker 에 생성됩니다.
EC2 깡통 서버에 먼저 Docker 를 설치해줍니다.
( 출처 : https://velog.io/@mooh2jj/AWS-EC2-Docker-%EC%84%A4%EC%B9%98 )
Docker, docker-compose 설치
AWS EC2-instance에 docker를 설치하는 방법이다.ubuntu 버전에 docker 설치는 다음 명령어를 따른다.정확한 설치방법은 docker 가이드문서에서 꼭 확인하고 설치하자.https://docs.docker.com/engine/install
velog.io
# 오래된 버전 삭제
sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get update
# repository 설정
sudo apt-get -y install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
# Docker의 Official GPG Key 를 등록
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# stable repository 를 등록
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Docker Engine 설치
sudo apt-get update
sudo apt-get -y install docker-ce docker-ce-cli containerd.io
# 설치 완료 확인, 버전 확인
docker --version
docker 설치가 완료되었고, 로그인을 해줍니다.
임시권한을 주고 로그인해 줍니다.
sudo chmod 666 /var/run/docker.sock
docker login
이제 EC2 깡통서버에서 docker에 접속해있습니다.
위에서 dockerHub 에 우리의 프로젝트를 Push 해두었던 걸 이 docker에서 PULL 을 해옵니다.
docker pull backcoder/askproject
( docker pull 도커허브아이디/리포지토리 )
=> PULL 되어오면서, 우리의 프로젝트는 빌드가 완료된 IMAGE 상태로 Docker 에 받아와 집니다.
[ docker 이미지 확인 ]
docker images

프로젝트가 '이미지' 로 생성되어 있는 것을 확인 할 수 있습니다.
이제 우리의 프로젝트 '이미지' 로 ==> '컨테이너' 를 생성해주면 사실상 배포가 완성됩니다.
[ 이미지로 컨테이너로 생성 ]
docker run -p 8080:8080 --name springboot-mysql 프로젝트이미지ID
docker run 으로 컨테이너를 생성해줄 수 있고
-p 로 포트번호를 연결시켜 줍니다.
--name 은 컨테이너 이름을 지어주고
-d 는 백그라운드에서 실행되도록 해줍니다.
프로젝트이미지ID 로 위에서 docker images 로 확인한 IMAGE ID 를 써줍니다.
이렇게 해주면 컨테이너가 생성되고 Spring 프로젝트가 실행,
AWS 의 퍼블릭 IP :8080 포트로 (-p 로 지정한 포트) 접속이 가능합니다.
( EC2 인스턴스에서 인바운드 규칙 포트를 열어두어야 합니다. )
배포가 완료 된 것이죠.
AWS 깡통 서버에 해준거라고는
Docker 설치 => Docker Pull 로 프로젝트 이미지 가져오기 => Container 생성 => 끝
입니다. 마법같네요.
하지만 이렇게 컨테이너를 생성해서 사용하면, 각 컨테이너들은 독립적으로 구성되기 때문에
(1) 우리 프로젝트 컨테이너
(2) DB연동을 위한 MySQL 컨테이너
두 개를 생성해 두었더라도, 둘 사이에는 '연결고리' 가 없는 상태가 됩니다.
즉, 프로젝트에서 DB 를 사용할 수 없는 상태입니다.
다음글에서는 이 두 독립적인 컨테이너들을 연결시켜주는 과정을 다루어보고자 합니다.
서버에 JDK 부터 시작해 한땀한땀 개발환경을 구성해서 배포해보고,
Docker를 사용해 배포를 진행해보니, 편의성이나 속도 측면에서 확실히 Docker 가 많이 이용되는 이유를 알 수 있었습니다. 하지만 중요하고 큰 서버의 경우는 가상환경인 docker container 보다는 직접 개발환경을 구축해서 진행하는게 더 선호되고 있다고도 합니다. 필요에 따라 적절한 방법으로 배포환경을 구성하는 역량을 키워가야 겠습니다.
'Back to the Docker' 카테고리의 다른 글
| [ Docker ] Spring 프로젝트 컨테이너+ MySQL 컨테이너 연동하기 (0) | 2022.12.28 |
|---|---|
| [ Docker ] docker 란 (0) | 2022.12.28 |