본문 바로가기

컨테이너/Docker

Dockerfile을 통한 apache http server Docker image build 간단하게

Dockerfile 명령어를 학습하고

Dockerfile을 도커이미지로 빌드하여 컨테이너로 올려본다.

 

 

Dockerfile이란?

  • Docker는 Dockerfile을 읽어 자동으로 이미지를 build 할 수 있음
  • Dockerfile은 Docker 이미지가 어떤 단계를 거쳐 빌드되어야 하는지 그 단계를 알 수 있
  • Dockerfile은 이미지를 만들기 위한 모든 명령어를 담아낸 스크립트(설정파일)

Dockerfile 작성

  • Dockerfile을 작성할 때, 실제 파일의 이름을 'Dockerfile'로 만들어야함
  • 명령어는 대소문자를 구분하지 않음. 그러나 관례상 인수와 더 쉽게 구별하기 위해 대문자로 작성
  • Dockerfile 포맷 : 하나의 Dockerfile은 기본적으로 다음과 같은 구조를 가진 여러개의 명령문으로 구성되어 있음
#주석(comment)
명령어(INSTRUCTION) 인자(arguments)
  • 각 명령문은 명령어로 시작하고 여러개의 인자가 뒤에 따라올 수 있으며, 해당 명령문에 대한 주석도 달 수 있음

 

FROM 명령문

 

FROM <이미지>
FROM <이미지>:<태그>
  • 하나의 Docker 이미지는 baske 이미지부터 시작해서 기존 이미지 위에 새로운 이미지를 중첩해서 여러 단계의 이미지 층(layer)를 쌓아가며 만들어짐
  • FROM 명령문은 이 base 이미지를 지정해주기 위해 사용되는데, 보통 Dockerfile 내에서 최상단에 위치
    (base 이미지는 일반적으로 Docker Hub와 같은 Docker repository에 올려놓은 잘 알려진 공개 이미지인 경우가 많음)

 

 

 

WORKDIR 명령문

 

WORKDIR <이동할 경로>

 

  • WORKDIR 명령문은 쉘(shell)의 cd 명령문처럼 컨테이너 상에서 직접 디렉토리로 전환을 위해서 사용

 

 

 

RUM 명령문

 

RUN ["<커맨드>", "<파라미터1>", "<파라미터2>"]
RUN <전체 커맨드>
  • RUN 명령문은 마치 쉘(shell)에서 커맨드를 실행하는 것처럼 이미지 빌드 과정에서 필요한 커맨드를 실행하기 위해 사용
  • 새로운 레이어(layer)에 명령어를 실행하고 새로운 이미지를 생성하는 명령어
  • RUN 명령을 실행할 때마다 레이어가 생성되고 캐시
  • RUN 명령어는 보통 이미지 안에서 특정 소프트웨어를 설치하기 위해 많이 사용

 

 

 

ENTRYPOINT 명령문

 

ENTRYPOINT ["<커맨드>","<파라미터1>","<파라미터2>"]
ENTRYPOINT 커맨드 파라미터1 파라미터2
  • ENTRYPOINT 명령문은 이미지를 컨테이너로 띄울 때, 항상 실행되어야 하는 커맨드를 지정할 때 사용
  • ENTRYPOINT는 docker run 실행 시, 추가적인 명령어의 존재 여부와 상관없이 무조건 실행되는 명령

 

 

 

CMD 명령문

 

CMD ["<커맨드>","<파라미터1>","<파라미터2>"]
CMD ["<파라미터1>","<파라미터2>"]
CMD <전체 커맨드>
  • CMD 명령문은 해당 이미지를 컨테이너로 띄울 때 디폴트로 실행할 커맨드나, ENTRYPOINT 명령문으로 지정된 커맨드에 디폴트로 넘길 파라미터를 지정할 때 사용
  • CMD 명령문과 RUN 명령문의 차이
    - RUN 명령문은 이미지 빌드시에 항상 실행되며, 한 Dockerfile에 여러개의 RUN명령문을 선언할 수 있음
    - CMD 명령문은 이미지를 container로 띄울 때, 딱 한번 실행 기회를 가지며 이 기회마저도 docker run 커맨드에 인자를 넘길 경우 상실하게 됨.

 

 

 

EXPOSE 명령문

 

EXPOSE <포트>
EXPOSE <포트>/<프로토콜>
  • EXPOSE 명령문은 네트워크 상에서 컨테이너로 들어오는 트래픽(traffic)을 리스닝(listening)하는 포트와 프로토콜을 지정하기 위해 사용
  • 프로토콜은 TCP와 UDP 중 선택할 수 있는데 지정하지 않으면 TCP가 기본값으로 사용됨
  • EXPOSE 명령문으로 지정된 포트는 해당 컨테이너의 내부에서만 유효하며, 호스트 컴퓨터에서는 이 포트를 바로 접근할 수는 없고 호스트 컴퓨터로부터 해당 포트로의 접근을 허용하려면 docker run 커맨드를 -p 옵션을 통해 호스트 컴퓨터의 특정 포트를 포워딩(forwarding) 시켜줘야함

 

 

 

COPY/ADD 명령

 

COPY <src>... <dest>
COPY ["<src>",... "<dest>"]
  • COPY 명령문은 호스트 컴퓨터에 있는 디렉터리 파일을 Docker이미지의 파일 시스템으로 복사하기 위해서 사용
  • 절대 경로와 상대 경로를 모두 지원하며, 상대 경로를 사용할 때는 WORKDIR 명령문으로 작업 디렉터리를 어디로 전환했는지를 고려해야 함
  • ADD 명령문은 일반 파일 뿐만 아니라 압축파일이나 네트워크 상의 파일도 사용할 수 있음. 이렇게 특수한 파일을 다루는게 아니라면 COPY 명령문을 사용할 것을 권장

 

 

 

ENV 명령문

 

ENV <키> <값>
ENV <키>=<값>
  • ENV 명령문은 환경 변수를 설정하기 위해 사용
  • ENV 명령문으로 설정된 환경 변수는 이미지 빌드시에도 사용되고 해당 컨테이너에서 돌아가는 애플리케이션도 접근할 수 있음

 

 

 

ARG 명령문

 

ARG <이름>
ARG <이름>=<기본 값>
  • ARG 명령문은 docker build 커맨드로 이미지 빌드 시, --build-arg 옵션을 통해 넘길 수 있는 인자를 정의하기 위해 사용

 

 

 

.dockerignore 파일

  • .dockerignore 파일은 Docker 이미지를 빌드할 때 제외시키고 싶은 파일이 있을 때 사용

 

 

 

 

실제로 Dockerfile을 통해 Docker 이미지를 만들어을 해보자!!

 

 

Dockerfile 작성을 통한 Apache http 서버 설치 연습

  • Apache HTTP Server(일반적으로 Apache 라고 함)는 1995년에 Apache라는 비영리 재단에서 발표된 오픈소스 Web Server로써 가장 높은 점유율을 가지고 있는 Web Server임
    (참고로 Apache 재단에서 개발된 Apache Tomcat은 WAS기능을 일부 가지고 있는 Servlet Container)


먼저 apache-dockerfile 이라는 디렉토리를 만들고 Dockerfile을 작성한다.

 

 mkdir apache-dockerfile && cd apache-dockerfile
 vi Dockerfile

 

 

테스트 중인 환경 : Ubuntu 22.04.1 LTS 

 

# server image는 ubuntu 20.04를 사용
FROM ubuntu:20.04

# Dockerfile 작성자
MAINTAINER <작성자이름> <작성자의 메일주소>

# 패키지 설치시에 상호작용 방지 기능 적용
ARG DEBIAN_FRONTEND=noninteractive

# image가 올라갔을 때 수행되는 명령어
# -y 옵션을 넣어 무조건 설치가 가능하도록 설정
RUN \
	apt-get update && \
	apt-get install -y apache2

# apache가 기본적으로 80포트를 사용하기 때문에 expose 명령을 통해 apache server로 접근 가능하도록 설정
EXPOSE 80

# 컨테이너가 생성된 이후에 내부의 아파치 서버는 항상 실행중인 상태로 만들어줌
# apachectl을 daemon상태로 돌아가도록 설정
CMD ["apachectl", "-D", "FOREGROUND"]

 

 

Dockerfile을 Docker Image로 빌드

 

아래 명령을 통해 Dockerfile을 Docker Image로 build한다.

 

docker build -t [이미지 이름:이미지 버전] [Dockerfile 경로]

 

docker images 명령을 통해 확인해보면 도커 이미지가 잘 생성된 것을 확인해볼 수 있음!

 

 

 

Docker Image로 Container 생성

- 생성된 apache http server 이미지를 컨테이너로 생성하여 index.html 파일을 띄울것이다.

 

cd ~
mkdir html && cd html
vi index.html
#index.html 내용
Hello world

 

아래 명령을 통해 docker 이미지를 컨테이너로 올린다.

 

 docker run --name [docker 컨테이너명] -d -p 80:80 -v ~/html/:/var/www/html [docker 이미지명:이미지 버전]

 

 

docker ps 명령으로 확인해보면 컨테이너가 잘 올라간 것을 확인할 수 있음

 

 

 

curl -k http://localhost:80

 

 

 

curl 명령을 통해 index.html에 작성된 내용을 확인해볼 수 있음!!