ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • docker 설정
    수업 내용 정리 2024. 8. 26. 17:48

    2024-08-26~27

    • docker -v : docker 버전 확인
    • docker compose version : docker compose 버전 확인
    • docker pull tomcat:9.0.93-jre11-temurin-noble : tomcat:9.0.93-jre11-temurin-noble 버전 설치
    • docker pull mariadb : mariadb 설치
    • docker images : docker에 현재 설치된 이미지 확인
    • docker image inspect tomcat : 
    • docker pull tomcat : docker에 최신 버전의 톰캣 설치
    • docker save -o ./tomcat_image tomcat:latest : 최신 버전의 톰캣에 latest 별칭 추가
    • docker rmi 3b310909d72c : 3b310909d72c의 id를 가진 이미지 삭제
    • docker load -i ./tomcat_image : -i 컨테이너 표준 입력 활성화
    • docker tag tomcat:latest : 
    • docker run -d tomcat:latest : 
    • docker run -d --name tomcat -p 8080:8080 tomcat:latest :
      -d(detach) 컨테이너를 백그라운드로 실행, --name 컨테이너 이름 지정, -p(port) [호스트 포트]:[컨테이너 포트] 포트 번호 지정(컨테이너를 외부에 노출시키기 위한 설정), -it: 컨테이너와 터미널로 상호 입출력을 하기 위한 설정
    • docker ps-a : 실제 실행 중인 컨테이너 목록 확인
    • docker stop tomcat : 실행 중인 톰캣 컨테이너를 중단함
    • docker ps -a : -a(attach)
    • docker exec tomcat : 
    • docker run -it --name ubuntu-linux ubuntu:latest : 
    • docker stop ubuntu-linux
    • docker start -i ubuntu-linux
    • docker commit ubuntu-test ubuntu-image:1.2.2
    • docker run -d --name mariadb -p 3307:3306  -e MARIADB_ROOT_PASSWORD=000123 mariadb:latest :
      Mariadb root계정 비밀번호를 root로 지정
    • docker exec mariadb date 
    • docker inspect e38a37d9a185

    컨테이너 배포 실습

    1. 프로젝트 빌드(.jar 파일 생성)
    2. 컨테이너 생성 후 .jar 파일 컨테이너 내부로 복사
    3. 컨테이너를 이미지로 생성
    4. 생성된 이미지로 .jar 파일을 실행하는 컨테이너 생성
    5. 동작 테스트

    department 배포 -> mvn clean -> mvn package

    docker run -it —name department-service -p 8080:8080 eclipse-temurin:21-jre-alpine /bin/sh

     

    cd ~

    pwd

    java -v

    java -version

     

    172.17.0.2

     

    docker cp .\05_Department-0.0.1-SNAPSHOT.jar department-service:/root

    docker cp .\06_Subject-0.0.1-SNAPSHOT.jar department-service:/root

     

    java -jar 05_Department-0.0.1-SNAPSHOT.jar

     

    application.yml

    spring:

      application:

        name: department-service

      datasource:

        driver-class-name: org.mariadb.jdbc.Driver

        url: jdbc:mariadb://172.17.0.2:3306/web

        username: 'root'

        password: '000123'

    mybatis:

      type-aliases-package: com.beyond.department.vo

      mapper-locations:

      - classpath:mappers/**/*.xml

    springdoc:

      swagger-ui:

        operations-sorter: method

      paths-to-match:

      - /v1/**

     

    docker ps -a   

    docker rm department-service

    docker run -it --name subject-service -p 8081:8081 eclipse-temurin:21-jre-alpine /bin/sh

    / # cd ~

    ~ # ls

    ~ # java -jar 06_Subject-0.0.1-SNAPSHOT.jar

     

    docker commit subject-service subject-service:1.0

     

    docker run --name subject-service -p 8081:8081 --link mariadb:db subject-service:1.0 java -jar /root/06_Subject-0.0.1-SNAPSHOT.jar

     

    docker cp ./06_Subject-0.0.1-SNAPSHOT.jar department-service:/root

     

    docker network create university

    docker rm -f mariadb 

    docker run -d --name mariadb -p 3307:3306 -v mariadb:/var/lib/mysql/ -e TZ=Asia/Seoul -e MARIADB_ROOT_PASSWORD=root --network university mariadb:latest

    docker ps -a

    docker inspect id -> ip address: 172.18.0.2

    docker run -it --name department-service -p 8080:8080 --network university eclipse-temurin:21-jre-alpine /bin/sh

    docker run --name subject-service -p 8081:8081 --network university eclipse-temurin:21-jre-alpine /bin/sh

    2024-08-28

    <FE>

    cd ./04_university

    <프로젝트를 배포 가능한 상태로 빌드>

    npm install

    npm run build

    <docker hub>

    nginx 설치 (stable-alpine3.20)

    docker run -d --name nginx -p 80:80 nginx:stable-alpine3.20

    <nginx>

    docker inspect 1f69038d997c(image id)

    docker container inspect nginx -> 네트워크 설정

    http://localhost:80 으로 nginx 컨테이너 확인

    docker exec -it nginx /bin/sh

    # ls

    # cd /usr

    # ls

    # cd share -> ls: nginx 확인 가능

    # cd html

    1. dist 파일을 컨테이너 내부로 옮김

    vscode) 04_university에서

    docker cp ./dist/. nginx:/usr/share/nginx/html

    * http://localhost/80으로 확인 가능 -> but 데이터 불러오지 못함, 엔드포인트에 department 사용 불가능

    2. 

    devops 레포 클론 받아서 -> default.conf 파일 생성하고 코드 복붙

    terminal) # cd /etc/nginx/conf.d

    vscode) default.conf 경로로 이동 ->
    docker cp ./default.conf nginx:/etc/nginx/conf.d/default.conf

    # cat default.conf 해서 설정 변경된 것 확인

    docker restart nginx

    3. 05_department - Webconfig 설정하고 다시 빌드

    package com.beyond.department.config;

    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.CorsRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

    // Spring 서버 전역으로 CORS 설정
    @Configuration
    public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/**")
    .allowedOrigins("http://localhost:5173", "http://localhost") // 여기 수정
    .allowedMethods("GET", "POST", "PUT", "DELETE");
    }
    }

     

    05_department) mvn clean

    05_department) mvn package

    docker run -it --name department-service -p 8080:8080 --network university -e TZ=Asia/Seoul eclipse-temurin:21-jre-alpine /bin/sh

    05_department -> target) docker cp 05_Department-0.0.1-SNAPSHOT.jar department-service:/root

     

    4. 우분투 이미지를 통해 컨테이너 생성 -> 파일 생성

    docker run -it --name ubuntu-linux ubuntu:latest

    docker rm ubuntu-linux

    docker run -it --name ubuntu-linux -v /Users/hyeonji/ubuntu_data:/root/data ubuntu:latest

    -> 컨테이너의 ubuntu-linux에서 root/data와 로컬(호스트) 계정의 새 폴더 ubuntu_data를 마운트함

    cd data -> ls -> echo "hello world" > hello.txt

    -> 컨테이너를 삭제하고 다시 생성해도 내부의 파일이 삭제되지 않음을 확인
    (호스트와 연결되어 있으므로 동일한 컨테이너 생성 시 그대로 파일과 내용이 남아 있음)

     

    5. 호스트와 연결 시 단점 확인

    docker run -d --name mariadb-test -e MARIADB_ROOT_PASSWORD=root mariadb

    docker exec -it mariadb-test /bin/bash

    docker run -d --name mariadb-test -v /Users/hyeonji/ubuntu_data:/var/lib/mysql -e MARIADB_ROOT_PASSWORD=root mariadb

     

    6. volume-container (호스트와 볼륨 공유)

    docker run -it --name volume-container -v /Users/hyeonji/test:/root/test ubuntu:latest

    ls /root -> 호스트의 test 폴더와 volume-container이 연결됨 확인

    docker run -it --name ubuntu-linux1 --volumes-from volume-container ubuntu:latest

    docker run -it --name ubuntu-linux2 --volumes-from volume-container ubuntu:latest

    -> host와 volume을 직접 연결하는 것이 아니라 test와 연결되어 있는 volume-container를 통해서 다른 컨테이너와 공유함

    echo "hello, hello" > /root/test/hello.txt 

    ls /root/test, cat /root/test/hello.txt -> file 생성 확인, linux1에서도 동일하게 내용이 확인되는지 확인

     

    7. 도커 볼륨 활용

    docker volume create --name ubuntu-volume 

    docker run -it --name ubuntu-linux -v ubuntu-volume:/root/data ubuntu:latest -> root에 data 폴더 생성

    echo "hello" > ~/data/hello.txt

    cat ~/data/hello.txt -> 내용 확인, 삭제했다가 다시 생성해도 파일 존재하는지 확인

     

    8. 도커 파일 생성

    01_Docker - 01_Dockerfile - Dockerfile 생성(확장 설치)

    Dockerfile

    # 베이스 이미지를 ubuntu:latest로 지정
    FROM ubuntu:latest
    LABEL maintainer="henhen7 <g1008702@gmail.com>"
    LABEL version="1.0"
    # 베이스 이미지로 만들어진 컨테이너에서 실행할 명령어
    RUN apt-get update
    RUN apt-get install sudo
    RUN sudo apt-get install net-tools
    # 컨테이너 실행 시 먼저 실행될 명령을 지정
    CMD ifconfig

     

    2024-08-29

    1. Dockerfile 생성하고 build한 jar 디렉터리 이동(v1)

    FROM eclipse-temurin:21-jre-alpine
    LABEL maintainer="henhen7 <g1008702gmail.com>"
    LABEL version="1.0"
    COPY 05_Department-0.0.1-SNAPSHOT.jar /root
    ENV TZ=Asia/Seoul
    EXPOSE 8080
    WORKDIR /root
    CMD [ "java", "-jar", "05_Department-0.0.1-SNAPSHOT.jar" ]

    docker build -t department-service:1.3 ./ -> 도커 이미지 생성

    docker run --rm --name department-service -p 8080:8080 --network university department-service:1.3

     

    -> 도커 빌드 명령어로 이미지를 빌드할 때 build-context에서 경로(Dockerfile이 존재하는 경로)를 읽어서 파일을 찾아 씀

    이 때 해당하는 디렉터리 뿐만 아니라 하위 디렉터리도 포함하기 때문에 빌드 시 불필요한 파일이 포함되지 않도록 함

     

    2. Dockerfile v2: 변수 지정 및 확장

    FROM eclipse-temurin:21-jre-alpine
    LABEL maintainer="henhen7 <g1008702@gmail.com>"
    LABEL version="2.1"
    COPY 05_Department-0.0.1-SNAPSHOT.jar /root
    ARG PROFILE=dev
    ARG PORT=8088
    ENV TZ=Asia/Seoul
    EXPOSE ${PORT}
    WORKDIR /root
    CMD [ "java", "-jar", "05_Department-0.0.1-SNAPSHOT.jar", "--spring.profiles.active=${PROFILE}" ]

    docker build -f ./Dockerfile_v2 -t department-service:2.1 --build-arg PROFILE=live --build-arg PORT=30021 ./

    -> 빌드 시 도커 파일에서 지정한 argument 값을 지정 가능

    -> arg 선언하지 않고 빌드 시 파일 내에 기본값으로 설정된 값으로 빌드됨

     

    docker run -d --rm --name department-service -p 30021:30021 --network university department-service:2.1

    -> ARG로 선언한 변수는 도커파일 내에서만 작동함. 따라서 컨테이너 실행 시점에는 해당 변수를 찾을 수 없음(접근 불가능)

    -> 환경변수로 선언하면 컨테이너 실행 시점에서도 적용 가능함 (ENV PROFILE=${PROFILE})

     

    docker logs -f 컨테이너id -> 로그 확인

     

    docker inspect 컨테이너id -> 컨테이너의 정보 확인

     

    3. 실습

    docker build -f ./Dockerfile -t subject-service:1.0 --build-arg PROFILE=live --build-arg PORT=30022 ./

    docker run -d --rm --name subject-service -p 30022:30022 --network university subject-service:1.0

     

    4. 뷰 빌드

    FROM nginx:stable-alpine3.20
    LABEL maintainer="henhen7 <g1008702@gmail.com>"
    LABEL version="1.1"
    COPY dist /usr/share/nginx/html
    # SPA 라우팅 처리를 할 수 있도록 기본 설정을 변경한 파일로 변경
    COPY default.conf /etc/nginx/conf.d/default.conf
    ENV TZ=Asia/Seoul
    EXPOSE 80
    # nginx를 실행하는 명령어 작성
    CMD ["nginx", "-g", "daemon off;"]

     

    default.conf, dockerfile 수정 후 같은 경로에 dist 폴더 복사, 빌드

     

    docker build -t vue-app:1.1 ./ 

    docker run -d --rm --name vue-app -p 80:80 vue-app:1.1