이 글에서는 "2단계 : Docker 컨테이너를 통해 구축하기" 에 해당하는 과정을 진행해보겠다.
1. 도커 설치
2. 도커 이미지 빌드
3. 도커 컨테이너 실행
4. 도커 이미지를 도커 허브에 업로드
사실 나는 이미 도커가 설치되어있다... 그래도 우선 정리해보면
sudo apt-get update
# 도커 설치
sudo apt install -y docker.io
# 버전 확인
sudo docker -v
# 사용자 확인
who
id
echo $USER
# 그룹 추가 및 확인
## Docker는 기본적으로 root 권한을 필요로 하므로,
## 일반 사용자가 Docker 명령어를 사용할 수 있도록 하기 위해서 docker 그룹에 사용자를 추가해야 함
tail /etc/group
sudo usermod -aG docker $USER
tail /etc/group
# 재부팅 없이 반영
newgrp docker
tail /etc/group
ubuntu
라는 사용자가 잘 추가됐다.
2. 도커 이미지 빌드
도커 이미지를 빌드할 디렉터리를 만들고, 해당 디렉터리로 들어가서 Dockerfile을 만든다.
vi Dockerfile
FROM openjdk:17
COPY demo-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
현재 위치에 있는 jar 파일을 컨테이너로 복사해서 실행하는 것이다.
이때 이전에 빌드했던 jar 파일을 사용하면 안되고, 새로 만들어야 한다.
application.properties
파일을 수정해서 새로 빌드해야 하기 때문이다. 이번에는 로컬에 있는 mysql 서버가 아니라 mysql 도커 컨테이너를 사용할 것이기 때문에 /src/main/resources 하위에 있는 aplication.properties
파일에서
spring.datasource.url=jdbc:mysql://localhost:3306/app?serverTimezone=Asia/Seoul
->
# mysql-server라는 이름의 mysql 컨테이너의 3306 포트로 통신
spring.datasource.url=jdbc:mysql://mysql-server:3306/app?serverTimezone=Asia/Seoul
이렇게 localhost 를 나중에 실행할 mysql 컨테이너 이름으로 수정해줘야 한다.
수정이 잘됐음을 확인한 후 다시 jar 파일을 빌드한다. 이때 확실히 하기 위해 빌드하기 전에 기존에 생성된 jar 파일을 다 지워준다.
Dockerfile이 있는 디렉터리로 이동해서 잘 빌드된 jar 파일을 복사한다.
cp /home/ubuntu/for-app-deploy/cicd-test/build/libs/demo-0.0.1-SNAPSHOT.jar .
이제 자원이 다 마련됐으니 도커 이미지를 빌드한다.
docker buildx build --tag backend-server .
빌드가 잘 됐고, 이미지가 잘 생성됐음을 확인할 수 있다.
먼저 백엔드 컨테이너와 mysql 컨테이너를 연결해줄 네트워크를 만들어준다.
docker network create --driver bridge app-network
네트워크가 잘 생성됐음을 확인했다.
어플리케이션 컨테이너를 실행하기 전에 먼저 mysql-server 컨테이너를 실행해야 한다. mysql-server 컨테이너가 있어야 어플리케이션 컨테이너가 DB 연결이 돼서 정상적으로 실행된다.
docker run --name mysql-server --network app-network\
-e MYSQL_ROOT_PASSWORD=root\
-e MYSQL_USER=app \
-e MYSQL_PASSWORD=app \
-e MYSQL_DATABASE=app \
-p 3307:3306 \
-d mysql:latest
run 명령어를 사용하면 이미지를 다운받아서 컨테이너 실행까지 완료해준다.
mysql 컨테이너에 워크벤치로 접속할 일은 없어서 따로 포트 매핑은 안해줘도 될 것 같긴 하지만 만일의 경우를 대비해서 일단 해주었다.
mysql 컨테이너로 접속해서 app database가 잘 생겼는지 확인을 해준다.
docker exec -it mysql-server mysql -u app -p
잘 생겼음을 확인했다.
이제 backend-server 이미지를 이용해서 어플리케이션 컨테이너를 실행한다.
docker run --name backend-server --network app-network -d -p 8080:8080 backend-server:latest
컨테이너가 잘 실행이 되었는지 확인한다.
api 요청도 정상적으로 잘 가는지 시험해본다.
개체를 먼저 만들고, get 요청으로 두 학생을 다 가져올 수 있는지 확인해보겠다. 포트는 로컬에서 8081포트로 요청을 보내면 우분투 서버의 8080포트로 전달을 받고, 이 우분투 서버의 8080포트 요청이 도커 컨테이너의 8080 포트로 매핑된다.
{
"name": "Glinda"
}
{
"name": "Elphaba"
}
정상적으로 잘 가져온다!
전에 접속한 mysql 컨테이너에서도 확인해보자.
잘 확인이 된다! 이제 작동을 하는 것을 확인했으니 도커 허브에 어플리케이션 이미지를 올려볼 것이다.
우선 도커 이미지를 업로드할 도커 허브 레포지터리를 만들어준다.
이제 우분투 서버에서 도커 허브에 로그인을 한다. 나는 이전에 로그인했던 기록이 있어서 별도로 뭘 하지 않아도 바로 로그인이 되었다.
이제 backend-server 이미지를 도커 레포지터리에 업로드할 것이다.
# 로컬의 도커 이미지를 도커 허브에서 인식할 수 있는 이름표로 지정
## 로컬에 [계정명]/app-for-infra-test:ver1의 이미지가 생성된다.
docker tag backend-server:latest [계정명]/app-for-infra-test:ver1
# 도커 허브로 업로드
docker push [계정명]/app-for-infra-test:latest
ver1의 이미지가 잘 업로드됐다.
이제 [계정명]/app-for-infra-test:ver1
를 pull
받아서 컨테이너를 실행할 수 있다.
2단계도 잘 마쳤다. 이제 다음 글에서 3단계를 진행해보겠다.