이 글은 도커 네트워크를 사용하여 백엔드와 데이터베이스를 연동하여 배포하는 방법에 대해 정리한 글입니다.
이번 글에서는 이전에 Spring Boot를 통해 만든 백엔드 서버와 데이터베이스(PostgreSQL)를 도커로 띄우고 배포하는 작업을 진행할 것이다. DB와 벡엔드 서버가 궁금한 분들은 아래 글을 참고하면 된다.
[Backend][Spring Boot] JPA(Java Persistence API)와 회원정보 데이터베이스
[Backend][Spring Boot] JPA(Java Persistence API)와 회원정보 데이터베이스
이 글은 회원정보 데이터베이스와 API를 설계하는 방법에 대해 정리한 글입니다.JPA (Java Persistence API)이 글에서 하고자 하는 핵심 작업은 "자바 클래스를 만들어서 데이터베이스 테이블로 변신시
devkuk.tistory.com
[Backend][Spring Boot] 회원정보 데이터베이스를 API로 만들어보자!
[Backend][Spring Boot] 회원정보 데이터베이스를 API로 만들어보자!
이 글은 데이터베이스를 API 만드는 방법에 대해 정리한 글입니다.앞선 글에서는 회원정보 데이터베이스를 생성했었다.[Backend][Spring Boot] JPA(Java Persistence API)와 회원정보 데이터베이스 [Backend][Spri
devkuk.tistory.com
Docker 준비
Dockerfile 작성
도커로 배포하기 위해서는 Dockerfile이 필요하다. Dockerfile은 도커 이미지(Docker Image)를 자동으로 생성하기 위해 작성하는 텍스트 파일이다. 아래와 같이 간단하게 작성할 수 있다. (도커 파일은 Dockerfile이라는 확장자가 따로 없는 파일이며, 항상 Dockerfile이라는 이름으로 프로젝트 루트 디렉토리에 위치한다.)
FROM amazoncorretto:17
WORKDIR /app
COPY build/libs/*.jar app.jar
ENTRYPOINT ["java", "-Duser.timezone=Asia/Seoul", "-jar", "app.jar"]
FROM ...: 기본 환경 불러오기 (Java 17이 이미 설치되어 있는 리눅스 환경을 가져옴)WORKDIR ...: 작업할 폴더를 따로 만듦 (추후에 복잡해지는 경우를 대비)COPY ...: 해당하는 파일을WORKDIR안으로 복사 (호스트에 있는.jar파일을app.jar이름으로 복사)ENTRYPOINT ...: 도커 컨테이너가 실행되면 자동으로 해당 명령어를 실행
자동 실행 명령어CMDvsENTRYPOINTDockerfile에는 컨테이너 자동 실행 명령어로CMD와ENTRYPOINT가 존재한다. 이 둘의 차이는docker run명령어를 실행했을 때 발생한다.
👉CMD: 변경 가능!
✅Dockerfile에 작성해둔 명령어는 기본값(Default)일 뿐이며, 실행할 때 다른 명령어가 입력되면Dockerfile에 작성해둔CMD명령어는 무시되고 입력한 새로운 명령어가 실행된다.
👉ENTRYPOINT: 변경 불가능!
✅Dockerfile에 적어둔 명령어가 고정으로 실행된다. 만약 컨테이너를 실행할 때 다른 명령어를 추가하면 해당 명령어는 원래 명령어(ENTRYPOINT) 뒤에 이어서 붙여진다.
Docker Build
Dockerfile을 만들었으니, 이제 도커 이미지를 빌드해야 한다. 도커 이미지는 플랫폼에 종속되기 때문에 어디에서 사용할 것인지에 따라 적절한 명령어를 선택해야 한다.
같은 플랫폼에서 빌드하기
도커 이미지를 빌드하는 환경과 동일한 환경에서 컨테이너를 실행할 이미지는 docker build 명령어로 도커 이미지를 만들면 된다. (ex. 윈도우에서 빌드 후 윈도우에서 실행)
# 형식: docker build -t [도커허브ID]/[이미지명]:[태그] .
docker build -t devkuk/backend:latest .
-t: 이미지에 이름(tag)를 붙여준다..:Dockerfile이 현재 폴더에 있다는 의미 (위 명령어는Dockerfile이 있는 프로젝트 루트 디렉토리에서 실행해야 함)
다른 플랫폼(크로스 플랫폼)으로 빌드하기
도커 이미지는 다행히도(?) 크로스 플랫폼 빌드를 지원한다. 윈도우(amd64)에서 빌드해서 리눅스(arm64)로 보낼 때 사용한다. 이때는 buildx라는 도구를 사용하며, 만들자마자 도커 허브로 바로 보내는 --push 옵션을 함께 사용하는 것이 가장 편하고 에러가 적게 발생한다.
# 형식: docker buildx build --platform [목표플랫폼] -t [도커허브ID]/[이미지명]:[태그] --push .
docker buildx build --platform linux/arm64 -t devkuk/backend:latest --push .
--platform linux/arm64: 어떤 플랫폼에서 실행할 도커 이미지인지 지정--push: 빌드가 완료되면 로컬에 따로 저장하지 않고 바로 도커 허브로 업로드 (해당 옵션이 있으면 따로 허브에 업로드하는 작업을 하지 않아도 됨)
도커 허브에 업로드
--push 옵션을 사용하지 않고 빌드를 진행했다면, 따로 업로드 과정을 거쳐야 한다.
먼저 아래 명령어로 도커 허브에 로그인을 진행한다. (도커 허브 계정을 생성한 후 진행하면 된다.)
docker login
그리고 나서 도커 허브에 넣으면 된다. 이때, 본인의 도커 허브 ID와 동일하지 않으면 권한이 없어서 거부 당하게 된다.
# docker push [도커허브ID]/[이미지명]:[태그]
docker push devkuk/backend:latest
서버 세팅하기
도커 이미지를 만들고, 도커 허브에 업로드까지 완료했으니 이제 도커 파일을 실행할 서버 세팅을 진행해야 한다. (서버 세팅은 Nginx가 설정되어 있다(8080포트)고 가정하고 진행)
도커 네트워크 (Docker Network)
기본적으로 서로 다른 도커 컨테이너들은 남이기 때문에 통신 하기 위해서는 동일한 네트워크에 있어야 한다. 도커 네트워크를 생성하면 IP 주소가 바뀌더라도 서로의 컨테이너 이름만 알면 찾아갈 수 있다.
아래 명령어로 도커 네트워크를 생성한다.
# docker network create [네트워크 이름]
docker network create my-network
도커 볼륨 (Docker Volume)
도커 컨테이너는 삭제하면 데이터도 함께 삭제된다. 컨테이너가 사라져도 데이터는 영구적으로 보관할 수 있도록 별도의 저장 공간(Volume)을 만들어야 한다.
아래 명령어를 이용하여 데이터를 저장할 볼륨을 만든다. (PostgreSQL 사용 예정)
# docker volume create [볼륨 이름]
docker volume create pgdata
DB 올리기 (PostgreSQL)
통신을 위한 네트워크와 데이터를 저장하기 위한 볼륨을 생성했으니, 이제 이 위에 실제 데이터베이스를 올려야 한다. PostgreSQL 공식 컨테이너를 사용하여 올려보자.
(앞에서 생성한 네트워크와 볼륨을 잘 연결해야 하며, 비밀번호는 본인이 사용할 비밀번호로 바꿔줘야 한다.)
docker run -d \
--name my-db \
--network my-network \
-v pgdata:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=1234 \
postgres:15-alpine
--network my-network: 만든 네트워크에 연결-v pgdata:/var/lib/postgresql/data: 만든 볼륨을 DB의 데이터 폴더와 연결 (데이터 폴더는 기본값 그대로 사용)postgres:15-alpine: 가볍고 안정적인 PostgreSQL 버전
백엔드 서버 올리기
데이터베이스까지 모두 도커로 실행했으니, 이제 해당 도커와 연결되는 백엔드 서버를 올려야 한다. 백엔드 서버의 application.properties 파일을 참고하여 변수로 지정한 값들을 넣어줘야 한다.
변수에 지정한 값을 넣을 때에는 -e를 넣어줘야 하며, 필요한 변수를 모두 넣어준다.
docker run -d \
--name my-backend \
--network my-net \
-p 8080:8080 \
-e DB_URL=jdbc:postgresql://my-db:5432/postgres \
-e DB_USERNAME=postgre \
-e DB_PASSWORD=1234 \
devkuk/backend
-e DB_URL=...:jdbc:postgresql://(프로토콜) +my-db(데이터베이스 (도커) 이름) +:5432(DB 포트) +/postgres(DB 이름)-p 8080:8080: 외부에서8080포트로 들어오면 내부8080포트로 연결
이렇게 도커를 이용해서 PostgreSQL을 띄우고 백엔드 서버도 띄워서 둘을 연결하는 것까지 시도했다. 지금까지의 과정을 아키텍처로 살펴보면 아래와 같다.

끝!!
'🖥️ Dev > Infra' 카테고리의 다른 글
| [Infra][Docker][Error] docker: Error response from daemon: unauthorized (0) | 2026.02.08 |
|---|---|
| [Infra][Server] 포트포워딩 없이 외부에서 내 서버로! 연결 확인 및 첫 웹 서버 배포 (with. Tailscale) (0) | 2026.01.26 |
| [Infra][SSH] 이중 NAT 환경에서 포트포워딩 없이 외부에서 라즈베리파이 접속하기 (with. Tailscale) (0) | 2026.01.23 |
| [Infra][Docker] 도커 이미지 이해하기 (1) | 2025.07.20 |
| [Infra][Docker] 도커 기본 명령어 모음 (0) | 2025.07.20 |
since 2025.01.27. ~ 개발자를 향해....🔥