
Docker와 Docker compose에 대해 학습하고 실습을 진행했다.
Docker는 애플리케이션을 쉽게 만들고, 테스트하고, 배포할 수 있게 도와주는 소프트웨어 플랫폼이다.
애플리케이션을 컨테이너라는 가볍고 이식성 있는 패키지로 실행할 수 있다.
Docker 이미지는 애플리케이션을 실행하는 데 필요한 모든것(코드, 런타임, 시스템 도구, 시스템 라이브러리 등)을 포함한다.
컨테이너화: 애플리케이션과 필요한 모든 것을 하나의 패키지로 묶어 어디서든 실행할 수 있다.
경량: Docker는 운영 체제의 커널을 공유하므로, 가상 머신보다 훨씬 가볍고 빠르게 실행된다.
이식성: Docker 컨테이너는 어디서든 동일하게 실행된다. 예를 들어, 개발자의 컴퓨터에서 테스트 서버, 운영 서버까지 동일하게 동작한다.
확장성: Docker를 사용하면 여러 개의 컨테이너를 효율적으로 관리하고 쉽게 확장할 수 있다.
docker-compose.yml:
version: '3'
services:
web:
image: nginx
ports:
- "8080:80"
app:
build: .
ports:
- "8081:8080"
depends_on:
- db
db:
image: postgres
environment:
POSTGRES_PASSWORD: example
version: Docker Compose 파일의 버전을 지정한다.services: 애플리케이션의 각 서비스를 정의한다.web, app, db: 각각의 서비스 이름이다.image: 서비스를 실행할 Docker 이미지를 지정한다.build: Dockerfile이 있는 디렉토리 경로를 지정하여 이미지를 빌드한다.ports: 호스트와 컨테이너 간의 포트를 매핑한다.depends_on: 다른 서비스가 먼저 실행되어야 하는 순서를 지정한다.environment: 컨테이너의 환경 변수를 설정한다.docker compose up -d
docker compose -f /path/to/your/project/docker-compose.yml up
docker compose down
docker compose build
docker compose ps
docker compose logs


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);
}
}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;
}
}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();
}spring.application.name=service-a
server.port=18080
service.b.url=http://localhost:18081import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class BController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
}spring.application.name=service-b
server.port=18081
도커의 외부 포트를 조절하여 애플리케이션을 실행할것이기 때문에 포트를 모두 아래와 같이 8080으로 변경한다.
spring.application.name=service-a
server.port=8080
service.b.url=http://service-b:8080
spring.application.name=service-b
server.port=8080
version: '3.8'
name: myProject
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
나의 경우 에러가 발생하여 프로젝트명을 명시해두었다. 원래는 명시하지 않아도 된다. (작성하지 않아 발생한 관련 이슈 👉 클릭)
docker compose up -d
