ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 도커 (7)도커파일 예제 : 리액트, 자바, 스프링부트
    docker 2022. 1. 26. 15:47

    ============

    REACT

    node가 깔려있는 이미지가 있으면

    react app을 그 안에서 쓸 수가 있겠네

     

    node 가 있으면 npm이 깔리고

    npm start하면 서버가 실행

     

    ============

    도커 안쓰고 리액트 앱 생성

    (노드를 깔고)

    PS C:\docker> npx create-react-app myapp

    https://webruden.tistory.com/275

     

    npx란 무엇일까? 그리고 npm이랑 어떤 차이점이 있을까?

    우리는 종종 npx 명령어를 사용해서 패키지를 설치하곤 합니다. 예를 들어 리액트 CRA를 설치할 때 npx create-react-app을 사용하고 , nuxt를 설치할 때 npx create-nuxt-app을 사용하고, 리액트 네이티브를 설

    webruden.tistory.com

    Creating a new React app in C:\docker\myapp.

     

    myapp 리액트 앱을 실행

    PS C:\docker\myapp> npm start

     

    ============

    myapp를 실행하는 이미지를 생성 후 컨테이너를 실행했을 때 호스트에서 http://localhost:9292로 접속했을 때 myapp 실행 화면이 보이도록 해 보세요.

     

    내가 해본 답(싹 틀림)

     

    1)도커파일을 만든다node이미지

    FROM node
    COPY ["./reactapp", "/reactapp"]
    EXPOSE 3000
    CMD npm start


    2)도커파일로 이미지 만들기
    docker image build -t 내계정/myapp:latest -f Dockerfile_myapp .

    3)컨테이너 run
    docker container run --name conreact -P 내계정/myapp:latest

     

    ============

    뭐가 문제냐

     

    폴더 복사만 하면 내 로컬에서 CREATE-REACT-APP을 하고 갔으니까

    폴더 복사만 해서는 안되는 설정들이 있다

    그게 바로 환경변수 설정과 npm install

     

    npm install은 글로벌로 해줘야해

     

    또 폴더 통째로 복사 안하고 따로따로 한것은 한꺼번에 하면 쓸데없는것도 가니까

     

    아니면 COPY .. 하면 전부 지정해놓은 workdir로 옮겨라 하면 -> 설치하는 로드 모듈이 그거 엄청 많은거 다 복사되는데 다른버전이 갈 수도 있고 -> 이건 ignore할 수 있다, 옮기는 과정에서 생략해야할 애들을 도커이그노어파일로 넘김

    복사를 해야할 기준이 되는 정보들을 보관하는 범위를 context라고 함. context범위내에서 무시하고 싶은 파일들을 .ignore파일에 넣어주면 됨

     

    ============

    참고 : https://medium.com/geekculture/getting-started-with-docker-in-your-react-js-application-the-basics-6e5300cf749d

    - 참고 사이트의 COPY는 create-react-app 한 폴더 안에 있는 package.json을 복사한 뒤

    - npm install을 하고

    - create-react-app 한 폴더 전체를 복사한다

     

    왜 그런지도 다 써져있다

    docker build -t nameofyourapp:latest .

    docker run --name nameofyourchoice -d -p 3000:3000 nameofyourapp:latest

    -> 해봤는데 잘 돈다

     

    정답 : 

    FROM    node 

    WORKDIR /reactapp

    ENV PATH /reactapp/node_modules/.bin:$PATH

    # COPY ./reactapp/node_modules /reactapp/
    COPY ./reactapp/public       /reactapp/public
    COPY ./reactapp/src          /reactapp/src
    COPY ./reactapp/package.json /reactapp/package.json

    RUN npm install 
    RUN npm install react-scripts -g

    EXPOSE 3000

    CMD [ "npm", "start" ]

    - copy .. 하면 workdir 에 설정된곳으로 전부 복사

    - 일단 COPY는 파일이나 디렉토리를 복사한다, -r안해도돼

    - 로컬에서 만든 소스코드를 컨테이너 안으로 밀어넣는 것

     

    node이미지 버전은 내 버전 node --version으로 맞추면 됨

     

    - WORKDIR 은 작업디렉토리를 정하는 것

    - ENV PATH 는 환경변수로 입력

    :$PATH는 기존 환경변수애들 을 추가하는 것

    - 하나하나 복사해가는데 쟤는 안 복사하려고 # 을 붙인거고(안가져가도되는애들임)

     

    - npm install 하면 package.json 디펜던시들을 깔아줌 node_modules에다가

    - 추가적으로 react-script에

    npm start했을 때 동작하기 위한, 이걸 글로벌하게 깔기 -g

     

    기존엔 npx create-react-app했을 때 위의 작업들을 해줬는데 그걸 지금 내가 수동으로 한 것

     

    PS C:\docker> docker image build -t myapp -f Dockerfile_myapp .

    이미지 빌드

     

    -it는 로그를 보려고 한거고

    -d하면 컨테이너가 내려가면 왜 내려가는지 볼수가 없대

     

    PS C:\docker> docker container run -it -p 9292:3000 myapp

     

    ============

    JAVA

     

    자바 실행 과정 

     

    PS C:\docker> javac Gugudan.java

    PS C:\docker> java Gugudan

     

    ============

    내답

    FROM openjdk
    WORKDIR /myjava
    COPY /myjava /myjava
    EXPOSE 8080
    RUN javac /myjava/gugu.java
    CMD ["java", "/myjava/gugu"]

    포트는 왜 썼어 웹서버도 아닌데

     

    ============

    해답

    C:\docker\Dockerfile_gugudan

    FROM    openjdk
    WORKDIR /mygugudan
    COPY    ./Gugudan.java  /mygugudan/Gugudan.java
    RUN     javac Gugudan.java
    CMD     [ "java", "Gugudan" ]

     

    참고: https://hub.docker.com/_/openjdk

    여기에 하는법이 다 써있다

     

    PS C:\docker> docker image build -t mygugudan -f .\Dockerfile_gugudan .

     

    PS C:\docker> docker image ls

    REPOSITORY      TAG       IMAGE ID       CREATED             SIZE

    mygugudan       latest    f970a377b2aa   9 seconds ago       471MB

    myapp           latest    a5d9afd09f69   54 minutes ago      1.5GB

    :

    PS C:\docker> docker container run mygugudan

    2dan

    2 x 1 = 2

    2 x 2 = 4

    2 x 3 = 6

    2 x 4 = 8

    2 x 5 = 10

    2 x 6 = 12

    2 x 7 = 14

    2 x 8 = 16

    2 x 9 = 18

    :

     

    PS C:\docker> docker image tag mygugudan:latest myanjini/mygugudan:latest

    PS C:\docker> docker image ls

    REPOSITORY           TAG       IMAGE ID       CREATED             SIZE

    mygugudan            latest    f970a377b2aa   8 minutes ago       471MB

    myanjini/mygugudan   latest    f970a377b2aa   8 minutes ago       471MB

    myapp                latest    a5d9afd09f69   About an hour ago   1.5GB

     

    PS C:\docker> docker image push myanjini/mygugudan:latest

     

    PS C:\docker> docker container run myanjini/mygugudan:latest 

     

    ============

    내답2

    FROM openjdk
    WORKDIR /js
    COPY ["JsHello.class", "."]
    CMD ["java", "JsHello"]

    docker build -t practjava -f Dockerfile_java .

    docker run practjava

    이러면 저 자바엔 print하는것밖에 없는데 도커명령어 입력하던 프롬프트에 sout가 찍힘

    포트가 없지

    하튼 잘됨

     

    ============

    *파워쉘 : 리눅스 명령어와 좀 혼용해서 쓰고 싶을 때, 명령어가 좀 다르다

     

    ============

    우분투에 아파치웹서버를 깔아서 썼는데, 그냥 아파치웹서버이미지로도 가능하지 않나?

    응 당연하지

     

    아파치 웹서버도 베이스 이미지가

    debian이라는 운영체제다. 뭐든 기본적으로 저런건 있어야 한다.

     

    ============

    이런것들이 많아지다보니까 이왕 내가 개발할거를 한큐에 이미지로 만들 순 없을까?

     

    스프링부트는 jar파일로 떨어뜨릴수가 있다

    하여튼 다 방법이 있다는 거네

    openjdk에 집어넣어서 실행시켜주면 된다는 것

     

    ============

    Sping Boot with Docker 

    https://spring.io/guides/gs/spring-boot-docker/

     

    여기에 방법이 써 있다. 저 사이트에 스프링부트 앱 처음부터 설명이 돼 있음

    jar파일로 만들어주는 명령어도 있다

    If you use Gradle, run the following command:

    ./gradlew build && java -jar build/libs/gs-spring-boot-docker-0.1.0.jar

    If you use Maven, run the following command:

    ./mvnw package && java -jar target/gs-spring-boot-docker-0.1.0.jar

    build/libs~~.jar : 저 위치에 저 이름으로 jar 파일이 만들어짐

    maven은 target어쩌구에 만들어짐

     

    그리고 도커파일 ex1, ex2, ex3이 있다

     

    Example 1. Dockerfile
    FROM openjdk:8-jdk-alpine
    ARG JAR_FILE=target/*.jar
    COPY ${JAR_FILE} app.jar
    ENTRYPOINT ["java","-jar","/app.jar"]
    Example 3. Dockerfile
    FROM openjdk:8-jdk-alpine
    RUN addgroup -S spring && adduser -S spring -G spring
    USER spring:spring
    ARG DEPENDENCY=target/dependency
    COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib
    COPY ${DEPENDENCY}/META-INF /app/META-INF
    COPY ${DEPENDENCY}/BOOT-INF/classes /app
    ENTRYPOINT ["java","-cp","app:app/lib/*","hello.Application"]

    뭐 읽어보면 차이는 레이어 구분 등 인 것 같아

     

    내가 해본 것

    FROM openjdk
    ARG JAR_FILE=./cc/build/libs/cc-0.0.1-SNAPSHOT.jar
    COPY ${JAR_FILE} app.jar
    ENTRYPOINT ["java","-jar","/app.jar"]

    ../cc 하니까 안되고 cc를 도커파일 과 같은 폴더에 집어넣고 ./cc 하니까 되네 밖으로 못가나?

    ARG는 도커파일 안에서 쓸 변수를 선언하는거고, docker build 명령어에 --build-arg 옵션으로 전달하면 덮어짐

     

    잘됨~!

Designed by Tistory.