반응형
해당 글에서는 Dockerfile에 대해 이해하고 이를 기반으로 Nginx를 구성하고 실행하는 방법에 대해 알아봅니다.
💡 [참고] Docker 파일을 설치하는 방법과 기본적인 흐름에 대해 궁금하시면 아래의 글을 참고하시면 도움이 됩니다.
분류 | 링크 |
Docker 환경 설치 및 실행 방법 | https://adjh54.tistory.com/350 |
Docker 기초 이론(아키텍처, 흐름, 주요 용어) | https://adjh54.tistory.com/352 |
Docker 컨테이너 라이프 사이클 & CLI | https://adjh54.tistory.com/359 |
DockerFile | https://adjh54.tistory.com/414 |
1) Dockerfile
💡 도커 파일(Dockerfile)
- 도커 이미지를 만들고 빌드하기 위한 ‘텍스트 파일’을 의미합니다. 이는 컨테이너 이미지를 구성하는데 필요한 모든 단계와 명령을 정의합니다.
- 도커 파일을 사용하면 반복적이고 일관적인 컨테이너 이미지 빌드 프로세스를 자동화할 수 있습니다.
1. Dockerfile 특징
💡 Dockerfile 특징
1. 텍스트 기반
- 일반 텍스트 파일로 작성되어, 코드 버전 관리 시스템을 통해 추적하고 관리할 수 있습니다.
2. 실행 명령어
- Docker 이미지를 구성하는 데 필요한 명령어를 포함합니다. 이 명령어들은 순차적으로 실행되며, 각 명령어가 새로운 레이어를 Docker 이미지에 추가합니다.
3. 고정된 환경
- Dockerfile을 통해 생성된 이미지는 이를 실행하는 환경에 상관없이 항상 동일한 결과를 생성합니다.
4. 재사용 가능
- Dockerfile은 재사용 가능하며, 다른 Dockerfile에 기반을 제공할 수 있습니다.
- 예를 들어, Python 환경을 설정한 Dockerfile을 작성한 다음, 이를 기반으로 Django를 설치하는 Dockerfile을 작성할 수 있습니다.
5. 빌드 자동화
- Dockerfile을 사용하면 이미지 빌드 과정을 자동화할 수 있습니다.
- Docker build 명령을 사용하여 Dockerfile을 바탕으로 Docker 이미지를 생성할 수 있습니다.
1. Dockerfile 수행과정
💡 Dockerfile 수행과정
1. Dockerfile
- 도커파일에서 일련의 명령을 작성하여 이미지를 빌드하는 방법을 지정합니다. 또한 이미지를 지정하고 필요한 패키지를 설치하고 파일을 복사하여 명령을 실행하는 등의 작업을 수행합니다.
2. Dockerfile → (Build)
- 도커 엔진이 도커 파일을 한 줄씩 읽어서 이미지를 빌드합니다 : Dockerfile Layer
3. Docker Image → (Run) → Docker Container
- 빌드된 이미지를 실행하여 도커 컨테이너를 구성합니다.
2) Dockerfile Layer
1. Dockerfile Layer
💡 Dockerfile Layer
- Dockerfile을 빌드하여 이미지를 생성할 때 각 명령어를 한 줄씩 읽어가며 이미지의 레이어를 생성하며, 각 생성된 레이어는 ‘변경 사항이 있는 경우에만 다시 빌드’가 됩니다.
- 변경 사항에 대해서만 다시 빌드하는 경우는 빌드 속도를 향상하고 중복 작업을 방지하기 위해 ‘레이어 캐싱’을 수행합니다
2. Dockerfile Cached Layer
💡 Dockerfile Cached Layer
- 명령의 결과를 ‘캐싱’하여 이미지 빌드 속도를 향상합니다. 이는 이전에 빌드된 레이어를 캐싱하여 ‘동일한 명령어를 실행할 때 재 사용’합니다.
- 이전에 빌드한 이미지의 레이어가 변경되지 않았다면 이전에 캐싱된 결과를 사용하여 다시 빌드하지 않으며 빌드 프로세스를 가속화하고 최종 이미지의 크기를 줄일 수 있습니다.
3. Dockerfile Update the instruction order
💡 Dockerfile Update the instruction order
- 명령어 순서를 변경하는 것은 빌드 과정에서 캐시를 효율적으로 활용하기 위해서입니다.
- Docker에서 각 명령어를 별도의 레이어에 저장하고 이전에 빌드한 적이 있는 레이어는 캐시에서 가져옵니다.
💡 사용예시
- 변경이 자주 발생하는 'COPY..' 명령어를 'COPY go.mod go.sum.'와 'COPY..'로 분리하고, 'RUN go mod download' 명령어를 두 명령어 사이에 배치하여 의존성 다운로드를 캐시 할 수 있게 했습니다.
- 이렇게 하면, 코드가 변경되었을 때 의존성 다운로드 단계를 건너뛸 수 있어 빌드 속도를 향상할 수 있습니다.
# syntax=docker/dockerfile:1
FROM golang:1.21-alpine
WORKDIR /src
- COPY . .
+ COPY go.mod go.sum .
RUN go mod download
+ COPY . .
RUN go build -o /bin/client ./cmd/client
RUN go build -o /bin/server ./cmd/server
ENTRYPOINT [ "/bin/server" ]
3) Dockerfile 명령어
1. 명령어 문법
💡 명령어 문법
- Dockerfile은 필요한 패키지, 환경 변수, 파일 복사 등의 작업을 단계별로 기술하여 이미지를 구성합니다.
- 이러한 구성을 위해 간단하고 직관적인 문법을 사용합니다. 각각의 명령어는 컨테이너 이미지의 계층으로 변환이 됩니다.
명령어 | 설명 |
ADD | 로컬 또는 원격 파일 및 디렉토리 추가 |
ARG | 빌드 시간 변수 사용 |
CMD | 기본 명령어 지정 |
COPY | 파일 및 디렉토리 복사 |
ENTRYPOINT | 기본 실행 가능한 파일 지정 |
ENV | 환경 변수 설정 |
EXPOSE | 애플리케이션이 수신 대기 중인 포트 설명 |
FROM | 기본 이미지에서 새로운 빌드 스테이지 생성 |
HEALTHCHECK | 컨테이너의 시작 시 건강 상태 확인 |
LABEL | 이미지에 메타데이터 추가 |
MAINTAINER | 이미지의 작성자 지정 |
ONBUILD | 빌드 시 이미지가 사용될 때의 지침 지정 |
RUN | 빌드 명령어 실행 |
SHELL | 이미지의 기본 셸 설정 |
STOPSIGNAL | 컨테이너 종료 시스템 콜 신호 지정 |
USER | 사용자 및 그룹 ID 설정 |
VOLUME | 볼륨 마운트 생성 |
WORKDIR | 작업 디렉토리 변경 |
4) Nginx
💡 Nginx
- 웹 서버, 리버스 프록시, 로드 밸런서, 메일 프록시 및 HTTP 캐시를 포함한 여러 기능을 제공하는 오픈 소스 소프트웨어입니다.
- 이는 동시에 수천 개의 연결을 처리할 수 있도록 설계되었으며, 이는 효율적인 이벤트 드리븐 아키텍처를 사용함으로써 가능합니다.
- 정적 컨텐츠를 서비스하는 데 사용되곤 하며, 이는 빠른 응답 시간과 낮은 메모리 사용량으로 인해 가능합니다. 또한, 리버스 프록시로서의 역할을 수행하여 백엔드 서버의 부하를 분산시키고, 캐싱, SSL 종료, HTTP/2 처리 등의 기능을 제공합니다.
5) Dockerfile + Nginx 사용예시 : 구성하기
💡 Dockerfile + Nginx 구성하기
- 해당 부분에서는 Dockerfile을 통해 Nginx를 구성하고 이미지를 생성 및 컨테이너를 올려서 구성한 html 파일을 띄우는 것을 목적으로 합니다.
1. 프로젝트 구조 구성
💡 프로젝트 구조 구성
파일 및 디렉터리 | 설명 |
Dockerfile | 해당 파일을 실행시켜 레이어를 구성하고 Nginx 이미지를 받아 재구성에 사용할 파일입니다. |
config | 설정 파일을 관리하는 디렉터리입니다 |
config/nginx.cof | Nginx를 실행하기 위한 환경설정이 구성된 파일입니다. |
html | html 파일들을 관리하는 디렉터리입니다. |
html/index.html | Nginx를 통해 실행될 파일입니다. |
2. Docker 파일 생성
💡 Docker 파일 생성
1. FROM nginx
- 기존 Docker hub에 있는 컨테이너 이미지 중 Nginx 이미지를 기반으로 새롭게 구성할 Docker 이미지를 생성합니다.
2. COPY ./config/nginx.conf /etc/nginx/conf.d/nginx.conf
- COPY A B A를 B로 복사합니다.
- 새로운 Nginx 설정 파일(내가 구성한 설정 파일)을 Nginx 이미지 경로 /etc/nginx/conf.d/nginx.conf에 복사합니다.
3. COPY ./html/index.html /usr/share/nginx/html/index.html
- COPY A B : A를 B로 복사합니다.
- 새롭게 구성한 html 파일을 Nginx 이미지 경로 /usr/share/nginx/html/index.html에 복사합니다. (최초 html을 연결하였습니다)
4. ENTRYPOINT ["nginx", "-g", "daemon off;"]
- Docker 컨테이너가 실행되면 자동으로 실행되는 명령어입니다.
FROM nginx
COPY ./config/nginx.conf /etc/nginx/conf.d/nginx.conf
COPY ./html/index.html /usr/share/nginx/html/index.html
ENTRYPOINT ["nginx", "-g", "daemon off;"]
3. nginx.conf 구성
💡 nginx.conf 구성
1. listen 80;
- Nginx가 80번 포트에서 클라이언트로부터 요청을 받아들입니다.
2. server_name localhost;
- 이 설정은 웹 서버의 호스트 이름을 localhost로 설정합니다.
3. access_log /var/log/nginx/host.access.log main;
- 접근 로그의 위치와 로그 포맷을 지정합니다. 이 경우, 로그 파일은 '/var/log/nginx/host.access.log'에 저장되고 'main' 포맷으로 저장됩니다.
4. location / { root /usr/share/nginx/html; index index.html index.htm; }
- 클라이언트로부터 root URL('/')에 대한 요청이 오면, '/usr/share/nginx/html' 디렉터리에서 'index.html' 또는 'index.htm' 파일을 찾아 반환합니다.
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
4. index.html 파일 구성
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>Welcome Nginx</h1>
</body>
</html>
6) Dockerfile + Nginx 사용예시 : 실행하기
1. 컨테이너 이미지 생성
💡 컨테이너 이미지 생성
- Docker를 빌드하여 nginx의 태그를 ‘simple-nginx’로 지정하여 수행합니다.
docker build -t nginx:simple-nginx .
💡 Docker Desktop을 통해서 컨테이너 이미지 생성을 확인합니다
2. 컨테이너 생성 및 실행
💡 컨테이너 생성 및 실행
- 생성된 컨테이너 이미지를 컨테이너로 생성하고 실행합니다.
- ‘simple-nginx’로 컨테이너 이름을 지정하였습니다.
$ docker run -d -p 8080:80 --name simple-nginx nginx:simple-nginx
💡 Docker Desktop을 통해서 컨테이너 생성 및 실행을 확인하였습니다.
💡 docker ps 명령어를 통해 Docker로 수행되고 있는 컨테이너를 확인하였습니다.
$ docker ps
3. 로컬 서버 접속
💡 로컬 서버 접속
- http:localhost:8080으로 접근하여 구성한 html의 출력을 확인하였습니다.
💡 [참고] 아래의 환경에서 테스트 해보실수 있습니다
오늘도 감사합니다. 😀
반응형
'Docker > 이론 및 문법' 카테고리의 다른 글
[Docker] Docker 이해하기 -4 : Docker Compose 이해하고 구성하기 (3) | 2024.06.07 |
---|---|
[Docker] Docker 이해하기 -2 : 컨테이너 라이프 사이클 & CLI 이해하기 (0) | 2023.12.22 |
[Docker] Docker 이해하기 -1 : 기초 이론(아키텍처, 흐름, 주요 용어) (2) | 2023.12.17 |