-
도커 (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 nodeCOPY ["./reactapp", "/reactapp"]EXPOSE 3000CMD 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파일에 넣어주면 됨
============
- 참고 사이트의 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 openjdkWORKDIR /myjavaCOPY /myjava /myjavaEXPOSE 8080RUN javac /myjava/gugu.javaCMD ["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 openjdkWORKDIR /jsCOPY ["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. DockerfileFROM openjdk:8-jdk-alpine ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"]
Example 3. DockerfileFROM 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 openjdkARG JAR_FILE=./cc/build/libs/cc-0.0.1-SNAPSHOT.jarCOPY ${JAR_FILE} app.jarENTRYPOINT ["java","-jar","/app.jar"]../cc 하니까 안되고 cc를 도커파일 과 같은 폴더에 집어넣고 ./cc 하니까 되네 밖으로 못가나?
ARG는 도커파일 안에서 쓸 변수를 선언하는거고, docker build 명령어에 --build-arg 옵션으로 전달하면 덮어짐
잘됨~!
'docker' 카테고리의 다른 글
도커 (9)서브넷마스킹, network (0) 2022.02.26 도커 (8)컨테이너이름, rm, v, 요약, 리소스정리, cp, CMD & ENTRYPOINT (0) 2022.02.26 도커 (6)exec&Up&stop, RUN -y, ADD, EXPOSE, -DFOREGROUND, CMD [ ], &&, build -f (0) 2022.01.26 도커 (5)포그백그, -itd, COMMAND&detach key, -p포트하나만주면 (0) 2022.01.25 도커 (4)run하면, detache, -it, logs, tag바꾸기, 일괄삭제, (0) 2022.01.25