[Docker] 10/12 Dockerfile 명령어 / Docker build
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
객체-관계형 데이터베이스 관리 시스템