캐시 메모리 뭐임?

자주 사용되거나 최근에 사용된 데이터를 저장해 두고 , CPU가 다시 해당 데이터에 접근할 때 빠르게 처리할 수 있도록 도와줌.
속도가 빨라서 좋은데 비용 비싸고 용량 적음

CPU에는 캐시 메모리 2~3개 사용됨. L1,L2,L3 캐시 메모리라 함
일반적으로 L1 캐시 메모리 먼저 사용(여기서 캐시 못찾으면 L2로 감)



여기서 궁금한 점.. 요새 컴퓨터를 알아보고 있는데 CPU 라이젠에는 L4 캐시메모리 이런게 있을까? 

CPU에 캐시 메모리가 있다고 하는데?!

1. 라이젠 L4 없음 마찬가지임
2. 메모리 최적화된 기술이 있는데 , Infinity Fabric으로 고속 전송 가능해서 메모리 자원 빠르게 접근가능
3. Victim Cache 캐시 미스 발생 시 데이터를 임시 저장해서 다른 코어에서 다시 사용할 수 있게함.

왜 L4 캐시는 채택되지 않았을까?

AMD 라이젠에서 L4캐시를 채택하지않은 이유는 기술적 , 경제적 이유가 있음.
1. 필요성의 감소
L4캐시의 도입 목적은 더 큰 용량의 고속 캐시 메모리를 제공하여 성능을 개선하는 것인데, 이미 L3 캐시를 사용하여 성능을 극대화 하고 있음
용량 충분하고 L3 캐시 성능을 최적화하는 것이 더 효과적임
2. 설계 복잡성과 비용 증가
CPU 설계가 훨씬 복잡해짐 , 제조 비용 키우기 때문
3. L4 캐시 비용 대비 성능면에서 이점 적음 , 고성능 컴퓨팅에 많이 쓰는데 일반 사용자는 필요하지 않음



듀얼 코어 프로세서의 캐시 메모리 : 각 코어마다 독립된 L1 캐시 메모리 가지고 , 두 코어가 공유하는 L2 캐시 메모리가 내장됨
L1 : CPU 내부에 존재
L2 : CPU와 RAM 사이
L3 : 보통 메인보드

일반적인 PC나 랩탑용 CPU: L1 캐시 64KB, L2 캐시 512KB ~ 1MB, L3 캐시 8MB ~ 16MB 정도가 일반적.
고성능 서버용 CPU: L1 캐시 128KB, L2 캐시 1MB ~ 2MB, L3 캐시 20MB ~ 64MB 이상까지도 존재.

너무 용량이 적은거 아닌가?

캐시 메모리는 설계와 목적에 따라 최적화 되어 있음.
속도와 비용의 균형을 고려해서 128KB가 적정 , 더 큰 용량으로 하면 전력 소모와 물리적인 공간 비효율성 , 현재의 캐시 용량으로도 충분히 효율적인 성능을 제공

캐시 메모리는 데이터 접근 속도를 향상시키기 위해 CPU와 메인 메모리 사이 위치 , 데이터 요청 처리.

캐시 메모리의 작동원리는 ? 
1. CPU가 데이터나 명령어를 요청하면, 캐시 메모리에서 먼저 이 데이터를 찾음.
2. 캐시에서 데이터 찾기 ( 캐시 히트 , 캐시 미스 )
 캐시 히트 : 요청한 데이터가 캐시에 존재하는 경우 , 즉시 CPU에 제공 , CPU는 데이터를 캐시에서 빠르게 읽어옴
 캐시 미스 : 요청한 데이터가 캐시에 없는 경우 , 메모리에서 데이터를 가져와야 함
3. 메인 메모리에서 데이터 로드
 캐시 미스가 발생하면, CPU는 메인 메모리에서 요청한 데이터를 가져와야 함.
 CPU는 메인 메모리의 데이터가 위치한 주소를 지정 , 메인 메모리에서 해당 주소에 있는 데이터를 읽어옴.
4. 캐시에 데이터 저장
 캐시 라인에 저장 : 데이터를 특정 블록에 저장 , 요청한 데이터는 캐시의 적절한 위치에 저장됨
5. 데이터 반환
 메인 메모리에서 가져온 데이터가 캐시에 저장된 후 , 데이터는 CPU로 반환됨.
6. 캐시 꽉 차면 기존 데이터 교체
 LRU , FIFO , LFU 방식이 있음 (제조사 마다 다름)
7. 캐시의 일관성을 유지해야되는데 여러 코어가 있으면 하나의 캐시에서 변경되면 다른 캐시에서도 변경 됨.

캐시 미스의 유형은 ?
1. Cold Miss
 캐시가 처음 데이터 블록을 접근할 때 발생하는 미스,데이터가 캐시에 없어서 발생함. 이 미스는 데이터 블록이 캐시에 처음으로 들어오는 경우에만 발생
2. Conflict Miss
 두 개의 데이터 블록이 동일한 캐시 슬롯에 매핑되면,하나의 데이터 블록이 다른 블록을 덮어 쓰게 되므로,교체된 블록에 접근할 때 미스가 발생
3. Capacity Miss
 캐시 데이터 블록을 저장하기에는 너무 작아서 자주 접근되는 데이터가 자주 제거됨 , 다시 필요한 데이터가 캐시에 없는 경우 발생
 
캐시 크기를 키워서 문제를 해결? 파워를 많이먹고 접근 속도가 느려짐 효율 X


파워를 많이 먹는다 -> 파워는 뭘까?

마이크로닉스 파워


파워 서플라이(전원 공급 장치, Power Supply Unit)는 컴퓨터의 각 부품에 안정적인 전력을 공급하는 역할.

그럼 정확히 부품에 전력을 어떻게 넣는지 ?

1. AC 전력을 DC 전력으로 변환
가정용 전기(AC)를 컴퓨터가 사용 가능한 직류 전기(DC)로 변환
2. 필요한 전압으로 전력 분배
각 부품 고유의 전력 요구 사항 있음. 
마더보드,CPU = 12V 전원
드라이브,팬 = 5V OR 3.3V 전원 사용

이슈 내용
 - SQL Editor을 이용해서 쿼리 조회를 한 결과 12.4가 나온 컬럼이 있는데 , resultsettable에서는 12가 나온 결과 값
 
처음에 단순히 sql 결과값을 보여주는 줄 알았는데 아닌 것 같다.

VO를 거친 후 값이 나오는지?
데이터 베이스에서 데이터를 조회할 때 , 결과값은 ResultSet 형태로 반환 됨.
ResultSet의 데이터를 VO 객체에 매핑하여 사용하는 것이 일반적이라 private int라 되어 있으면 소수점 이하 값이 손실 됨.
소수점이 있는 컬럼값이 필요하면 double 이나 float으로 설계하는 생각을 가지고 있어야 함.

jdbc.resultsettable에 대하여 알아보자면,

JDBC(Java Database Connectivity) 는 이름 그대로 Java에서 데이터베이스와 통신하기 위한 API임.

JDBC를 사용하여 쿼리를 실행하고 , 결과를 가져온다.

jdbc.resultsettable은 일반적으로 특정 로거의 이름을 나타냄 , 다양한 설정을 통해 JDBC 작업에 대한 로그를 기록함

<logger name="jdbc.resultsettable" level="INFO" additivity="false">
    <appender-ref ref="console" />
    <appender-ref ref="rolling_file" />
</logger>



SQL 쿼리 실행 로그 : 실행된 SQL 쿼리 자체와 해당 쿼리가 얼마나 오래 걸렸는지 등의 정보

2024-09-02 10:15:30 INFO  jdbc.resultsettable - Executing SQL query: SELECT * FROM user;
2024-09-02 10:15:30 INFO  jdbc.resultsettable - Query executed successfully in 45 ms.

1. 실행 쿼리의 시간이 얼마나 걸렸는지 알 수 있다.

2024-09-02 10:15:30 INFO  jdbc.resultsettable - Fetching result set from executed query...
2024-09-02 10:15:30 INFO  jdbc.resultsettable - Retrieved 5 rows from result set.

2. 페치로그의 예시로 데이터를 가져오는 과정과 가져온 행의 개수를 보여준다.

2024-09-02 10:16:00 ERROR jdbc.resultsettable - SQL Exception occurred: Column 'user_id' not found.

3. 오류가 발생했음을 알려준다.

내부망과 외부망을 변경할 때마다 hosts 파일의 주석을 처리하거나 해제하는 작업이 반복되어 이를 자동화하기 위해 프로그램을 만들었습니다.


파이썬을 공부하면서 직접 개발해 보았고, 편리하게 사용하기 위해 이 프로그램을 exe 파일로 만들어 배포까지 간단 마무리..

 

목차
1. 파이썬 설치
2. 파이썬 코드 작성
3. 파이썬 코드 실행 파일(exe)
4. 프로그램 테스트

 


1. 파이썬 설치 후 메모장을 이용해서 VSC를 통해 파일을 만들어줌 확장자는 .py로 작성한다.
2. Python 코드를 실행파일로 변환하기 위해 'pyinstaller' 도구 사용
하단 명령어를 이용해서 생성

 pip install pyinstaller


 - py파일을 만든 해당 경로로 들어가서 bash 실행
 - pyinstaller --onefile 이름을 적으면 됨.py
3. dist 폴더가 생기고 .exe파일을 실행한다.

 + pyinstaller 제대로 설치되지 않은 경우?
 파이썬 pip버전이 올바르게 설치되어있는지 확인하고

python --version
pip --version


pip버전이 오래됐을 경우 업데이트가 필요함

python -m pip install --upgrade pip


그리고 다시 pip install pyinstaller 명령어를 사용하면 됨


import tkinter as tk
from tkinter import messagebox
import os

# hosts 파일 경로
HOSTS_FILE_PATH = r'C:\Windows\System32\drivers\etc\hosts'  # Windows의 경우

def update_hosts_file(line_numbers):
    try:
        # hosts 파일을 UTF-8 인코딩으로 읽기
        with open(HOSTS_FILE_PATH, 'r', encoding='utf-8') as file:
            lines = file.readlines()
        
        for line_num in line_numbers:
            index = line_num - 1
            if lines[index].strip().startswith("#"):
                lines[index] = lines[index].replace("#", "", 1).lstrip()
        
        # hosts 파일을 UTF-8 인코딩으로 쓰기
        with open(HOSTS_FILE_PATH, 'w', encoding='utf-8') as file:
            file.writelines(lines)
        
        messagebox.showinfo("Success", "Selected lines updated successfully.")
    except Exception as e:
        messagebox.showerror("Error", f"An error occurred: {e}")

def run_task_A():
    update_hosts_file([67, 68])

def run_task_B():
    update_hosts_file([69])

# GUI 생성
def create_gui():
    root = tk.Tk()
    root.title("Hosts File Modifier")

    tk.Label(root, text="Choose an action:").pack(pady=10)

    tk.Button(root, text="Run Task A (Lines 67, 68)", command=run_task_A).pack(pady=5)
    tk.Button(root, text="Run Task B (Line 69)", command=run_task_B).pack(pady=5)

    root.mainloop()

if __name__ == "__main__":
    create_gui()

하나하나 해석 
1. tkinter를 사용하여 간단한 GUI를 만들어서 수정 가능하게 해줌
2. tkinter에서 messagebox를 가져와서 박스를 표시하게 해줌
import os 운영체제 파일 경로 환결설정 가능

3. 호스트 파일 경로 정의
HOSTS_FILE_PATH = r'C:\Windows\System32\drivers\etc\hosts'
r'... : 원시 문자열이고 이스케이프 시퀀스를 무시함 , '\' 문자를 있는 그대로 사용하게 해줌

4. update_hosts_file 함수 
update_hosts_file(line_numbers) < 자바 처럼 인자 값 받는 것

5. with open에서 'r'은 읽기 모드로 연다는 것 , UTF-8 형식으로 읽고 line_nmubers 리스트로 하나하나 처리
6. strip() 함수로 공백을 제거한 후 주석 '#'으로 시작하는지 확인 후 제거함
7. writelines로 수정된 lines를 리스트에 작성
8. 내가 마우스로 클릭했을 때 일어나는 함수 line 정의 파라미터로 보내는 값
9. create_gui를 이용해서 그래픽 사용자 인터페이스를 만들어서 버튼을 눌러 작업 가능하게 해줌
10. root = tk.Tk() 메인 윈도우 창을 만드는 객체
11. root.title 창의 제목 설정 가능
12. pady는 레이블 위아래로 여백을 줌 , Label창에 텍스트 추가
13. 해당 버튼을 클릭하면 함수가 실행되게함 , root에 있는 command가 실행되게
14. root.mainloop()는 프로그램이 종료될 때 까지 GUI를 실행하고 유지시켜줌
15. if __name__ == "__main__": 구문은 파이썬에서 자주 사용 됨. 다른 스크립트에 호출된 것이 아니라 직접 실행되었을때만 내부의 코드를 실행하게 해주는 것

 

 

Redis는 고성능의 인메모리 데이터 구조 저장소 , 주로 캐싱 , 세션관리 , 메시지 브로커 등의 용도

인메모리 구조?
데이터가 주로 메모리에 저장되고 관리되는 데이터 베이스 시스템 , Redis는 이러한 인메모리 데이터 구조 저장소

인메모리 데이터베이스 
 - 모든 데이터를 메모리에 저장하고 읽기 때문에 매우 빠름 
 - 디스크 기반의 데이터베이스보다 훨씬 빠른 응답 제공
 - Redis는 데이터를 메모리에 저장하지만 , RDB나 AOF 방식을 통해서 디스크에 영속적으로 저장도 가능
 
ex) 
DB를 통해서 상품 정보를 사용자에게 보여주고 , 이 상품정보가 자주 변경되는 데이터가 아님
문제점 : 계속 같은 상품 조회하려고 같은 쿼리(시간 자원 소모) , 사용자가 많아지면 부하 증가 응답 속도 더 느려짐

Redis 캐싱을 이용
조회한 상품 정보를 Redis 캐시에 저장
Redis 캐시에 해당 상품 저장되어 있으므로 , db에 접근 불필요 


Redis 설정

1. 의존성 추가 코드
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>2.6.0</version>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.7.1</version>
</dependency>
2. Redis 설정 파일 작성

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new JedisConnectionFactory();
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory());
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        return template;
    }
}
3. 사용자 정보를 캐싱하기 위한 서비스 클래스 작성

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

@Service
public class UserService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Autowired
    private UserRepository userRepository; // eGov에서 DB 접근을 담당하는 DAO/Repository

    public User getUserById(Long userId) {
        String cacheKey = "user::" + userId;

        // Redis 캐시에서 조회
        User user = (User) redisTemplate.opsForValue().get(cacheKey);
        if (user != null) {
            return user;
        }

        // 캐시에 없으면 DB에서 조회
        user = userRepository.findById(userId);
        if (user != null) {
            // Redis 캐시에 저장 (예: 1시간 TTL)
            redisTemplate.opsForValue().set(cacheKey, user, 1, TimeUnit.HOURS);
        }

        return user;
    }
}

 

캐시를 먼저 조회하고 , 캐시에 없으면 데이터 베이스에서 조회하여 캐시에 저장. 

 

-> 먼저 조회를 하는 경우 속도차이가 많이 나는가? 캐시에 있는지 없는지 체크하는게 크게 차이는 없는지 궁금
-> 캐시 조회 시간 : 캐시는 메모리 내에서 데이터가 저장되기 때문에 접근 속도가 매우 빠릅니다. 일반적으로 캐시 조회 시간은 [ 마이크로초(µs) ] 단위입니다.


Redis 캐싱 장단점

- 장점
1. 성능개선 : 빠른 응답 속도 , 부하 분산
2. 비용 절감 : 쿼리 수 줄어들어 CPU와 메모리 자원 절약가능
3. 확장성 : 스케일링 Redis 캐시는 빠르게 확장 가능 DB가 처리해야 하는 트래픽을 줄여 시스템의 확장성을 높임
4. 데이터 일관성 유지 : 자주 조회되는 데이터 Redis에 캐싱하여 일관성 있는 상태를 유지

- 단점
1. 캐시 무효화 문제 : DB의 데이터가 변경되었지만 Redis의 캐시 데이터가 업데이트 되지 않는 경우가 있을 수 있음(이를 해결하기 위해 TTL 설정 필요)
2. 추가적인 복잡성 : 시스템 구성과 관리가 복잡해질 수 있고 Redis 서버의 설정 , 모니터링 , 유지보수 등등 할게 추가 됨.
3. 메모리 사용 : 메모리 사용량이 증가하여 메모리 부족이 날 수 있음(장점2하고 상충되는 것 처럼 보이는데 목적과 상황에 따라 달라질 수 있음)
4. 데이터 유실 위험 : 메모리 기반이여서 서버 장애 시 데이터 유실의 위험 그래서 RDB 스냅샷 OR AOF와 같은 영속성 옵션 설정

 

자주 사용되는 데이터만 캐시에 저장하는게 좋고 , 오래 사용하지 않는 데이터는 캐시에서 제거하는 전략이 좋음
Redis가 쿼리 수를 줄여주긴하지만 , 메모리 데이터를 저장하기 때문에 메모리가 많아지면 안되니 자주 사용하는 쿼리만 캐시에 사용되는게 좋다


디스크 기반 데이터베이스와 인메모리 데이터베이스의 차이

1. 디스크 기반 데이터베이스
일반적으로 MyBatis를 사용하여 xml을 통해 DB에 접근하는 경우, 디스크 기반 데이터베이스를 사용하는 것.
데이터가 하드 드라이브나 SSD와 같은 디스크 저장 장치에 저장 됨.


2. 인메모리 데이터베이스
데이터가 RAM(메모리)에 저장됨.
인메모리 데이터베이스는 빠른 데이터 접근 속도를 제공하지만,메모리 용량에 저장할 수 있는 데이터 양이 제한 됨.(DB 재가동 시 사라질 수 있음)

 

 - 같이 사용 가능

MyBatis와 Redis를 통합한 캐싱
Redis 서버를 설치하고 실행
MyBatis에서 캐시를 설정하여 Redis를 캐시 저장소로 사용함 , 이를 위해 설정 필요

<!-- MyBatis 캐시 설정 (mybatis-config.xml) -->
<settings>
    <setting name="cacheEnabled" value="true"/>
</settings>

<!-- Mapper XML 파일 -->
<cache type="org.mybatis.caches.redis.RedisCache"/>

 

후에 자바 Config 설정으로 연동 RedisCache를 MyBatis의 캐시로 사용하도록 설정

먼저 도커 사용을 하기 전 Ubuntu 및 wsl2 설치

 

 

  • Ubuntu: Docker를 네이티브로 지원하며, Linux 서버나 개발 환경에서 Docker를 직접 사용하기 위한 최적의 선택입니다.
  • WSL 2: Windows에서 Linux 환경을 제공하여, Docker를 Windows에서 실행할 수 있게 해주며, Windows와 Linux 간의 통합된 개발 환경을 지원합니다.

WSL 2를 이용하여 리눅스 컨테이너를 사용할 수 있게함.(환경 제공)

우분투는 Linux배포판을 이용하여 Docker를 직접 설치 가능.(Docker 설치)

 

WSL2 -> 우분투

 

WSL2 수동 업데이트

wsl --update

안될경우 wsl 및 관련 기능 재설치해야함

dism.exe /online /disable-feature /featurename:Microsoft-Windows-Subsystem-Linux
dism.exe /online /disable-feature /featurename:VirtualMachinePlatform

VirtualMachinePaltform은 설치되어 있어서 wsl 만 설치했음

 

wsl2 커널 업데이트 패키지 없는 경우 오류 날 수 있음

Installing, this may take a few minutes...
WslRegisterDistribution failed with error: 0x800701bc
Error: 0x800701bc WSL 2? ?? ?? ?? ????? ?????. ??? ??? https://aka.ms/wsl2kernel? ??????.

Press any key to continue...

 

wsl2 커널 업데이트 패키지 다운로드를 해야함

https://learn.microsoft.com/ko-kr/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package

 

이전 버전 WSL의 수동 설치 단계

wsl install 명령을 사용하지 않고 이전 버전의 Windows에 WSL을 수동으로 설치하는 방법에 대한 단계별 지침입니다.

learn.microsoft.com

이쪽에서 다운로드 가능

해당 파일은 wsl2의 최신 커널 버전을 설치하기 위한 파일

 

Ubuntu 설치 후 초기 설정 과정에서 UNIX 사용자 계정을 사용하라는 요청이 있음

Enter new UNIX username: myusername
New password: 
Retype new password:

 

 WSL2(Windows Subsystem for Linux 2)에 대한 설명

더보기

WSL2(Windows Subsystem for Linux 2)란?

WSL2 윈도우에서 리눅스를 사용할 수 있게 해주는 기능이에요.

  • 리눅스는 윈도우와는 다른 운영 체제인데, 도커는 리눅스에서 주로 작동해요.
  • WSL2를 사용하면, 윈도우에서 리눅스를 마치 다른 프로그램처럼 실행할 수 있어요.

왜 WSL2를 켜야 하는가?

도커는 주로 리눅스에서 잘 작동해요. 윈도우에서도 도커를 사용하려면 WSL2를 통해 리눅스 환경을 제공해줘야 해요.

간단히 말해서:

  1. 리눅스 컨테이너 실행: 도커는 리눅스 컨테이너를 사용해 애플리케이션을 실행해요. WSL2는 윈도우에서 이 리눅스 컨테이너를 실행할 수 있게 도와줘요.
  2. 성능 향상: WSL2는 도커가 더 빠르고 효율적으로 작동하도록 도와줘요. 즉, 도커가 더 빨리 작동하게 해줘요.

WSL2 설정 방법

  1. WSL2 활성화:
    • 윈도우에서 WSL2를 사용하려면, 먼저 윈도우 기능을 활성화해야 해요. 'Windows 기능 켜기 또는 끄기'에서 'Windows Subsystem for Linux'와 'Virtual Machine Platform'을 체크해요.
  2. WSL2 설치:
    • WSL2 커널 업데이트 파일을 다운로드하여 설치하고, 기본 버전을 WSL2로 설정해요.
  3. 리눅스 배포판 설치:
    • Microsoft Store에서 리눅스 배포판(예: Ubuntu)을 다운로드하고 설치해요.
  4. 도커 Desktop 설정:
    • 도커 Desktop을 설치한 후, 설정에서 WSL2 기반 엔진을 사용하도록 체크해요.

요약

  • WSL2는 윈도우에서 리눅스를 실행할 수 있게 해주는 도구입니다.
  • 도커는 리눅스 컨테이너를 사용하기 때문에, WSL2가 필요해요.
  • WSL2를 통해 도커가 윈도우에서도 원활하게 작동하도록 도와줍니다.

우분투 및 WSL2 업데이트 완료 되었으면 Docker를 사용하여 기본적인 개발 환경 설정 가능


도커 무료버전

(직원 수 250명 이상 또는 연매출 1000만 달러(네이버 2024-07-23 환율 기준 약 1300억) 이상의 기업)

 - 유료 버전 필요

 

 

도커 설치 시 나왔던 오류

1.Group membership check Your user is a member of the 'docker-users' group, but the changes will only take effect after you log out and back in. To continue, select Quit and log out and back in. required compatibility check: Group membership check

- 시스템 재부팅 후 해결 완료

 

WSL 설치 안되어 있었을 경우 , Windows 기능 켜기/끄기에도 보이지 않음


그럼이제 WSL2에서 Ubuntu설치되어 있어서 사용 준비 완료

 

Docker 설치

패키지 목록 업데이트
sudo apt update

 

sudo : superuser do 의 약자 , 관리자 권한 사용하여 명령어 실행

apt : Advanced Pacakge Tool의 약자 , Debian 기반 시스템에서 소프트웨어를 설치 , 업데이트 , 삭제하는 패키지

도커 설치
sudo apt install -y docker.io

 

install : 설치

-y : 설치 과정 중 사용자에게 확인 요구하지 않고 계속 "yes" 한다는 것

docker.io : Docker의 오픈 소스 엔진 패키지 이름

도커 서비스 시작 및 자동 시작 설정
sudo systemctl start docker
sudo systemctl enable docker

systemctl : 시스템 및 서비스 관리 도구

start docker : 도커 시작 명령어

enable docker : 부팅 시 자동으로 시작되게 하는 명령어

현재 사용자 Docker 그룹에 추가
sudo usermod -aG docker $USER

usermod : 사용자 계정 수정 명령어

-aG docker : 사용자를 docker 그룹에 추가 

$USER : 현재 사용자

docker search unbuntu

search : 도커 허브에서 이미지 검색 명령어

ubuntu : 검색할 이미지 이름

docker pull ubuntu

pull : Docker Hub에서 이미지 다운로드 하는 명령어

ubuntu : 다운로드할 이미지

docker run -it ubuntu /bin/bash

Docker 컨테이너 실행

-it : 인터랙티브 터미널 사용하여 컨테이너 실행

/bin/ash : bash셀을 실행

 

도커에서는 이미지라는 표현을 많이 사용한다.

 


도커에서 이미지란?

"이미지"는 Docker에서 사용되는 특정 용어로, 실제 이미지 파일(png, jpg 등)을 의미하는 것이 아님

Docker 이미지란 응용 프로그램과 해당 응용 프로그램이 실행되는 데 필요한 모든 파일, 라이브러리, 설정 등을 포함하는 패키지입니다. 

 

docker run -it ubuntu /bin/bash

이제 컨테이너의 셸에 들어온거임 ( 운영체제 환경에 들어와서 명령어를 입력하고 실행가능한 상태로 들어왔다는 것)


정리 요약 및 실습

Q. Docker를 왜 사용했는지 

A. 소프트웨어를 컨테이너라는 격리된 환경에서 실행할 수 있는 도구 , 어떤 환경에서도 동일하게 실행되는 애플리케이션 만들기 위함

 

간단한 스프링부트 애플리케이션 Docker로 컨테이너화

1. 프로젝트 디렉토리로 이동

2. 애플리케이션을 빌드함 (.jar 파일 또는 .war) 

3. Dockerfile 작성

# Use an official OpenJDK runtime as a parent image
FROM openjdk:11-jre-slim

# Set the working directory in the container
WORKDIR /app

# Copy the JAR file into the container
COPY target/your-application.jar app.jar

# Expose the port that the application will run on
EXPOSE 8080

# Run the JAR file
ENTRYPOINT ["java", "-jar", "app.jar"]

docker에서 읽을 수 있게 docker파일로 만들어줘야함

docker.txt 이런식으로 말고 notepadd++ 나 메모장으로 작성 후 dockerfile로 이름 변경

4. 이미지 빌드

docker build -t your-dockerhub-username/your-application .

5. 이미지 실행

docker run -p 8080:8080 your-dockerhub-username/your-application

8080:8080은 호스트의 포트 8080에 컨테이너의 포트 8080으로 매핑하는 것.

호스트의 포트 8080으로 들어오는 것 컨테이너 포트로 이동


+ Recent posts