윈도우 cmd 에서 아래 코드를 복붙할 경우, 실행되지 않는 문제가 발생합니다.
\(역슬래쉬) 뒤에 공백이 있는 것도 아니고 개행되는 명령어를 복붙하면 안되서
\ 없이 바로 -p, -e 옵션을 작성해주니 제대로 docker 실행됨을 확인 할 수 있었습니다.
docker run -d --name postgres-sample \
-p 5433:5432 \
-e POSTGRES_USER=admin1 \
-e POSTGRES_PASSWORD=admin2 \
-e PGDATA=/var/lib/postgresql/data/pgdata \
-v ${로컬_바인딩_폴더}:/var/lib/postgresql/data:z \
postgres
docker 컨테이너 내부 접속 및 해당 파일 확인
윈도우 cmd에서,
파일 목록 ls → dir
clear → cls
dir
실습 내용)
- 2개의 스프링 컨테이너를 생성하고 사용자가 service-a 컨테이너의 컨트롤러를 호출하면, service-b 컨테이너를 호출 합니다.
- 최종 사용자에게 노출 되는 메시지는 아래와 같습니다. ”service-a: hi ###### service-b: hello”
- 메시지 “service-b: hello” 는 service-b 컨테이너의 메시지입니다.
실습-1. intelliJ 사용 및 애플리케이션 생성
1. 프로젝트 생성(https://start.spring.io/) : name은 a, b로 생성
- dependeny 추가 : Lombok, Spring Web, OpenFeign
2. service-a 컨트롤러, 서비스 생성
// AAplication.java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@EnableFeignClients
@SpringBootApplication
public class AApplication {
public static void main(String[] args) {
SpringApplication.run(AApplication.class, args);
}
}
// AController.java
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor
public class AController {
private final BServiceClient bServiceClient;
@GetMapping("/hi")
public String hello() {
String hello = bServiceClient.getHello();
return "sevice-a: hi ###### service-b: " + hello;
}
}
// BServiceClient.java
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient(name = "service-b", url = "${service.b.url}")
public interface BServiceClient {
@GetMapping("/hello")
public String getHello();
}
# service-a application.properties
spring.application.name=service-a
server.port=18080
service.b.url=http://localhost:18081
3. service-b 컨트롤러 생성
// BController.java
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class BController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
}
# application.properties
spring.application.name=service-b
server.port=18081
4. “http://localhost:18080/hi" 접속하여 메시지 확인

실습-2. Docker 사용
1. application.properties 수정 : 서비스a,b 내부 포트는 8080 동일하게 하고, 도커의 외부 포트만 조절하여 애플리케이션 실행
# service-a > application.properties
spring.application.name=service-a
server.port=8080
service.b.url=http://service-b:8080
# service-b > application.properties
spring.application.name=service-b
server.port=8080
2. 각 service-a, service-b 폴더 내 Dockerfile 생성
FROM openjdk:17-jdk-slim
VOLUME /tmp
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.j
3. 도커 네트워크 생성 : 도커끼리 컨테이너 이름으로 호출하기 위해선 기본 브리지 네트워크가 아닌 사용자 정의 네트워크에서 진행 해야 함.
docker network create my-network
4. 서비스 실행 : 각 프로젝트 루트 폴더에서 진행함(터미널 커맨드 작성 위치는 Dockerfile의 위치)
# service-b 프로젝트 루트 폴더
# 프로젝트 빌드
./gradlew clean bootJar
# 이미지 생성(.은 도커파일의 위치)
docker build -t img-service-b .
# 컨테이너 생성
docker run -d --name service-b \
--networkt my-network \
-p 18081:8080 \
img-service-b
# 컨테이너 실행 확인
docker ps
# service-a 프로젝트 루트 폴더
# 프로젝트 빌드
./gradlew clean bootJar
# 이미지 생성(.은 도커파일의 위치)
docker build -t img-service-a .
# 컨테이너 생성
docker run -d --name service-a \
--networkt my-network \
-p 18080:8080 \
-e SERVICE_B_URL=http://service-b:8080 \
img-service-a
# 컨테이너 실행 확인
docker ps

5. http://localhost:18081/hello, http://localhost:18080/hi로 접속하여 확인

실습-3. Docker compose 사용
1. 기존 도커 컨테이너 모두 삭제
docker rm -f 서비스_A_컨테이너_아이디
docker rm -f 서비스_B_컨테이너_아이디

2. service-a와 service-b 프로젝트 상위 폴더에서 docker-compose.yml 파일 생성 및 작성
version: '3.8'
services:
service-a:
image: img-service-a
ports:
- "18080:8080"
environment:
- SERVICE_B_URL=http://service-b:8080
depends_on:
- service-b
service-b:
image: img-service-b
ports:
- "18081:8080"
networks:
default:
driver: bridge
3. 도커 컴포즈 실행 및 http://localhost:18080/hi 접속 확인
docker compose up -d

네트워크는 어떻게 연결된 걸까?
도커 컴포즈를 사용하여 서비스 실행 시, 기본적으로 새 브리지 네트워크를 생성하여 각 컨테이너를
그 네트워크에 연결합니다.
이 네트워크는 docker.compose.yml 파일에 정의된 모든 서비스가 서로 통신할 수 있도록 도와줍니다.
네트워크 생성 확인
docker-compose.yml 파일이 있는 디렉토리의 이름을 기반으로 합니다.
네트워크 이름은 "directoryname_default" 과 같은 형식으로 생성됩니다.
ex) dev_default 네트워크 이름 확인
docker 실행 명령어를 프로젝트의 HELP.md 또는 README.md 파일에 작성하고 복붙하여 터미널에서 사용하기.
그렇게 함으로써 도커 명령어를 확인하고 사용할 수 있습니다.
'공부' 카테고리의 다른 글
mono repo를 MSA 프로젝트 적용하기 위한 기초 지식 (0) | 2025.03.10 |
---|---|
대규모 스트림 처리 및 rabbitMQ 실습 (0) | 2025.03.07 |
Http Session과 Session Clustering 개념 (0) | 2025.02.28 |
Redis Insight 연결 안되는 문제 해결(인메모리 저장소 및 캐싱 전략) (0) | 2025.02.27 |
# @Entity에서 @builder 사용법 (0) | 2025.02.21 |