Skip to content

Latest commit

 

History

History
248 lines (177 loc) · 7.49 KB

File metadata and controls

248 lines (177 loc) · 7.49 KB

개념과 기본 문법

  • 개념
    • docker 이미지를 작성할 수 있는 기능
    • Dockerfile 문법으로 이미지 생성을 위한 스크립트를 작성할 수 있고, 이를 기반으로 이미지를 생성
    • 배포를 위해서도 활용
  • 기본 문법
    • 명령 + 인자로 이루어짐
    • 명령은 통상적으로 대문자로 작성
    • 주석 사용 가능

Dockerfile 주요 명령

제목 없음

FROM

  • 베이스 이미지 지정 명령
  • 반드시 Dockerfile에 작성해야하는 명령
# Dockerfile 파일명으로 다음과 같이 작성

# 경령화된 linux 시스
FROM alpine

Dockerfile로 이미지를 작성 - build

docker build [옵션] [Dockerfile 경로]
  • 주요 옵션

제목 없음

  • 테스트
    • 위에서 작성한 dockerfile이 있는 동일 경로에서 다음과 같이 명령
    • -tag test는 이미지 이름을 test로 설정한 것이므로, 디폴트 태그가 붙어서 test:latest로 작성됨
    • 마지막의 '.'는 현재 폴더를 나타내는 것이고, 즉 현재 폴더에 Dockerfile 파일이 있음을 의미함
docker build --tag test ./
  • f 옵션 테스트
cp Dockerfile test_dockerfile
docker build --tag test2_image -f test_dockerfile .
docker images

LABEL

  • <key>=<value> 형식으로 메타 데이터를 넣을 수 있는 기능
  • 보통 아래와 같은 정보를 넣음
    • 저자
    • 버전
    • 설명
    • 작성일자

COPY

  • Dockerfile 생성
    • 하부 폴더 2021_DEV 폴더에 이미지에 추가할 파일들을 넣어 놓은 상태에서 다음과 같이 Dockerfile 작성
FROM httpd:alpine

LABEL maintainer="alphatechnicist@gmail.com"
LABEL version="1.0.0"
LABEL description="A test docker image to understand Docker"

# Dockerfile이 있는 그 위치 기준 상대경로
COPY ./2021_DEV /usr/local/apache2/htdocs

CMD

  • 다음 예에서 echo 명령만 달랑 써줄 경우, shell에서 실행하지 않고, 직접 해당 명령이 실행됨
  • shell에서 실행할 때, shell의 환경 변수등이 적용이 되지 않음
  • 따라서, 정확하게는 명확히 shell까지 지정해서 명령을 실행해 주는 것이 좋다.
  • /bin/sh -c 명령은 /bin 디렉토리에 있는 sh 프로그램 (기본 shell 프로그램)을 실행하되,
    • c 옵션은 shell 명령을 터미널 상에서 받지 않고, 인자로 받겠다라는 의미임
    • 따라서, /bin/sh -c echo라고 하면, echo라는 명령을 sh 프로그램 상에서 실행하겠다라는 의미
  • 쌍따옴표로 써야 함 (홀따옴표를 쓰면 안 됨)
  • CMD 명령을 적는 3가지 형태
# 1. 리스트에
CMD ["executable", "param1", "param2", ...]

CMD ["/bin/sh", "-c", "echo", "Hello"]

# 2. ENTRYPOINT 명령어에 인자를 리스트처럼 작성
CMD ["param1", "param2", ...]

# 3. shell 명령처럼 작성하는 형태
CMD <command> <param1> <param2> ...

CMD는 하나의 Dockerfile에서 한 가지만 설정되며, 만약 CMD 설정이 여러 개일 경우, 맨 마지막에 설정된 CMD 설정만 적용됨.

  • 가끔 사용하는 docker 명령1 : logs
    • 컨테이너 에러 또는 출력 결과 확인
docker logs [컨테이더ID 또는 이름]

#
docker logs httpdweb1
  • 가끔 사용하는 docker 명령2 : stop, kill
    • 컨테이너 중지하기
    • docker stop : 현재 실행중인 단계까지는 기다린 후에 중지
    • docker kill : 즉시 컨테이너를 중지시킴
  • base 이미지의 CMD를 덮어버리기
FROM httpd:alpine

LABEL maintainer="alphatechnicist@gmail.com"
LABEL version="1.0.0"
LABEL description="A test docker image to understand Docker"

# Dockerfile이 있는 그 위치 기준 상대경로
COPY ./2021_DEV /usr/local/apache2/htdocs

CMD ["/bin/sh"]
# 이미지 생성
docker build --tag myimage .

# -dit 옵션으로 터미널 붙이고, 포트 오픈하고, 백그라운드 실행, 컨테이너 중지시 삭제
docker run -dit -p 9999:80 --name myweb2 --rm myimage
  • 위와 같이 실행한 후, localhost:9999 접속시, 접속 실패
  • Dockerfile의 CMD 명령을 shell 명령에서 덮어버리기
docker run -dit -p 9999:80 --name myweb2 --rm myimage /bin/sh -c httpd-foreground

ENTRYPOINT

  • ENTRYPOINT는 docker run 시에 함께 넣어지는 CMD 명령에 덮어씌워지지 않고, 반드시 실행해야 하는 명령을 기입할 때 사용
  • 이 때, docker run 시 함께 넣어지는 명령은 ENTRYPOINT에 작성된 명령의 인자로 넣어지게 됨
  • 따라서, ENTRYPOINT에 컨테이너 실행시 반드시 실행되어야 하는 명령을 넣고
    • 별도로 각 컨테이너 생성시 필요한 인자를 CMD에 넣는 식으로 활용하기도 함
FROM httpd:alpine

LABEL maintainer="alphatechnicist@gmail.com"
LABEL version="1.0.0"
LABEL description="A test docker image to understand Docker"

# Dockerfile이 있는 그 위치 기준 상대경로
COPY ./2021_DEV /usr/local/apache2/htdocs

ENTRYPOINT ["/bin/sh"]
# 이미지 생성
docker build --tag myimage .

# -dit 옵션으로 터미널 붙이고, 포트 오픈하고, 백그라운드 실행, 컨테이너 중지시 삭제
docker run -dit -p 9999:80 --name myweb2 --rm myimage

RUN

  • docker 는 이미지 생성시, 각 단계를 layer로 나누어 작성함
    • 이를 통해 특정 단계 변경시, 전체 이미지를 다시 다운로드 받지 않아도 됨
  • RUN 명령은 이미지 생성시, 일종의 layer를 만들 수 있는 명령으로, 보통 베이스 이미지에 패키지(프로그램)을 설치하여, 새로운 이미지를 만들 때 많이 사용
...

# 한국 시간으로 설정
ARG DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Seoul
RUN apt-get install -y tzdata

RUN git clone -b be --single-branch https://github.com/POPPY-MAIL/dev.git

...
  • test
FROM ubuntu:18.04

LABEL maintainer="alphatechnicist@gmail.com"
LABEL version="1.0.0"
LABEL description="A test docker image"

RUN apt-get update
# apache2와 함께 apt-utils(설치관련 유틸리티를 가진 프로그램)도 설치
RUN apt-get install -y apache2 apt-utils

COPY ./2021_DEV_HTML /var/www/html/

ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
docker run -dit -p 9999:80 --name httpdweb5 --rm myweb4

EXPOSE

  • docker 컨테이너의 특정 포트를 외부에 오픈하는 설정
  • docker run -p 옵션으로 설정할 수도 있음
    • docker run -p 옵션은 컨테이너의 특정 포트를 외부에 오픈하고, 해당 포트를 호스트 PC의 특정 포트와 매핑시킴
    • 이에 반해, EXPOSE는 컨테이너 생성시, 특정 포트를 외부에 오픈하는 것만 설정하는 것.
    • 따라서, 독립적으로 실행시는 EXPOSE 옵션을 넣는다고 해서, 호스트 PC에서 해당 컨테이너에 포트번호로 접속할 수 있는 것은 아님

ENV

  • 컨테이너 내의 환경 변수 설정
  • 설정한 환경 변수는 RUN, CMD, ENTRYPOINT 명령에도 적용됨
# 한국 시간으로 설정
ARG DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Seoul
RUN apt-get install -y tzdata

WORKDIR

  • RUN, CMD, ENTRYPOINT 명령이 실행될 디렉토리
WORKDIR /home/dev/BACKEND/

RUN pip install -r requirements.txt