본문 바로가기

Programming/Cloud

DAY 171. 도커파일(Dockerfile) 응용

 

 

 

 

 

 

 

DAY 169. 도커 파일(Dockerfile)

도커파일(Dockerfile) 도커 이미지를 생성할 수 있는 설정 파일 사용자가 이미지를 조합하기 위해 명령줄에서 호출할 수 있는 모든 명령을 포함하는 텍스트 문서 완성된 이미지를 생성하기 위해 필

chichibaby.tistory.com

 

도커파일(Dockerfile)

도커 이미지를 생성할 수 있는 설정 파일

사용자가 이미지를 조합하기 위해 명령줄에서 호출할 수 있는 모든 명령을 포함하는 텍스트 문서

완성된 이미지를 생성하기 위해 필요한 컨테이너, 패키지, 소스코드, 명령어 등을 하나의 파일에 기록

도커에서 파일을 자동으로 작업을 수행하고 완성된 이미지로 만들어 준다.

깃과 같은 개발도구를 통해 애플리케이션의 빌드 및 배포를 자동화 할 수 있다.

 

- 이미지를 만들 때 필요한 일련의 과정을 파일로 기술하고 이 파일을 가지고 이미지를 생성하는 방법

 

 

도커 이미지 생성 방법 1

기존 이미지로 컨테이너 생성 후, 작업 완료된 컨테이너를 다시 이미지로 생성

 

도커 이미지 생성 방법 2

Dockerfile로 필요한 패키지, 소스코드, 명령어 등을 작성 후 빌드

- 1) Dockerfile 작성

- 2) Dockerfile 빌드

 

 

https://hub.docker.com/_/tomcat

 

Tomcat - Official Image | Docker Hub

We and third parties use cookies or similar technologies ("Cookies") as described below to collect and process personal data, such as your IP address or browser information. You can learn more about how this site uses Cookies by reading our privacy policy

hub.docker.com

 

- 도커 허브에서 이미지 검색하면, 각 이미지마다 도커파일 링크가 있다.

 

 

도커 파일 작성

컨테이너에서 수행해야 할 작업을 명시한다.

정해진 형식과 명령어로 작성해야 한다.

문서 파일로 작성한다.

한 줄에 하나의 명령어로 구성된다.

명령어를 명시하고 뒤에 옵션을 추가한다.

명령어는 대/소문자 상관없다. (일반적으로 대문자로 표기)

위에서 아래로 한 줄씩 차례대로 실행된다.

 

명령어 설명
FROM 이미지명 생성할 이미지의 베이스가 될 이미지를 지정
Dockerfile 작성 시 반드시 한 번 이상 입력해야 함
이미지 이름은 기본 도커 명령어에서 사용되는 형식과 동일
이 이미지를 가지고 컨테이너를 만들어서 명령어, 환경설정, 포트 노출 등 작업을 해준다.
LABEL "키:값" 이미지에 메타 데이터 추가
"키:값" 형태로 입력
여러 개 메타 데이터 입력 가능
키 값 사이에 공백, 특수문자가 있을 때는 ""(큰 따옴표) 반드시 기입
docker inspect 명령어로 확인 가능
이미지에 대한 정보
- maintainer : 작성자
- version : 버전
ADD 원본경로 대상경로
ADD "추가할 파일명", ... , "추가될 위치"
로컬 디렉터리나 외부 url 및 tar 파일에서 이미지로 파일 복사
기본 Dockerfile이 위치한 디렉터리에서 파일을 가져옴
JSON 배열의 형태로 사용 가능
추가할 파일명을 콤마로 구분해서 나열한 뒤
가장 마지막에 추가될 디렉터리 경로 작성
COPY 원본경로 대상경로 로컬 디렉터리에서만 이미지로 파일을 복사 가능
RUN 명령어
RUN ["실행가능한파일", "명령줄 인자1", 
"명령줄 인자2", ...]
이미지 만들기 위해 컨테이너 내부에서 실행할 명령어 입력
명령어 실행 시 대화형 입력이 뜨지 않도록 옵션 지정해야 함
명령어를 실행할 때 bin/sh 를 바꾸고 싶을 때는 JSON 배열 형태로 사용 
WORKDIR 디렉터리 명령어를 실행할 디렉터리로 이동
cd 명령어 입력과 같음
EXPOSE 포트번호 Dockerfile의 빌드로 생성된 이미지에서 사용될 포트 지정
-p 명령어 입력
도커 파일로 만들어진 이미지로 만들고 실행한다고 해서 바로 특정 포트랑 연결되는 것이 아니기 때문에, 지정한 포트를 사용하겠다고 지정해야 함
CMD 명령어
CMD  ["실행가능한파일", "명령줄 인자1", 
"명령줄 인자2", ...]
컨테이너가 시작될 때마다 실행할 명령어 설정
Dockerfile에서 한번만 사용 가능
JSON 배열 형태로 사용 가능
도커 파일로 만들어진 최종 이미지가 컨테이너로 만들어질 때 최초로 실행되는 명령어를 작성하는 것

 

 

▶ Dockerfile 빌드

작성한 Dockerfile을 이용해 이미지를 생성하려면

docker build [옵션] Dockerfile이 존재하는 디렉터리 경로 

 

▷ -f 파일명 : Dockerfile의 파일명 별도 지정, 기본 값은 마지막에 지정된 디렉터리에 "Dockerfile" 이름인 파일을 가지고 사용되는데(이 경우에는 경로만 지정하면 된다.) 이 이름이 아닌 경우에 -f 옵션으로 지정할 수 있다.

▷ -t 이미지명:태그 [이미지명:태그 ...] : 생성될 이미지 이름 지정, 지정하지 않으면 16진수 형태 이름으로 자동 생성

 

예시 > docker build -t tomcat-web:1.0 ./

 

 

 

build해서 Dockerfile로 만든 이미지 확인

 

예시 > docker image inspect tomcat-web:1.0

 

해보면, Labels 부분에 Dockerfile에 기재한대로 잘 들어가 있는지 확인!

 

더보기

[이미지가 빌드되는 과정]

 

빌드 명령하면, 도커파일에 적힌 내용대로 위에서부터 아래로 순서대로 작업하면서 이미지를 만든다.

로그로 찍힌다.

[1/2] 이미지 가져오고

[2/2] 파일 카피

이미지 만들어서 그 이미지에

이름을 붙여준다.

 

- ADD나 RUN 명령어를 수행할 때 모든 명령들이 하나의 컨테이너를 만든다음에 실행하는 것이 아니라, 명령어가 실행될 때마다 새로운 컨테이너를 하나씩 만들어서 이미지로 COMMIT 한다.

- 내부적으로는 도커 파일에서 한 줄의 명령이 실행될 때마다 이전 명령에서 생성된 이미지를 가지고 다시 컨테이너를 만들어서 해당하는 명령어 수행하고 새로운 이미지 레이어를 만든다.

 

※ 빌드 컨텍스트 = 도커파일이 있는 폴더

도커 파일이 있는 폴더를 빌드할 때 필요한 파일이 들어있는 위치, 즉 도커 파일이랑 같은 경로에 넣으면 된다.

빌드할 때는 필요한 파일들만 따로 하나의 디렉터리(폴더)에 넣어서 빌드해야 한다.

(C:에 하지말 것! WHY? 모든 C드라이브의 하위에 있는 모든 파일을 읽어서 빌드하기 때문에 시간도 오래 걸리고 메모리를 엄청나게 차지한다.)

 

docker run -d --name myweb -p 80:8080 --link mydb:db tomcat-web:1.0

▷ -d : 백그라운드로 실행

▷ --name : 네임 속성

▷ -p : 포트 노출

▷ --link : 연결

 

 

http://localhost/main

으로 접속하면 스프링부트 프로젝트가 제대로 실행된다.

(500 에러 발생하면 오라클 db가 run 되고 있는지 확인해볼 것! exit 상태이면 run하고 확인)

 

 


 

[실습 1] 스프링부트 앱을 만들어보자.

 

- 우리가 만든 이미지는 부트로 만든 이미지기 대문에 jar 파일을 실행시키기 위한 베이스 이미지는 openjdk이면 된다.

 

- Dockerfile 파일 작성

 

- jar파일도 빌드 컨텍스트에 추가한다. 그래서 Dockerfile이 들어가 있는 폴더와 동일한 경로에 위치하도록 한다.

 

 

※※※명령어 주의점※※※

▶ ADD는 빌드 컨텍스트 뿐 아니라 URL 통해서 파일 가져오기 가능, ZIP, TAR 파일 넘겨주면 넘긴 다음에 내부에 풀어준다.

▶ COPY 무조건 빌드 컨텍스트에서만 가져올 수 있고, ZIP, TAR 파일을 풀어주지 않는다.

 

 

 

도커파일 오른쪽 클릭하고 Build images... 누르면

이렇게 커맨드 창이 위에 나오고 이렇게 명령어 입력하면

 

 

자동으로 빌드를 해준다.

 

 

그리고 images 확인해보면

 

 

이렇게 boot-web 이미지 각 다른 버전으로 2개가 잘 생성되었다.

 

 

docker run --rm --name boot-web -p 8088:8088 boot-web:2.0

이렇게 스프링 부트 프로젝트를 빌드하고,

 

http://localhost:8088/ 로 접속해보면, 스프링 부트로 생성한 앱이 잘 보인다.

 

 

Powershell2 에서

docker stop boot-web

하고 프롬프트로 돌아오고

 

Powershell1 에서

docker ps -a 로 확인해보면,

 

컨테이너 종료했을 뿐인데, 삭제 된 것은 아까 생성할 때 --rm 옵션이 있기 때문에 종료되면 자동으로 삭제해준다.

 

 

 

[실습에 사용했던 명령어들]

 

 

[실습 2] 배포하는 앱에 따라서 active profiles를 변경해보자.

 

 docker build -f .\Dockerfile_v2 --build-arg PORT=8088 -t boot-web:3.0 .

 

 

 

 

 

 

 

 

docker build -f .\Dockerfile_v2 --build-arg PORT=8099 --build-arg PROFILE=live -t boot-web:3.0 .

라이브 환경에서 배포할 때

 

docker run -it --rm --name boot-web -p 8099:8099 boot-web:3.0

run해보면 http://localhost:8099/ 로 접속하면 스프링 부트 프로젝트 잘 열림