일지
교재도 좀읽어야겠따
주요 키워드
오늘의 할일
추가로 정리해야할 부분
수업 정리
Dockerfile
Dockerfile에서 사용하는 예약어(계속)
실행할 명령어 (이미지를 사용하여 빌드할 때 실행): ONBUILD
실행되는 시점
- RUN : 현재 Dockerfile에 따라 빌드 시 수행
- CMD, ENTRYPOINT : 빌드 된 이미지로 컨테이너 구동 시 수행
- ONBUILD : 현재 Dockerfile로 빌드된 이미지를 Base이미지로 사용하여 빌드할 때 실행
ONBUILD 예시 : Dockerfile.1
FROM nginx:latest
ONBUILD COPY index.html /usr/share/nginx/html
빌드: # docker image build -t nginx-base -f Dockerfile.1 .
테스트: # docker run -d –name web -p 80:80 nginx-base
# curl localhost
# docker rm -f web
ONBULID 예시 : Dockerfile.2
FROM nginx-base:latest
빌드: # docker image build -t nginx-new -f Dockerfile.2 .
테스트: # docker run -d –name web -p 80:80 nginx-new
# curl localhost
# docker rm -f web
컨테이너의 상태 확인 기능 설정 : HEALTHCHECK
사용법
HEALTHCHECK [옵션] CMD <체크하기 위해="" 실행할="" 명령="">
옵션
--interval : 상태확인 간격
--timeout : 일정 시간 응답없을 경우 timeout 기간 지정
--retires : 재시도 회수
예시 Dockerfile
FROM ubuntu
HEALTHCHECK --interval=10s --timeout=3s --retries=5 CMD test -f /tmp/test
CMD ["sleep", "infinity"]체크하기>
환경변수 설정 : ENV
사용법
ENV [변수이름] [변수값]
ENV [변수이름]=[변수값]
예시 Dockerfile
FROM ubuntu
ENV VAR1 Hello
ENV VAR2 World
ENV VAR3=merong
VAR4=test
VAR5=docker
빌드: # docker build -t ubuntu-env .
테스트: # docker run –rm -it ubuntu-env
# echo $VAR1
# env
참고
ARG: Dockerfile 내에서 사용되는 변수를 지정
Dockerfile 내에서만 유효하고, 실제 컨테이너 내에서는 사용되지 않음
–build-args 옵션으로 빌드 시 지정 가능
명령어를 실행하는 위치 : WORKDIR
별도로 위치를 지정하지 않을 경우 기본위치 : /
사용법: WORKDIR [경로]
WORKDIR /tmp
WORKDIR tmp
WORKDIR의 적용을 받는 Dockerfile 예약어:
RUN, CMD, ENTRYPOINT, COPY, ADD
WORKDIR 예시 Dockerfile
FROM ubuntu
WORKDIR /tmp
RUN touch test1
WORKDIR /etc
빌드 전 /etc/hosts 파일을 Dockerfile 위치로 복사
cp /etc/hosts .
COPY hosts ./hosts.test
WORKDIR /
WORKDIR tmp
RUN touch test2
사용자변경 : USER
명령어 등을 실행할 사용자 계정 지정
사용할 사용자는 미리 생성되어 있어야 함
FROM ubuntu
RUN id
RUN useradd testuser
USER testuser
RUN id
이미지에 대한 부가적인 정보 추가: LABEL
이미지에 대한 어떠한 정보라도 추가 가능. 항목이름=값
FROM ubuntu
LABEL maintainer “Seol KH”
LABEL image_name “ubuntu test”
LABEL image_ver=”1.0”
LABEL description=”This is test image using ubuntu”
컨테이너에서 노출시키는 네트워크 포트 정보: EXPOSE
FROM ubuntu
EXPOSE 80
EXPOSE 8080-8081
명령어 실행 시 자동으로 지정되는 쉘 설정 : SHELL
FROM ubuntu
SHELL [“/bin/bash”, “-c”]
CMD sleep infinity
빌드 후 확인: # docker image inspect <이미지명>이미지명>
파일 복사 : COPY, ADD
ADD와 COPY의 차이
- ADD는 tar, tar.gz, tgz, tar.bz2, tar.xz 파일 복사 시 자동 해제
- ADD는 네트워크 위치의 파일을 사용할 수 있음
- 네트워크 위치의 파일 지정 시 제한: https 사용불가, 압축해제 미지원
FROM ubuntu
RUN mkdir /add
RUN mkdir /copy
ADD test.tar.gz /add
COPY test.tar.gz /copy
볼륨 사용: VOLUME
주의사항: Docker Volume만 사용가능, 특정 볼륨 선택 불가
사용법: VOLUME <마운트포인트>
FROM ubuntu
VOLUME /tmp/test마운트포인트>
이미지 업로드
기본 이미지 업로드 위치: Docker Hub
Docker hub 가입을 통해 업로드 권한 사용
이미지 업로드 시 이미지의 태그 정보 수정 필요
/[:태그]
Docker hub는 무료 계정의 경우 1개의 Private Repository 생성 가능
Private Repository는 권한을 가지고 로그인된 사용자가 아닐 경우 접근 불가
Private Registry
다른 사람은 접근할 수 없는 위치에 Registry 생성
Private Registry 종류
registry
Docker에서 제공하는 컨테이너 기반의 Registry
인증 개념이 존재하지 않음
실행
# docker run -d -p 5000:5000 --name myregistry registry
이미지 push 시 이름 규칙
[:포트]/[:tag]
registry에 저장된 이미지 목록 확인
# curl -X GET http://localhost:5000/v2/_catalog
특정 repository의 tag 정보 확인
# curl -X GET http://localhost:5000/v2//tags/list
이미지 pull도 동일: [:포트]/[:tag]
Harbor Registry
---
#### 실습
```
Dockerfile 실습
1. 다음과 같이 이미지를 빌드할 수 있는 Dockerfile을 작성하시오. 이미지에 포함될 파일은 Dockerfile과 같은 디렉토리에 저장하여야 함.
1) 기본 이미지: centos:7
2) 이미지 빌드 시 수행할 작업
- 사용자 추가: testuser
- 패키지 설치: httpd
- 파일 생성: /tmp/testfile (testuser 사용자의 소유로 생성)
- 파일 복사: default.tar.gz 파일을 /var/www/html 위치로 복사 및 해제
3) 빌드된 이미지로 컨테이너 구동 시 실행할 명령
- httpd -D FOREGROUND (httpd를 foreground로 실행하기 위한 명령)
4) 컨테이너 구동시 사용할 환경변수 설정
- WEB_SERVER=httpd
- PLATFORM=docker
- CONTENTS_VERSION=0.1
5) 현재 이미지를 Base Image로 사용하여 이미지 빌드 시 실행할 명령
- newcontents.tar.gz 파일을 /var/www/html 위치로 복사 및 해제
default.tar.gz 내 파일 목록
1. index.html: docker 로고를 화면에 출력하는 html 페이지
2. docker.jpg: 대충 docker 로고 이미지 아무거나
index.html 파일 내용
Default Page
Default Web contents
newcontents.tar.gz 파일 내용
1. index.html: 변경한 이미지를 출력하는 html 페이지
2. img.jpg: 대충 아무 이미지
index.html 파일 내용
New Page
New Web contents
A)
1. mkdir 0511 && cd 0511
1. vi index.html
- 내용 붙여넣기
2. 로고는 알아서 준비하고
3. tar cvf default.tar.gz index.html docker.png
1. vi Dockerfile
2. 본문작성
FROM centos:7
RUN useradd testuser
RUN yum install httpd -y
USER testuser
RUN touch /tmp/testfile
ADD default.tar.gz /var/www/html
ONBUILD RUN http -D FOREGROUND
ENV WEB_SERVER=httpd
PLATFORM=docker
CONTENTS_VERSION=0.1
<이미지 빌드="">
docker image build -t prac1:1.0 .
<컨테이너 구동="">
docker run prac1:1.0
아니머지 뉴컨텐츠는 언제넣는거지 이게아닌가
강사님답안
# 기본 이미지
FROM centos:7
# 빌드 시 수행할 작업
# 1.사용자 추가
RUN useradd testuser
# 2.패키지 설치
RUN yum -y install httpd
# 3. testuser로 파일 생성
USER testuser
RUN touch /tmp/testfile
USER root
# 4. 파일 복사
ADD default.tar.gz /var/www/html
# 컨테이너 구동 시 실행할 명령
CMD ["httpd", "-D", "FOREGROUND"]
# 사용할 환경변수 지정
ENV WEB_SERVER=httpd\
PLATFORM=docker\
CONTENTS_VERSION=0.1
# 현재 이미지를 BASE IMAGE로 빌드를 수행할 때 컨텐츠 파일 추가
ONBUILD ADD newcontents.tar.gz /var/www/html
# 기본 이미지로부터 컨텐츠 추가를 위한 Dockerfile
FROM web-base
2. 다음과 같이 이미지를 빌드할 수 있는 Dockerfile을 작성하시오. 이미지에 포함될 파일은 Dockerfile과 같은 디렉토리에 저장하여야 함.
1) 기본 이미지: golang
2) 이미지 빌드 시 실행할 작업
- 파일 복사: main.go 파일을 /root로
- 빌드 시 main.go 파일 컴파일 실행:
go build -o /root/mainapp /root/main.go
- 이미지 실행 시 수행할 명령: /root/mainapp
main.go 파일 내용
package main
import "fmt"
func main() {
fmt.Println("hello world")
}
A:
1. mkdir 0511-2 && cd 0511-2
2. vi main.go
내용 붙여넣기
3. vi Dockerfile
FROM golang
COPY main.go /root
RUN go build -o /root/mainapp /root/main.go
CMD ["/root/mainapp"]
4. 이미지 빌드
docker image build -t prac2:1.0 .
5. 결과 확인
docker run prac2:1.0
강사님답안
FROM golang
WORKDIR /root
COPY main.go .
RUN go build -o mainapp main.go
CMD ["./mainapp"]
> golang 이미지 때문에 용량이 너무커짐 (964MB)
FROM golang
WORKDIR /root
COPY main.go .
RUN go build -o mainapp main.go
FROM alpine
WORKDIR /root
COPY --from=0 /root/mainapp .
CMD ["./mainapp"]
> --from=0 도커파일내 가장윗부분에서(0번째 from) 가져와라
FROM golang as builder
WORKDIR /root
COPY main.go .
RUN go build -o mainapp main.go
FROM alpine
WORKDIR /root
COPY --from=builder /root/mainapp .
CMD ["./mainapp"]
> 명칭만 통일하면 굳이 builder라고 안쓰고 막 as abbbbbb로 해도 작동가능
```
멀티스테이지 빌드(Multi-Stage Build)
이미지 작성 중 바이너리 파일을 빌드하는 등의 과정이 필요할 때, 최종 결과물로 필요한 것은 컴파일 된 바이너리 파일만 필요한 경우가 많으므로, 빌드에 사용되는 컨테이너를 임시로 생성하여 컴파일을 수행하고, 최종 빌드할 이미지는 컨테이너로부터 컴파일 된 파일만을 가져와서 실행하도록 빌드
컨테이너>이미지>
Leave a comment