Docker Lab #3

반영환·2023년 6월 20일
0

Docker

목록 보기
12/18
post-thumbnail

Docker Week 3

docker file

FROM centos:7

MAINTAINER jaeyoung byun <test@gmail.com>
LABEL description="This is my multiline description of the software\
date="2020.2.5“

RUN yum install -y httpd ENV NAME jaeyoung ARG memory=1024 WORKDIR /tmp/

COPY index.html .

ADD a.tar.gz /tmp/

ADD ftp://59.29.224.87/pub/a.txt /tmp/ RUN useradd -s nologin apache

USER apache

EXPOSE 80 443/tcp

CMD ["/usr/sbin/httpd", "-DFOREGROUND"]

docker file 기본 구성

# : 주석

FROM : base image

유효한 도커파일은 반드시 FROM 구문으로 시작해야 한다.

RUN : Command run

RUN <command>

ADD/COPY

CMD/ENTRYPOINT

  • CMD
    - docker run 명령 시 적용할 command를 나열
    - cmd는 하나만 적용 가능하고,여러 개 입력 시 마지막 것으로 적용
    • 컨테이너 동작 시 다른 명령으로 전환가능
  • ENTRYPOINT
    - CMD와 동일한 목적으로 사용되나 docker run 명령에서 전환불가
    - CMD와 함께 사용시
    - ENTRYPOINT는 기본 명령어, CMD는 인수를 적용

LABLE

  • 버전,커맨드등의 정보를 이미지에 심을 때 사용
    - LABEL <key>=<value> <key>=<value> <key>=<value> ...
  • value에 공백 포함 시 ““ 를 사용
LABEL "com.example.vendor"="ACME Incorporated" LABEL com.example.label-with-value="foo"
  
LABEL version="1.0"
  
LABEL description="This text illustrates \
that label-values can span multiple lines."
  
LABEL multi.label1="value1" multi.label2="value2" other="value3"
  
LABEL multi.label1="value1" \ multi.label2="value2" \ other="value3"

ENV/ARG

ARG 로 변수를 지정할 때에는 컨테이너로 기동하는 시점에는 변수 값이 존재하지 않는다.

FROM busybox
  
COPY test.sh /root/test/env_arg/test.sh
  
ENV DIR=/root/test/env_arg
#ARG DIR=/root/test/env_arg
  
RUN echo ${DIR}
  
CMD ${DIR}/test.sh

EXPOSE

  • dockerfile을 작성하는 개발자와 컨테이너를 운영하는 운영자가 컨테이너에서 공개할 포트를 알려주기 위해 문서 유형으로 작성
  • 명령 자체가 작성된 포트를 실행해 리스닝하게 하는 것이 아니기 때문에 실제로 포트를 열 때에는 -p 옵션을 사용해야 한다.
    	docker run -p 80:80/tcp ...

USER

FROM centos:7
LABEL TEST="id"
RUN id

RUN useradd jaeyoung
RUN id

USER jaeyoung
RUN id

RUN useradd -s nologin apache
USER apache
  • 유저를 변경 안하고 root 로 이미지를 기동하면 로그, 데이터 등 파일이 로컬로 떨어지는 곳에 접근하기 위해서는 root로만 접근해야 한다.
  • 이는 보안상 문제가 되기 쉬우며 반드시 유저를 생성해서 일반 유저로 컨테이너를 사용해주어야 한다.
    • root계정 절대 사용 X
  • uid가 일치하면 같은 계정으로 인식한다.

VOLUME

  • 컨테이너 내부 데이터는 컨테이너가 삭제되면 같이 사라진다. 따라서 데이터를 보존하기 위해 VOLUME 마운팅을 진행해야 한다.
  • docker container inspect <container-id> 로 경로를 파악할 수 있다.
  • docker run 시점에 호스트 OS의 경로를 변경할 수 있다.
# docker run -it -v [호스트OS 경로]:[컨테이너 경로] [이미지명] /bin/bash
docker run -it -v /log/docker/log/:/var/log/ test/vol /bin/bash

WORKDIR

  • 도커파일에서는 절대 경로로 작성해야 하는데 절대 경로의 일정 부분을 지정해준다.
  • 한 번 지정되면 이후에 다른 명령어를 사용할 때 WORKDIR에서 지정한 경로 이후 경로만 작성하면 된다.

ONBUILD

처음 사용한 도커 파일에서 빌드할 때 실행되는 명령이 아니며, 빌드된 이미지가 다른 곳에서 재사용될 때 실행되는 기능인데 사용하지 말자.

imutable하게 사용해야 하는 이미지를 조정하기 때문에 옳은 방법이 아니다.

HEALTHCHECK

FROM centos:7
  
RUN touch /etc/yum.repos.d/nginx.repo && echo -e '[nginx]\nname=nage repo\nbaseurl=http://nginx.org/packages/centos/7/$basearch/\ngpgcheck=0\nenabled=1' > /etc/yum.repos.d/nginx.repo

RUN yum -y install nginx curl

HEALTHCHECK --interval=10s --timeout=3s CMD curl -f http://127.0.0.1/ || exit 1

#nginx를 백그라운드로 실행
CMD ["nginx", "-g", "daemon off;"]


watch -n 0.5 docker ps -l : 체크한 시간 간격으로 명령어를 지속적으로 실행시킨다. 테스트 용으로 자주 사용되며 맥북은 brew install watch 를 통해 설치 후 사용한다.

docker file 권장 사항

docker file로 이미지 생성하기

# docker build [OPTION] <Dockerfile 이 있는 PATH>

docker build -t myapp .

docker build -t myapp:1.0.1 -f /usr/myDockerfiles/Dockerfile .  

docker file 이모저모

  • docker file 빌드할 때 항상 새로운 파일에서 진행하자.
mkdir <filename>
  • 빌드될 때가 아닌, 이미지가 실행될 때에만 CMD [] 형식으로 가독성을 높이자.
  • CMD는 사용자가 컨테이너를 실행할 때 명령어를 추가 작성해 교체할 수 있다.
docker run test/df ps -aef 
# ps -aef가 CMD에 실행된 명령어 대신 실행된다. 
profile
최고의 오늘을 꿈꾸는 개발자

0개의 댓글