일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 디자인패턴
- 항해99
- 개발자부트캠프추천
- Spring multimodule
- 개발자 취업
- KPT회고
- DesignPattern
- 디자인 패턴
- 인프콘 2024
- 파이썬
- 99클럽
- infcon 2024
- jwttoken
- JavaScript
- 1주일회고
- spring batch 5.0
- 빈 충돌
- 프로그래머스 이중우선순위큐
- 구글 OAuth login
- @FeignClient
- 빈 조회 2개 이상
- 단기개발자코스
- 커스텀 헤더
- 코딩테스트 준비
- jwt
- 전략패턴 #StrategyPattern #디자인패턴
- Python
- 프로그래머스
- 취업리부트코스
- TiL
- Today
- Total
m1ndy5's coding blog
Ditto 프로젝트 docker-compose 1편 - Docker란, Docker Cache, Docker Network 본문
Ditto 프로젝트 docker-compose 1편 - Docker란, Docker Cache, Docker Network
정민됴 2024. 3. 7. 22:48"Docker is a must" said job posting.
어느새 개발자 사이에서 필수가 되버린 Docker
대체 넌 누구냐?? 알아가보자.
What is Docker?
Docker는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼이다.
Docker는 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징하며, 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것들이 포함되어 있다.
Docker를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있다.
도커 이미지 & 컨테이너
도커 이미지는 컨테이너를 만드는 데 사용되는 읽기 전용 템플릿이다.
컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있는 도커파일을 만든 후 Dockerfile을 빌드하여 이미지를 만든다.
FROM openjdk:17-jdk
LABEL authors="minsung"
COPY ./build/libs/ditto-module-user-0.0.1-SNAPSHOT.jar user.jar
EXPOSE 8087
ENTRYPOINT ["java", "-jar", "user.jar"]
위는 Docker 파일의 예시인데 jar 파일을 실행시키기 위한 jdk를 설정하고 해당 컨테이너가 jar파일을 실행시키도록 설정했다.
도커 컨테이너는 도커 이미지를 실행한 상태이다.
이미지로 컨테이너를 생성하면 이미지의 목적에 맞는 파일이 들어가있는 파일 시스템과 격리된 시스템 자원 및 네트워크를 사용할 수 있는 독립된 공간이 생성된다.
하나의 도넛 레시피에서 여러 종류의 도넛을 만들 수 있는 것과 같이, 하나의 도커 이미지로 여러 개의 도커 컨테이너를 만들 수 있다.
기존의 이미지를 변경해도 이미 실행중인 도커 컨테이너에는 영향을 주지 않는다.
도커 톺아보기
docker ps라는 명령어를 사용해서 실행 중인 컨테이너들의 목록을 확인할 수 있다.
- Container Id : 컨테이너에 할당되는 고유한 컨테이너 ID
- Image : 컨테이너를 생성할 때 사용된 이미지
- Command : 컨테이너가 시작될 때 실행될 명령어
- Created : 컨테이너 생성 후 경과 시간
- Status : 컨테이너의 상태
- Ports : 컨테이너가 개방한 포트와 호스트에 연결된 포트
- Names : 컨테이너 이름
도커의 동작 방식
일반적인 서버라면 운영체제 위에 프로그램이나 데이터가 직접 올라가지만
도커를 사용하는 경우엔 운영체제 위에 도커 엔진이 동작하고 그 위에서 컨테이너가 동작한다.
도커 엔진은 도커의 핵심 구성 요소로서 컨테이너의 빌드, 실행, 관리를 담당하는 소프트웨어다.
도커 엔진
도커 엔진은 주로 도커 데몬이라고 불리는 백그라운드 프로세스로 실행된다.
이 데몬은 호스트 시스템에서 동작하며 컨테이너의 빌드, 실행, 관리 등을 담당한다.
도커 클라이언트는 사용자가 커맨드 라인이나 API를 통해 도커 데몬과 상호 작용할 수 있도록 해준다.
도커 이미지는 도커 레지스트리에 저장되고, 필요한 경우 도커 클라이언트가 이 레지스트리에서 이미지를 pull하여 로컬 환경에 가져올 수 있다. 도커 엔진이 도커 이미지를 기반으로 컨테이너를 실행하면 컨테이너는 호스트 시스템에서 격리된 환경에서 독립적으로 실행되며, 호스트 시스템과는 격리되어 있다.
도커 엔진은 컨테이너 간의 통신을 위한 네트워킹 기능을 제공하며, 컨테이너에서 생성되는 데이터를 영속적으로 저장하기 위한 볼륨도 지원한다. 네트워킹은 컨테이너 간 및 외부와의 통신을 가능하게 하며, 볼륨은 데이터를 컨테이너 외부에 유지하면서 여러 컨테이너 간에 공유할 수 있게 한다.
도커 네트워킹
도커 네트워킹은 컨테이너 간 또는 컨테이너와 호스트 간의 통신을 관리하는 기능이다.
도커는 기본적으로 각 컨테이너에 자동으로 네트워크를 할당하며, 사용자는 필요에 따라 사용자 정의 네트워크를 생성하고 구성할 수 있다.
도커에서 기본적으로 제공하는 세 가지 네트워크 모드는 bridge, host, none이다.
- bridge : 도커가 자체적으로 생성한 가상 브리지에 컨테이너를 연결하여 컨테이너 간 통신을 가능하게 한다.
- host : 호스트의 네트워크 네임스페이스를 공유하여 컨테이너가 호스트와 같은 네트워크에 참여할 수 있게 한다.
- none : 네트워크 연결을 생성하지 않아 외부와의 통신이 차단된다.
같은 네트워크에 속한 컨테이너는 서로의 컨테이너 명으로 통신할 수 있는데 이걸 몰라서 프로젝트할 때 조금 해맸다ㅜㅜ
나 같은 경우 요청을 게이트웨이를 통해 각 모듈로 로드밸런싱을 해주었는데 각 모듈과 게이트웨이 모듈은 독립적인 컨테이너에서 돌아가고 있었다. 따라서 docker를 띄우기 전에는 그저 localhost:8082 이런식으로 포트만 다르게 해주면 됐지만 각기 다른 컨테이너에서 돌아가고 있었기 때문에 localhost로 보내면 안됐고 각 컨테이너명을 이용해서 요청을 보내주었다.
@Configuration
@RequiredArgsConstructor
public class GatewayConfig {
private final AuthFilter authFilter;
@Bean
public RouteLocator ms1Route(RouteLocatorBuilder builder) {
return builder.routes()
.route("userAPI", r -> r.path("/api/members/**", "/api/auth/**", "/api/mypage/**")
.filters(f -> f.filter(authFilter))
.uri("http://user:8087")
)
.route("activityAPI", r -> r.path("/api/posts/**", "/api/follow/**")
.filters(f -> f.filter(authFilter))
.uri("http://activity:8081")
)
.route("newsfeedAPI", r -> r.path("/api/newsfeed/**")
.filters(f -> f.filter(authFilter))
.uri("http://newsfeed:8082")
)
.build();
}
}
도커 볼륨
도커 볼륨은 데이터를 컨테이너에 영속적으로 저장하기 위한 방법으로 사용된다.
컨테이너는 일반적으로 임시적인 파일 시스템을 가지며, 컨테이너가 종료되면 해당 데이터는 손실되지만
볼륨을 사용하면 컨테이너 간에 데이터를 공유하고, 데이터를 보존할 수 있다.
여러 컨테이너가 동일한 볼륨을 공유하면, 볼륨에 저장된 데이터를 서로 공유할 수 있고 이를 통해 여러 컨테이너 간에 데이터를 쉽게 전달하고 공동 작업이 가능하다.
도커의 캐시
순탄하게 도커를 사용하던 나,,, 아주 큰 문제에 빠지는데!!!!!!
문제 상황은 이러했다.
user의 포트를 8080에서 8087로 바꿔주었는데 컨테이너를 빌드해도 계속해서 8080 포트로 돌았다...
진짜 이게 무슨 문제인가 하고 3시간 동안 이것 저것을 다 찾아보았지만 찾지 못했고 자포자기의 심정으로 혹시나 chat gpt씨가 알까..? 하고 물어보았는데 정말 chat gpt 언제 이렇게 똑똑해 진거니?
원인은 바로 Docker의 캐시 때문이었다.
Docker는 이미지를 빌드할 때 캐시를 사용하여 빌드 속도를 향상시킨다.
만약 이미지를 다시 빌드하지 않고 이전에 빌드한 이미지를 사용했다면 내가 적용시킨 포트는 들어가지 않았을 것을 깨달았고
docker-compose build --no-cache
아래의 명령어를 입력하고 다시 빌드를 했더니 결과는 대성공이었다...!!!
옛날에 겪었던 강력 새로고침을 사용해 해결했던 캐시 문제가 생각나는 순간이었다...!!
결론
도커는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼이다.
Docker는 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징하며, 이 컨테이너에는 소프트웨어를 실행하는 데 필요한 모든 것들이 포함되어 있다.
하나의 도커 이미지로 여러개의 도커 컨테이너를 생성할 수 있고 기존 이미지를 변경해도 돌아가고 있는 컨테이너에는 영향을 주지 못한다.
컨테이너는 도커엔진 위에서 실행되며 도커의 네트워킹과 볼륨을 통해서 통신 및 데이터 저장&공유를 할 수 있다.
'Toy Projects > Ditto - Discuss Today's Topic' 카테고리의 다른 글
Ditto 프로젝트 동시성 문제 해결하기 4편 - Java에서 동시성을 제어하는 방법 (Synchronized, ConcurrentHashMap) (1) | 2024.03.25 |
---|---|
Ditto 프로젝트 동시성 문제 해결하기 3편 - 낙관적 락 Version, Select for Update (0) | 2024.03.13 |
Ditto 프로젝트 종목 불러오기 with batchUpdate (1) | 2024.02.29 |
Ditto 프로젝트 N+1 문제 2편 - N+1 문제 해결과 외래키 (2) | 2024.02.27 |
Ditto 프로젝트 N+1 문제 1편 - FetchType Lazy, Eager (0) | 2024.02.26 |