👩‍💻 BackEnd/🚛 도커 [Docker]

[Docker] 10/12 Dockerfile 명령어 / Docker build

minhe2810 2023. 10. 12. 09:17

Dockerfile에 대해서 

 

 Build 명령어 : 

완성된 이미지를 생성하기 위해 컨테이너에 설치해야하는 패키지, 추가해야하는 소스코드, 실행해야하는 명령어와 셸 스크립트 등을 하나의 파일에 기록

 

- 도커는 이 파일을 읽어 컨테이너에서 작업을 수행한 뒤 이미지로 만들어냄.

- 이러한 작업을 기록한 파일의 이름을 Dockerfile이라고 함.

 

이 Dockerfile을 읽어 이미지를 생성한다!! 

도커 엔진은 Dockerfile을 읽어 들일 때 기본적으로 현재 디렉터리에 있는 Dockerfile이라는 이름을 가진 파일을 선택 

이 도커 파일은 빈 디렉터리에 저장하는 것이 좋음! 나중에 이미지를 빌드 할 때 Context 때문!! 

 

 

FROM

- 빌드 프로세스를 시작하는 기본 이미지를 정의 

- 도커 런타임에 사용할 도커 이미지를 지정 

 

LABEL 

- 도커 이미지에 메타 데이터를 추가 

- 메타 데이터는 키-값 쌍으로 되어 있음 

- 이미지 작성 목적으로 버전, 타이틀, 설명, 라이선스, 정보 등을 작성 

- 1개 이상 작성 가능 

(인수인계시 용이) 

 

ARG 

- 사용자가 docker build 명령을 사용하여 빌더에 전달할 수 있는 변수를 정의 

- docker build 시점에서 변숫값을 전달하기 위해 --build-arg=인자를 정의하여 사용 

 

ARG db_name 
docker build --build-arg db_name=mysql .

 

COPY

RUN

- 이미지를 만들기 위해 컨테이너 내부에서 명령어를 실행 

 

CMD

- 컨테이너가 실행될 때마다 실행할 명령어(Command)를 설정 

- 한번만 실행 됨. 

- ENTRYPOINT 로 매개변수 전달 

 

ENTRYPOINT 

- CMD에서 보낸 매개변수를 받는 점이 다름 

- 컨테이너 실행 시 두 가지 다 최종적으로 명령어가 돈다. 

 

ADD 

- 파일을 이미지에 추가함. 추가하는 파일은 Dockerfile이 위치한 디렉터리인 Context 에서 가져옴. 

- 호스트 파일 복수 및 컨테이너 추가 

 

 

WORKDIR

- 명령어를 실행할 디렉터리

- 배시 셸에서 cd 명령어를 입력하는 것과 같은 기능을 함. 

- 여러 개 지정 가능 / WORKDIR 를 여러번 사용하면 cd 명령어를 여러번 사용한 것과 같음. 

 

 

ENV 

- Dockerfile에서 사용될 환경변수를 지정 

- 이 환경변수는 Dockerfile뿐만아니라 이미지에도 저장이 되므로 빌드된 이미지로 컨테이너를 생성하면 이 환경변수를 사용할 수 있음. 

 

VOLUME

빌드된 이미지로 컨테이너를 생성했을 때 호스트와 공유할 컨테이너 내부의 디렉터리를 설정 

 

EXPOSE

- Dockerfile의 빌드로 생성된 이미지에서 노출할 포트를 설정  

- p옵션을 통해 사용 

- 리스닝 하는 포트와 프로토콜을 지정하기 위해 작성 

 

CMD, ENTRYPOINT 차이점

ENTRYPOINT 는 커맨드를 인자로 사용할 수 있는 스크립트 역할을 할 수 있음. 

- 이 두개가 없으면 컨테이너는 생성되지 않고 에러를 출력함.

 

YAML 과 JSON 비교 

YAML

주석 사용가능 

한글 등의 유니코드를 그대로 사용 


Dockerfile 빌드 

1. 이미지 생성

## 빌드 명령어 
$ docker build -t mybuild:0.0 ./
  • -t 옵션 : 생성될 이미지의 이름을 설정 
  • -t 옵션을 사용하지 않으면 16 진수 형태의 이름으로 이미지가 저장됨. 가급적으로 이름을 지정해주자! 
  • docker 명령어 끝에는 Dockerfile 이 저장된 경로를 입력
  • 일반적으로 로컬에 있는 Dockerfile의 내용을 가져와 빌드할 수 있는데 이 경우에는 ./(현재 디렉터리)를 입력 (예시참고)
  • 외부 URL로 부터 Dockerfile의 내용을 가져와 빌드할 수도 있다. 
  • 만약 Dockerfile에 CMD설정 시 아파치 서버가 실행되도록 명시한 경우 빌드만 해도 웹 서버가 실행됨!!

생성된 이미지로 컨테이너 실행하기

## 이미지로 컨테이너 실행
$ docker run -d -P --name myserver mybuild:0.0
  • -P 옵션 : 이미지에 설정된 EXPOSE 의 모든 포트를 호스트에 연결하도록 설정 
## 이미지 EXPOSE 예시
EXPOSE 80
CMD apachect1 -DFOREGROUND
  • 컨테이너의 80번 포트를 사용한다는 의미 
  • 개발자는 어떤 포트가 사용되어야 하는지 명시할 수 있고, 이미지 사용자 입장에서는 컨테이너 내부에서 어떤 포트를 사용하는 지 알수 있게 됨. 
## 컨테이너와 연결된 호스트의 포트를 확인
$ docker port encoredb2

 

--filter / --label 옵션 

## filter 옵션을 통해 해당 라벨을 가지는 이미지만 출력 
$ docker images --filter "label=purpose=practice"
  • label 은 도커 이미지 뿐만 아니라 컨테이너, 도커 엔진 등에 메타데이터를 추가할 수 있는 유용한 방법 
  • label 은 부가적인 정보를 부여함으로써 원하는 조건의 컨테이너, 이미지 등을 쉽게 찾을 수 있도록 도와줌! 잘 기억해두기!! 
  • docker run 명령어에서 --label 옵션을, docker ps 에서 --filter 옵션을 적용가능 

빌드 과정 

이미지 빌드를 시작하면 

도커는 가장 먼저 빌드 컨텍스트를 읽어들임!! 

 

빌드 컨텍스트란? 

Dockerfile이 위치한 디렉터리가 빌드 컨텍스트가 됨! 

 

빌드 컨텍스트는 Dockerfile에서 빌드될 이미지에 파일을 추가할 때 사용됨. 

Dockerfile에서 이미지에 파일을 추가하는 방법은 ADD / COPY 활용하는 방법! 

이 명령어들은 빌드 컨텍스트의 파일을 이미지에 추가함.

 

따라서 Dockerfile이 위치한 곳에는 이미지 빌드에 필요한 파일만 있는 것이 바람직하다! 

※ 루트 디렉터리 (./) 와 같은 곳에서 빌드하지 않도록 주의! 다른 하위 폴더까지 포함되어 지나친 메모리를 차지할 수 있다. 

 

.dockeringnore 파일

  • 이 파일을 작성하면 이 파일에 명시된 파일을 컨텍스트에서 제외함. 
  • 이 파일은 컨텍스트의 최상위 경로, 즉 build 명령어에서 맨 마지막에 오는 경로인 Dockerfile이 위치한 경로와 같은 곳에 위치해야 함. 

 

이미지 빌드 중 오류 발생

  • build명령어가 중지되며 이미지 레이어 생성을 위해 마지막으로 생성된 임시 컨테이너가 삭제되지 않은 채로 남게 됨.
  • 이미지 빌드가 완전하지 않기 때문에 -t 옵션이었던 이미지 이름이 아닌 <none>:<none> 으로 이미지가 생성됨 

 

이미지 삭제 

$ docker rmi (이미지 ID)

AWS 

- ec2 (컴퓨터) : 데이터 베이스는 가상 머신에서 돌리는 게 더 나음 

- ecs (Amazon ECR) : 아마존이 제공하는 Docker(private repository). -> 이미지를 다 밀어넣을 수 있음. 

 - EKS : aws에서 쿠버네티스를 활용하는 것 

- Lamda : serverless - 코드만 돌리면 백그라운드는 aws 가 만들어 놓음 따라서 코드만 올리면 서비스가 됨. 

 

쿠버네티스 (K8S) - google 

- 여러대의 컴퓨터를 하나의 컴퓨터로 묶어주는 것.

- 오케스트레이션의 지휘자 (효율적으로 컴퓨터들을 관리해줌) 

 

 


컨테이너는 떳는데 주인을 잃음 댕글링 이미지 전체 삭제 

 docker images -f dangling=true
docker rmi alicek106/composetest
docker rmi $(docker images -q)  // 이미지 전체 삭제
docker ps -f ancestor=test  // test이름인 것들
docker ps -a -q // 실행 중인 컨테이너 아이디 값
docker ps -f ancestor=test // test이미지에서 파생된 이미지 파일 검색

-f : 검색 조건

docker ps -f name=mycontainer  // 이름 검색

* 오류 메시지

minhee@DESKTOP-68EJ19D:~/test222/repos$ docker rmi alicek106/composetest
Error response from daemon: No such image: alicek106/composetest:latest

코딩 공작소 

 

lass : 클라우드 기반, 컴퓨터 자원을 지원 

Cass : 클라우드 기반 

Sass : 주문형 소프트 웨어, 애플리케이션 배포할 필요 없이 바로 사용 가능, 대부분 웹브라우저를 통해서 서비스 / google 문서 SAP - slack 

Pass : 플랫폼 제공, 애플리케이션 

Fass : 람다 서비스 , 서버리스, 서버가 없다는 게 아니라 아키텍쳐 필요 없이 코드만 올리면 됨. api 많이 제작 

 

서비스 인터페이스 설계 

- RESTful API 

- URI 식별자 / 주소 

- JSON : 경량데이터 직렬화 프로토콜 

- HTTP 상태코드로 결과를 전달하라 

 

관련 링크를 표시하는 스프링 HATEOAS 구현  (응답 예시)

 

 

Spring Cloud Config 

구축 : 

  • 어플리케이션 구성 정보를 코드와 분리하는 것이 좋음 
  • 하드코딩 된 값을 사용하지 않음. 
  • 이 원칙을 무시하면 구성정보가 변경될 때 마다 재 컴파일, 재배포 
  • 분리를 하면 재배포, 재컴파일 하지 않고도 구성정보 변경 가능
  • 또 다른 산출물이 생겨 복잡할 수 있음(관리, 배포). -> 데브옵스 

 스프링 클라우드 콘피그 서버 

 

minhee@DESKTOP-68EJ19D:~$ cd msa/

minhee@DESKTOP-68EJ19D:~/msa/licensing-service$ ls -al

total 60
drwxr-xr-x 4 minhee minhee 4096 Oct 12 11:40 .
drwxr-xr-x 3 minhee minhee 4096 Oct 12 11:40 ..
-rw-r--r-- 1 minhee minhee  352 Dec  6  2022 .gitignore
drwxr-xr-x 3 minhee minhee 4096 Oct 12 11:40 .mvn
-rw-r--r-- 1 minhee minhee  833 Dec  6  2022 Dockerfile
-rw-r--r-- 1 minhee minhee  155 Dec  6  2022 build-for-m1.sh
-rw-r--r-- 1 minhee minhee  180 Dec  6  2022 docker-compose.yml
-rw-r--r-- 1 minhee minhee 9114 Dec  6  2022 mvnw
-rw-r--r-- 1 minhee minhee 5811 Oct  5 21:45 mvnw.cmd
-rw-r--r-- 1 minhee minhee  450 Oct  5 21:45 mvnw.cmd:Zone.Identifier
-rw-r--r-- 1 minhee minhee 2607 Dec  6  2022 pom.xml
drwxr-xr-x 4 minhee minhee 4096 Oct 12 11:40 src

메이븐 폴더 권한 주고 빌드

 

chmod 700 ./mvnw

 

./mvnw clean package  :

 

./mvnw package dockerfile:build : 자바 애플리케이션 빌드, 도커 이미지를 만드는 명령어 

 

docker run -d -p 9002:8080 ostock/licensing-service:0.0.1-SNAPSHOT : 도커 컨테이너를 실행, 컨테이너 서비스 시작 

 

http://localhost:9002/v1/organization/abc/license/afasdf 주소 입력

 

 

postgreSQL 

객체-관계형 데이터베이스 관리 시스템