logoStephen's 기술블로그

포스트 검색

제목, 태그로 포스트를 검색해보세요

#004 #Dockerfile/Export

#004 #Dockerfile/Export
Docker
성훈 김
2024년 6월 11일
목차

👉 기본 세팅

notion image
일단 깔끔하게 다 지우고 시작하자.
일단 깔끔하게 다 지우고 시작하자.
notion image
ex02에 Dockerfile 생성 세팅하자.
ex02에 Dockerfile 생성 세팅하자.
notion image
도커허브에서 openJDK 검색 → 무료다.
도커허브에서 openJDK 검색 → 무료다.
notion image
도커허브에서  Sort by A-Z 설정하고 11-jdk 검색어로 검색해서 찾자!
도커허브에서 Sort by A-Z 설정하고 11-jdk 검색어로 검색해서 찾자!
slim이라는 컨벤션은 해당 기능만 가져오고 싶을 때 사용. "Slim" 패키지는 해당 라이브러리나 프레임워크의 핵심 기능만 포함하고, 추가적인 부가 기능이나 모듈은 포함되지 않습니다. 예를 들어, 로깅, 테스트, 디버깅과 같은 기능이 제외될 수 있습니다.
notion image
11-jdk-slim 은 debian 계열의 OS를 사용한다.
11-jdk-slim 은 debian 계열의 OS를 사용한다.
 
환경변수 만드는 법
notion image
해당 명령어로 환경변수를 등록 할 수 있다.
해당 명령어로 환경변수를 등록 할 수 있다.
 
환경패스 설정하는 법
notion image
어디서든지 해당 폴더의 파일을 실행할 수 있는 path 설정
어디서든지 해당 폴더의 파일을 실행할 수 있는 path 설정
 

👉 Dockerfile 작성

notion image
JavaScript
// Dockerfile 작성
FROM openjdk:11-jdk-slim
JavaScript
//bash에서 빌드 명령어 
docker build -t codingspeacialist/openjdk:11 .
 
notion image
아주 간단하게 빌드가 되었다.
아주 간단하게 빌드가 되었다.
 
notion image
docker images
도커 이미지로 확인 가능
docker images 도커 이미지로 확인 가능
notion image
JavaScript
//docker run -dit 이미지명 bash (쉘 종류 많음) sh
docker run -dit codingspeacialist/openjdk:11 bash
컨테이를 안끄고 실행하고 싶다면 -dit 를 붙이면 된다. 
bash가 만약에 설치가 안되어있으면 sh(shell)로 실행해야 될 수도 있다.
컨테이를 안끄고 실행하고 싶다면 -dit 를 붙이면 된다. bash가 만약에 설치가 안되어있으면 sh(shell)로 실행해야 될 수도 있다.
명령어 설명

전체적으로 이 명령어는 다음과 같은 작업을 수행합니다:

  1. codingspeacialist/openjdk:11 이미지를 기반으로 새로운 컨테이너를 생성합니다.
  1. 이 컨테이너를 백그라운드(detached)에서 실행합니다.
  1. 컨테이너 내부에서 bash 셸을 실행합니다.
  1. 표준 입력(stdin)을 유지하여 컨테이너와의 상호작용이 가능하도록 합니다.
notion image
JavaScript
// 컨테이너 연결하는 명령어
docker attach 컨테이너 ID
접속은  attach로 하면 된다. 
docker attach: Docker 명령어로, 이미 실행 중인 컨테이너에 연결합니다.
접속은 attach로 하면 된다. docker attach: Docker 명령어로, 이미 실행 중인 컨테이너에 연결합니다.
 

👉 체크

notion image
java --version
버전 확인 openjdk 11이 설치 되어있구나.
java --version 버전 확인 openjdk 11이 설치 되어있구나.
notion image
echo $JAVA_HOME
JAVA_HOME 변수도 등록이 되어있구나.
echo $JAVA_HOME JAVA_HOME 변수도 등록이 되어있구나.
notion image
그럼 cd $JAVA_HOME 으로 해당 폴더도 이동 가능하겠네
그럼 cd $JAVA_HOME 으로 해당 폴더도 이동 가능하겠네
 
notion image
bin폴더는 무조건 존재한다. 
ls으로 내부를 확인 해보면 javac랑 java 가 보이네.
bin폴더는 무조건 존재한다. ls으로 내부를 확인 해보면 javac랑 java 가 보이네.
notion image
JavaScript
// ls의 반환 값을 파이프라인 (|) 을 통해서 grep으로 넘긴다. 그중에서 java를 찾는다. 
ls -l | grep java
notion image
cd ~/
홈 폴더 확인 명령어
cd ~/ 홈 폴더 확인 명령어
notion image
pwd
현재 위치 확인 가능명령어
pwd 현재 위치 확인 가능명령어
notion image
echo $HOME
HOME도 환경 변수가 되네~
echo $HOME HOME도 환경 변수가 되네~
notion image
JavaScript
// -a는 숨김 파일도 확인할 수 있다. 
ls -a
루트 폴더 내부를 보면 이렇게 나오네,
.bashrc 를 vi로 실행 해보자.
루트 폴더 내부를 보면 이렇게 나오네, .bashrc 를 vi로 실행 해보자.
notion image
vi .bashrc
VI가 없구나
vi .bashrc VI가 없구나
notion image
cat .bashrc
자세히 보기 명령어인 cat으로 bashrc를 자세히 보기가 가능하다.
여기서 환경변수를 등록한다.
cat .bashrc 자세히 보기 명령어인 cat으로 bashrc를 자세히 보기가 가능하다. 여기서 환경변수를 등록한다.
notion image
cat .profile
cat .profile도 들어가보자. 
음… 볼게 없네 라고 하심.
cat .profile cat .profile도 들어가보자. 음… 볼게 없네 라고 하심.
 

🔹 hello.sh 생성하기

notion image
JavaScript
// hello.sh 파일 bash에서 생성하기
1. mkdir hello      // hello폴더를 만든다.
2. 폴더에 접근 
3. echo 'echo Hellow World' > hello.sh 로 해당파일을 만든다.
4. ls 명령어로 생성을 확인한다. 
리다이렉션 연산자 :  “ > “
리다이렉션 연산자 : “ > “
  • 리다이렉션 연산자로, 표준 출력(stdout)을 지정된 파일로 보냅니다.
  • 여기서는 > 연산자가 echo 명령어의 출력을 hello.sh 파일로 리다이렉트합니다.
  • >는 해당 파일이 이미 존재하면 내용을 덮어쓰고, 파일이 없으면 새로 만듭니다.
 

🔹 hello.sh 권한 수정하기

notion image
ls -l 
파일 내용 상세보기 권한까지 볼 수 있다. 
chmod 777 hello.sh
hello.sh 파일의 권한을 변경한다. 여기서 “777”은 파일에 모든 사용자에게 읽기, 쓰기, 실행 권한을 부여하는 것을 의미.
ls -l 파일 내용 상세보기 권한까지 볼 수 있다. chmod 777 hello.sh hello.sh 파일의 권한을 변경한다. 여기서 “777”은 파일에 모든 사용자에게 읽기, 쓰기, 실행 권한을 부여하는 것을 의미.
 

🔹 왜? 그냥실행하면 안되고, “./” 을 붙여야 되지??

notion image
왜 바로 못찾고 ./ 키워드가 필요했을까???
왜 바로 못찾고 ./ 키워드가 필요했을까???
  • 현재 디렉토리에 있는 hello.sh 파일을 실행하려고 했으나, 셸은 이를 찾을 수 없었습니다. 이는 현재 디렉토리가 PATH 환경 변수에 포함되지 않았기 때문
  • 기본적으로 현재 디렉토리(.)는 PATH에 포함되지 않는다. 이는 보안상의 이유로, 현재 디렉토리에서 의도하지 않은 실행 파일이 실행되는 것을 방지하기 위함.
  • 따라서 현재 디렉토리의 파일을 실행하기 위해서는 “./”을 명시 해줘야 함.
 

👉 export 사용법

🔹환경변수 확인

notion image
echo $PATH
를 실행하면 등록된 환경변수를 확인할 수 있다.
echo $PATH 를 실행하면 등록된 환경변수를 확인할 수 있다.
 

🔹 export 명령어의 역할

notion image
JavaScript
export 명령어는 셀 변수 또는 함수가 현재 셀 프로세스뿐만 아니라 모든 자식 프로세스에서 사용할 수 있도록 만든다. 
export 를 사용해야지 전역변수 = 시스템 변수가 된다.

하지만 컨테이너가 꺼지만 모든 게 날라간다는 단점이 있다.
이를 위해서 .bashrc에 저장해야한다.
 

🔹 export 사용

notion image
JavaScript
// .bashrc 파일에 새로운 환경 변수를 추가하는 명령어
echo 'export PATH=$PATH:/root/hello' >> ~/.bashrc
그래서 export명령어자체를 bashrc에 등록하는 문법이다
하지만 이대로 종료하게 되면 변경내용이 저장이 되지 않는다.
그래서 export명령어자체를 bashrc에 등록하는 문법이다 하지만 이대로 종료하게 되면 변경내용이 저장이 되지 않는다.
 
notion image
source ~/.bashrc
변경한 환경변수를 바로 적용하고 싶다면, 해당 명령어로 실행을 해야지 적용이 된다.
source ~/.bashrc 변경한 환경변수를 바로 적용하고 싶다면, 해당 명령어로 실행을 해야지 적용이 된다.
notion image
이제 어디서나 실행하면 확인할 수 있다.
이제 어디서나 실행하면 확인할 수 있다.
 

🔹개념정리

리눅스는 실행될 때 Path환경변수를 읽는다.
리눅스는 실행될 때 Path환경변수를 읽는다.
JavaScript
// 오늘의 수업 핵심
1. PATH -> 키워드 (정해진 환경변수)
		- PATH를 키워드로 설정은 어디서 했을까?
		- /etc/profile
2. 환경변수 생성 -> export 명령어
3. .bashrc -> 부팅시 읽어지는 파일
4. 부팅안하고 적용하고 싶다면? 어떤 파일이든!!
		- source 파일명
5. bash를 안쓰고, 다른 쉘 설치해서 쓴다면?
		- 그 쉘에 대한 프로파일 설정 파일이 만들어진다. 
		예) .zshrc
6. 파일 만들때
		- echo '내용' > 파일명 -> [ > ] 사
		- append를 하고 싶다면 ? [ >> ] 사용
 

👉 자 다시 합시다.

notion image
$PATH는 무조건 있다. 여기에 추가하면 된다.
$PATH는 무조건 있다. 여기에 추가하면 된다.
notion image
export로 추가하면 되는데, 재로그인하면 안된다는게 문제, 
그래서 이것을 bashrc에 추가해야된다.
export로 추가하면 되는데, 재로그인하면 안된다는게 문제, 그래서 이것을 bashrc에 추가해야된다.
notion image
 
루트 폴더를 보면 위처럼 보이는데, 
이중 bashrc나 profile이 부팅시에 읽힌다. 그래서 해당 파일에 추가하는 문법을 알아야 된다는 것.
루트 폴더를 보면 위처럼 보이는데, 이중 bashrc나 profile이 부팅시에 읽힌다. 그래서 해당 파일에 추가하는 문법을 알아야 된다는 것.
notion image
이렇게 bashrc에 추가할 수 있으면 된다.
이렇게 bashrc에 추가할 수 있으면 된다.
 
 

👉 jar프로젝트를 도커파일로 구워보자.

🔹 폴더구조

notion image
ex02내부에 deploy폴더를 만들자.
ex02내부에 deploy폴더를 만들자.
 

🔹 jar프로젝트 다운로드

jar다운로드
jar다운로드
JavaScript
// jar 프로젝트 deploy 내부 구성
1. env variable -> 변수 설정
2. cron delete -> cron 설정
3. server checking
		3-1. apt-update
		3-2. jdk-install
		3-3. timezone
4. project folder delete
5. git clone
6. gradlew +x
7. build
8. start jar
9. cron registration
notion image
이 파일을  ex02 > deploy폴더 안에 넣어야 된다.
이 파일을 ex02 > deploy폴더 안에 넣어야 된다.
notion image
요렇게
요렇게
 

🔹Docker 파일 작성

 
notion image
Dockerfile에 이렇게 적어보자.
Dockerfile에 이렇게 적어보자.
  • WORKDIR
    • 어느 폴더에서 실행되기 원하냐?? 내부에서 어떤 경로를 default경로를 쓸 것인가?
  • COPY
    • 복사 명령어, 카피할 때 해당 JAR파일이 application.jar로 만들어진다.
 

🔹 빌드

notion image
해당 명령어를 Dockerfile이 있는 곳에서 실행해야되므로,  ex02로 이동해서 실행한다.
해당 명령어를 Dockerfile이 있는 곳에서 실행해야되므로, ex02로 이동해서 실행한다.
 

🔹 실행

notion image
만들어 졌다면 실행해보자.
만들어 졌다면 실행해보자.
 

🔹 연결

notion image
내부 분석할려면 attach 사용
내부 분석할려면 attach 사용
 

🔹 WORKDIR이 그대로 적용된거 확인

notion image
WORKDIR이 잡혀있다면, 
위 처럼 접속하자마자 그 폴더에 들어가게 된다.
WORKDIR이 잡혀있다면, 위 처럼 접속하자마자 그 폴더에 들어가게 된다.
 

🔹 파일 이름도 잘 바뀌었는지 확인

notion image
파일도 생겼고, 이름도 바뀌어져 있네
파일도 생겼고, 이름도 바뀌어져 있네
 

🔹 jar파일 실행

notion image
JavaScript
// jar파일이 있는 곳에서 해당 명령어를 실행한다.
java -jar application.jar
 

🔹 실행이 잘되는 구나

notion image
우리가 프로젝트 시작할 때 모습처럼 나온다.
우리가 프로젝트 시작할 때 모습처럼 나온다.
 

👉 ENTRYPOINT 사용

notion image
ENTRYPOINT 는 제일 마지막에 실행이 된다. 실행되고 꺼진다는 데 확인 필요
ENTRYPOINT 는 제일 마지막에 실행이 된다. 실행되고 꺼진다는 데 확인 필요
  • 커맨드 cmd는 run할때 커맨드를 바꿔치기 할 수 있다.
  • 엔트리 포인트는 바꿔치기가 안되는 고정 상수이다.
  • CMD는 서버포트 옵션을 줄 수 있다.
 
notion image
CMD는 이렇게 포트설정할수 있고, 어떤 모드로 실행할 지 옵션을 걸 수 있다. 
쉽게 생각해서 
엔트리포인트에 상수를 넣고, CMD에는 변수를 넣으면 된다.
CMD는 이렇게 포트설정할수 있고, 어떤 모드로 실행할 지 옵션을 걸 수 있다. 쉽게 생각해서 엔트리포인트에 상수를 넣고, CMD에는 변수를 넣으면 된다.
 

🔹 새로 구워보자.

notion image
JavaScript
docker build -t step2 .
빌드 한다.
빌드 한다.
 
notion image
docker run -d step2
위의 명령어를 실행해보자.
해쉬 값도 받음.
docker run -d step2 위의 명령어를 실행해보자. 해쉬 값도 받음.
 
notion image
CMD의 목적은 치환이다. 그래서 엔트리 포인트에 설정이 되어있어도,  CMD로 옵션을 걸 수 있다.
CMD의 목적은 치환이다. 그래서 엔트리 포인트에 설정이 되어있어도, CMD로 옵션을 걸 수 있다.
 
notion image
포트포워딩 설정넣고 실행
이제 8000으로 접속하면 포트 3000으로 실행이된다.
포트포워딩 설정넣고 실행 이제 8000으로 접속하면 포트 3000으로 실행이된다.
 
notion image
이렇게 포트포워딩으로 실행하더라도 마지막에 --server.port=5000 으로 바꿀 수 있다.
이렇게 포트포워딩으로 실행하더라도 마지막에 --server.port=5000 으로 바꿀 수 있다.

하지만 CMD설정을 건드릴 일이 거의 없어서,, 안써도 된다고 하심.