[LIKELION] 221103

고관운·2022년 11월 3일

회고

😄 느낀점

  • docker의 이론적 개념이 부족하다. 아직 포트, 컨테이너, 이미지에 대한 개념이 완벽하게 잡히지 않았기 때문에 공부가 필요하다.

😁 목표

  • 프로그래머스 알고리즘

알고리즘

에라토스테네스의 체

배수 제거를 활용하여 구현

import java.util.Arrays;

public class SieveOfEratosthenes {
    public static void printNum(int[] nums, boolean[] checks) {
        // check를 참고해서 true인 nums[i]만 출력, size 출력
        int cnt = 0;
        for (int i = 0; i < nums.length; i++) {
            if(checks[i]){
                System.out.print(nums[i] + " ");
                cnt++;
            }
        }
        System.out.println("\nsize:" + cnt);
    }

    public static void main(String[] args) {
        int N = 50;
        int[] nums = new int[N-1];      // 2~50까지 넣을 배열 생성
        boolean[] checks = new boolean[nums.length];
        Arrays.fill(checks, true);  // checks를 true로 초기화
        for (int i = 0; i < nums.length; i++) { // 2~50까지 채우기
            nums[i] = i + 2;
        }

        // 배수를 false로 변환
        for (int i = 0; i * i <= N; i++) {
            int multipleOf = nums[i];

            for (int j = multipleOf + i; j < nums.length; j+=multipleOf) {
                checks[j] = false;
            }

            printNum(nums, checks);
        }
    }
}

🔴 위 코드처럼 구현한다면, nums 배열의 인덱스와 값이 다르기 때문에 헷갈릴 수 있음

👉 221102의 checks처럼 인덱스와 값을 동일하게 만든다면, 코드를 봤을때 조금 더 이해하기 편할 것 같음

Spring Boot

Docker

Docker란

컨테이너 기술

컨테이너 : 리눅스 + 어플리케이션
java어플리케이션을 Linux에 리눅스 서버에 띄우는 것

가상머신 VS Docker

  • 가상머신 App -> Cpu를 사용
  • Docker -> 썼을 때 1개 계층이 줄어듦(OS의 Dependency가 사라짐)
    (단점 : Linux에서밖에 안됨, 단, 대부분의 서버는 Linux)

.jar 실행

🔴 리눅스에서 바로 실행한 것, Docker를 안거친 것
    👉 Docker : 아래 작업이 스크립트화가 되는 것임

kill -9 <pid>
git pull
mvn -DskipTests=true package
cd target
java -jar crud-api-0.0.1-SNAPSHOT.jar

🔴 발생한 에러
이미 포트가 사용중 : Docker 내린 후 다시 올리기(포트 중복)

docker ps : 컨테이너 확인
docker stop [해당 Id] : 컨테이너 중지 후
다시 java -jar crud-api-0.0.1-SNAPSHOT.jar

Docker 빌드

  • docker로 빌드를 해놓으면 docker만 설치되어 있으면 아무곳에서 다 뜸

  • 즉, 우리가 개발한 어플리케이션을 컨테이너 형태로 만드는 것
    -> Dockerfile 작성 + Environment Variable로 변수 넘기기
    (-e : 변수 넘기기 (DB접속 정보, API의 인증정보)

  • image도 git처럼 글로벌하게 공유할 수 있음(docker.hub -> github)
    docker.hub에 올린 예시
    docker run gazgeek/springboot-helloworld

👉 infra의 소스코드화 -> 아주 쉽게 복제 가능

Docker Image

  • docker images : 이미지 목록 보는 코드
  • 도커 이미지와 컨테이너는 1:N관계(이미지는 하나인데, 컨테이너에 여러개가 올라감)
  • docker image : 파일 .jar -> java가 깔려있는 linux에 ~.jar파일이 들어있는것

Docker 실습

-e

-e : 환경변수 설정

SPRING_DATASOURCE_URL를 host로 설정
docker run -i -t -e SPRING_DATASOURCE_URL=host ubuntu:22.04

👉 환경변수를 지정하면 기존에 있던 application.yml의 환경변수가 OS환경변수보다 우선순위가 낮기 때문에 OS환경변수로 덮어쓰기됨

내 프로젝트에 적용

환경 변수 설정 및 daemon으로 띄우기(-e, -d)

docker run -p 8081:8081 -d -e SPRING_DATASOURCE_URL=url -e SPRING_DATASOURCE_PASSWORD=password springboot-jdbc-template

docker ps : container_id 확인하기 위함
docker exec <container_id> printenv : 앞에서 -e옵션으로 정보가 잘 넘어갔는지 확인하기

컨테이너 및 이미지 삭제

컨테이너 삭제 != 이미지 삭제
➡ 컨테이너를 삭제해도 image는 지워지지 않음

컨테이너 지는 법

  1. docker rm <container_id> : 컨테이너 삭제 코드지만 지워지지 않을 경우가 있음
    👉 이유 : 돌아가고 있는 container는 삭제가 안됨
  2. docker kill <container_id> : 컨테이너 내리기
  3. docker ps : 올라간 컨테이너 확인
  4. docker ps -a : 모든 컨테이너 보기
  5. docker rm <container_id>
    이것을 알아야하는 이유 : 컨테이너가 올라가 있으면 이미지가 안지워지는 경우가 있음 -> 이미지를 지우기 위해 컨테이너를 내리고 지워야함
    (일단 내리고 이미지를 지우는 시도를 해보고 안되면 컨테이너까지 지우고 시도해봐라)

이미지 지우는 법

docker rmi <image_name>:<version>
컨테이너가 돌고있다고 했을때 컨테이너를 내리고 시도해보고, 컨테이너를 지우고 시도해보자

-p옵션

  • -p 80:80
  • -p 8080:8080
  • -p 3306:3306

🔸 앞의 포트 : 외부에서 들어오는 것(aws에 연결하고 싶은것, HTTP - 보안에서 열어줘야함)
🔸 뒤의 포트 : 들어온 다음에 docker로 가는 것(application.properities, .yml 설정값)

실습. 워드프레스 띄우기

  1. 아래 코드 docker에 작성
docker run -d \
--name wordpressdb \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=wordpress \
mysql:5.7

docker run -d \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_USER=root \
-e WORDPRESS_DB_PASSWORD=password \
--name wordpress \
--link wordpressdb:mysql \
-p 80 \
wordpress

🔸 --name 옵션을 이용해 name을 지정할 수 있다는 것
🔸 --link를 이용해 앞에서 --name을 지정해서 띄운 mysql과 연동한 것

  1. docker ps : 포트 확인 후 보안그룹에 추가(나의 경우 : 49153)
  2. NDS주소:포트 : 접속

Docker Volume

Docker Volume이란

리눅스(호스트)와 Docker Container간에 같은 디렉토리를 바라보도록 하는 것

사용 이유

우리가 병원 데이터를 MySQL을 넣어도, Docker가 내려가면 데이터가 사라짐

사용방법

-v : 호스트의 공유 디렉터리:컨테이너의 공유 디렉터리를 공유

실습

  1. pwd : 현재 디렉토리 확인
  2. docker run -d -v /root:/app ubuntu:22.04 : /root와 /app을 연결확인
  3. /root/mysql_data, /var/lib/mysql을 볼륨으로 연결
docker run -d -p 3308:3306 --name wordpressdb1 -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress -v /root/mysql_data:/var/lib/mysql mysql:5.7
  1. MySQL Workbench에서 3308로 접근하여 테이블을 생성하여 데이터를 삽입하면 똑같이 root의 mysql에 데이터가 들어가서 날아갈 걱정을 안해도 됨

0개의 댓글