웹사이트 검색

Docker 설명: 컨테이너화하고 Nginx를 프록시로 사용하는 방법


상태: 더 이상 사용되지 않음

이 문서는 더 이상 사용되지 않으며 더 이상 유지 관리되지 않습니다.

이유

이 문서의 기술은 구식이며 더 이상 Docker 모범 사례를 반영하지 않을 수 있습니다.

대신 보기

  • Docker 생태계: 공통 구성요소 소개
  • Ubuntu 14.04의 Docker 컨테이너에서 Nginx를 실행하는 방법

소개

웹 애플리케이션 서버에 대한 요청을 처리하고 정적 콘텐츠를 제공할 때 오랫동안 시도되고 테스트된 Nginx는 오늘날 매우 인기 있는 선택입니다. docker로 작업하고 애플리케이션을 컨테이너화할 때 Nginx가 애플리케이션을 제공하도록 하는 것이 대부분의 상황에 적합합니다. 결국 이러한 컨테이너를 사용하면 애플리케이션을 쉽게 포팅하고 빠르게 확장하며 호스트(즉, 드롭릿) 보안에 또 다른 계층을 추가할 수 있습니다.

이 DigitalOcean 기사에서는 빠르게 도커를 설정하고, 기본 이미지에서 도커 컨테이너를 만들고, Nginx를 레이어별로 실행하도록 빌드하는 방법에 대해 알아봅니다. 그런 다음 처음부터 단계에 따라 Dockerfile을 만들어 이 전체 프로세스를 자동화합니다. 결국 이 Nginx 도커 이미지를 사용하여 "도커화된\ 애플리케이션을 제공하는 데 사용할 수 있는 Nginx를 실행하는 자체 포함된 샌드박스를 만들 수 있습니다.

용어 사전

1. 도커 개요

2. Nginx 개요

3. 우분투에 도커 설치하기

4. 기본 Docker 명령

  1. docker 데몬 및 CLI 사용 실행
  2. 도커 명령

5. Nginx가 설치된 Docker 컨테이너 빌드

  1. Ubuntu에서 기본 Docker 컨테이너 만들기
  2. Nginx 설치를 위한 기본 컨테이너 준비
  3. Nginx 설치
  4. Nginx 구성

6. 이미지를 자동으로 빌드하기 위한 Dockerfile 만들기

  1. 도커파일 기초
  2. Dockerfile 명령 개요
  3. Dockerfile 만들기
  4. 기본 정의
  5. Nginx 설치 지침
  6. 부트스트래핑
  7. 최종 Dockerfile
  8. Dockerfile을 사용하여 Nginx 컨테이너 자동 빌드

도커 개요

docker 프로젝트는 일부 Linux 커널 기능 위에 구축된 함께 작동하는 상위 수준 도구를 제공합니다. 목표는 개발자와 시스템 관리자가 모든 종속성과 함께 응용 프로그램을 포팅하고 시스템과 시스템에서 두통 없이 실행되도록 돕는 것입니다.

Docker는 "docker 컨테이너\라고 하는 애플리케이션을 위한 안전한 LXC(즉, Linux 컨테이너) 기반 환경을 생성하여 이를 달성합니다. 이러한 컨테이너는 docker 이미지를 사용하여 생성되며, Dockerfile을 통해 수동 또는 자동으로 명령을 실행하여 빌드할 수 있습니다.

참고: docker 및 해당 부분(예: docker 데몬, CLI, 이미지 등)에 대한 자세한 내용은 프로젝트 소개 문서인 docker Explained: Getting Started를 확인하십시오.

Nginx 개요

Nginx는 고성능 웹 서버/(역)프록시)입니다. 가벼운 무게, 상대적으로 작업하기 쉬움, 확장(애드온/플러그인 사용)이 쉽기 때문에 인기를 얻었습니다. 아키텍처 덕분에 응용 프로그램이나 웹 사이트 로드에 따라 이전 대안을 사용하여 해결하기 정말 어려울 수 있는 많은 요청(사실상 무제한)을 처리할 수 있습니다. 이미지, 스크립트 또는 스타일 시트와 같은 정적 파일을 제공하기 위해 선택하는 도구로 간주될 수 있습니다.

Ubuntu에 Docker 설치(최신)

최신 릴리스(0.7.1. 12월 5일 날짜)를 통해 docker는 Ubuntu/Debian 및 CentOS/RHEL을 비롯한 다양한 Linux 운영 체제에 배포할 수 있습니다.

Ubuntu 13.04에 구축된 DigitalOcean의 바로 사용할 수 있는 도커 이미지를 사용하여 빠르게 시작할 수 있습니다.

Ubuntu(최신)의 설치 프로세스를 빠르게 살펴보겠습니다.

Ubuntu 설치 지침

물방울 업데이트:

sudo aptitude    update
sudo aptitude -y upgrade

aufs 지원이 가능한지 확인하십시오.

sudo aptitude install linux-image-extra-`uname -r`

패키지 확인을 위해 apt-key에 도커 리포지토리 키를 추가합니다.

sudo sh -c "wget -qO- https://get.docker.io/gpg | apt-key add -"

aptitude 소스에 도커 저장소를 추가합니다.

sudo sh -c "echo deb http://get.docker.io/ubuntu docker main\
> /etc/apt/sources.list.d/docker.list"

새 추가 항목으로 저장소를 업데이트합니다.

sudo aptitude    update

마지막으로 docker를 다운로드하여 설치합니다.

sudo aptitude install lxc-docker

우분투의 기본 방화벽(UFW: Uncomplicated Firewall)은 도커가 필요로 하는 모든 포워딩 트래픽을 기본적으로 거부합니다.

UFW로 전달 활성화:

나노 텍스트 편집기를 사용하여 UFW 구성을 편집합니다.

sudo nano /etc/default/ufw

아래로 스크롤하여 DEFAULT_FORWARD_POLICY로 시작하는 줄을 찾습니다.

바꾸다:

DEFAULT_FORWARD_POLICY="DROP"

와 함께:

DEFAULT_FORWARD_POLICY="ACCEPT"

CTRL+X를 누르고 Y로 승인하여 저장하고 닫습니다.

마지막으로 UFW를 다시 로드합니다.

sudo ufw reload

기본 Docker 명령

docker 작업을 시작하기 전에 사용 가능한 명령을 빠르게 살펴보고 첫 번째 시작하기 문서에서 기억을 되살려 보겠습니다.

docker 데몬 및 CLI 사용 실행

설치 시 docker 데몬이 백그라운드에서 실행 중이어야 하며 docker CLI에서 보낸 명령을 수락할 준비가 되어 있어야 합니다. docker를 수동으로 실행해야 하는 특정 상황의 경우 다음을 사용합니다.

도커 데몬 실행:

sudo docker -d &

도커 CLI 사용법:

sudo docker [option] [command] [arguments]

참고: 도커가 작동하려면 sudo 권한이 필요합니다.

도커 명령

다음은 현재 사용 가능한(버전 0.7.1) docker 명령에 대한 요약입니다.

attach:	Attach to a running container
build:	Build a container from a Dockerfile
commit:	Create a new image from a container's changes
cp:		Copy files/folders from the containers filesystem to the host path
diff:		Inspect changes on a container's filesystem
events:	Get real time events from the server
export:	Stream the contents of a container as a tar archive
history:	Show the history of an image
images:	List images
import:	Create a new filesystem image from the contents of a tarball
info:	Display system-wide information
insert:	Insert a file in an image
inspect:	Return low-level information on a container
kill:		Kill a running container
load:	Load an image from a tar archive
login:	Register or Login to the docker registry server
logs:	Fetch the logs of a container
port:	Lookup the public-facing port which is NAT-ed to PRIVATE_PORT
ps:		List containers
pull:		Pull an image or a repository from the docker registry server
push:	Push an image or a repository to the docker registry server
restart:	Restart a running container
rm:		Remove one or more containers
rmi:		Remove one or more images
run:		Run a command in a new container
save:	Save an image to a tar archive
search:	Search for an image in the docker index
start:	Start a stopped container
stop:	Stop a running container
tag:		Tag an image into a repository
top:		Lookup the running processes of a container
version:	Show the docker version information

의 시작하자!

===

Nginx가 설치된 Docker 컨테이너 빌드

VPS에 도커를 설치하고 해당 명령을 신속하게 검토한 후 Nginx를 실행하는 도커 컨테이너를 만드는 실제 작업을 시작할 준비가 되었습니다.

참고: 이 섹션을 수행한 후 Nginx가 설치된 도커 컨테이너를 실행하게 되지만 복잡하기 때문에 확실히 권장되는 방법은 아닙니다. 그러나 라이브 컨테이너로 작업하는 방법을 배우고 나중에 프로세스를 자동화하기 위해 정의해야 하는 명령에 익숙해질 수 있는 기회를 제공합니다. 훨씬 더 나은 방법으로 Nginx가 설치된 도커 이미지를 생성하려면 다음 섹션인 Nginx 이미지를 자동으로 빌드하기 위한 Dockerfile 생성을 참조하십시오.

Ubuntu에서 기본 Docker 컨테이너 만들기

docker의 RUN 명령을 사용하여 Ubuntu 이미지를 기반으로 새 컨테이너를 생성하는 것으로 시작합니다. "-t\ 플래그를 사용하여 터미널을 연결할 것입니다.

sudo docker run -i -t -p 80:80 ubuntu /bin/bash

참고: 이 명령을 실행한 후 docker는 새 컨테이너를 생성하기 전에 Ubuntu 이미지를 해야 할 수 있습니다.

기억하세요: 당신은 당신이 만든 컨테이너에 연결될 것입니다. 자신을 분리하고 기본 터미널 액세스 포인트로 돌아가려면 이스케이프 시퀀스(CTRL+P 다음에 CTRL+Q)를 실행합니다. 도커 컨테이너에 연결되는 것은 다른 내부에서 새로운 드롭릿에 연결되는 것과 같습니다.

이 컨테이너에 다시 연결하려면:

  1. sudo docker ps를 사용하여 실행 중인 모든 컨테이너 나열
  2. ID 찾기
  3. sudo docker attach [id]를 사용하여 터미널에 다시 연결

중요: 우리는 컨테이너에 있기 때문에 호스트에 영향을 주지 않고 다음 명령이 모두 컨테이너에서 실행된다는 점을 잊지 마십시오.

Nginx 설치를 위한 기본 컨테이너 준비

프로세스에 필요한 Nginx 및 도구를 설치하려면 관련 애플리케이션 저장소를 다운로드할 수 있어야 합니다.

Ubuntu의 universe를 기본 이미지의 기본 목록에 추가해 보겠습니다.

echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list

새로 추가된 소스로 목록을 업데이트합니다.

apt-get update

Nginx 설치를 진행하기 전에 만일을 대비하여 nano와 같은 몇 가지 도구를 설치해야 합니다.

apt-get install -y nano \
                   wget \
                   dialog \
                   net-tools    

Nginx 설치

저장소에서 사용할 수 있으므로 apt-get을 사용하여 nginx를 다운로드하고 설치할 수 있습니다.

apt-get install -y nginx

Nginx 구성

이전 단계에서 설치한 텍스트 편집기 nano를 사용하여 애플리케이션 서버에 대한 프록시 연결을 위한 샘플 Nginx 구성을 생성해 보겠습니다.

# Delete the default configuration
rm -v /etc/nginx/nginx.conf

# Create a blank one using nano text editor
nano /etc/nginx/nginx.conf

먼저 파일 상단에 Nginx가 프로세스를 생성한 다음 종료하지 않도록 한 줄을 추가해야 합니다.

우리가 이것을 허용할 수 없는 이유는 도커가 실행할 단일 프로세스(그럼에도 불구하고 프로세스 관리자일 수도 있음)에 의존하고 해당 프로세스가 중지되면(즉, 작업자 생성 후 종료) 컨테이너가 중지되기 때문입니다.

nginx.conf의 첫 번째 줄로 다음을 시작합니다.

daemon off;

간단한 샘플 구성을 사용하여 Nginx를 리버스 프록시로 실행합니다. daemon off; 명령 뒤에 다음을 복사하여 붙여넣으십시오.

worker_processes 1;

events { worker_connections 1024; }

http {

    sendfile on;

    gzip              on;
    gzip_http_version 1.0;
    gzip_proxied      any;
    gzip_min_length   500;
    gzip_disable      "MSIE [1-6]\.";
    gzip_types        text/plain text/xml text/css
                      text/comma-separated-values
                      text/javascript
                      application/x-javascript
                      application/atom+xml;

    # List of application servers
    upstream app_servers {
    
        server 127.0.0.1:8080;
    
    }

    # Configuration for the server
    server {

        # Running port
        listen 80;

        # Proxying the connections connections
        location / {

            proxy_pass         http://app_servers;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;

        }
    }
}

CTRL+X를 누르고 Y로 확인하여 저장하고 종료합니다.

Nginx를 실행하려면 다음을 실행할 수 있습니다.

service nginx start

그리고 그게 다야! -p 80:80 플래그를 사용하여 설정한 대로 포트 80의 외부 세계에서 액세스할 수 있는 도커 컨테이너에서 Nginx가 실행 중입니다.

알아두기: 이 Nginx 파일은 올바르게 구성되었더라도 현재 서버에서 실행 중인 응용 프로그램 서버가 없기 때문에 아무 작업도 수행하지 않습니다. 이 예제 대신 애플리케이션 서버가 설치되어 작동할 때까지 HTTP 헤더를 테스트하기 위한 정방향 프록시로 작동하는 다른 예제를 복사하여 사용할 수 있습니다.

이미지를 자동으로 빌드하는 Dockerfile 만들기

이전 단계에서 언급했듯이 확장 가능한 생산을 위해 이러한 방식으로 컨테이너를 생성하는 것은 확실히 권장되는 방법이 아닙니다. 올바른 방법은 Dockerfile을 사용하여 구조화된 방식으로 빌드 프로세스를 자동화하는 것으로 간주할 수 있습니다.

컨테이너 내부에 Nginx를 다운로드하고 설치하는 데 필요한 명령을 수행한 후 동일한 지식을 사용하여 도커가 이미지를 빌드하는 데 사용할 수 있는 Dockerfile을 구성한 다음 Nginx 인스턴스를 쉽게 실행하는 데 사용할 수 있습니다.

Dockerfile 작업을 시작하기 전에 기본 사항을 빠르게 살펴보겠습니다.

도커파일 기초

Dockerfile은 연속적으로 선언된 명령이 포함된 스크립트로, 새 도커 이미지를 자동으로 생성하기 위해 도커가 해당 순서대로 실행해야 합니다. 배포에 큰 도움이 됩니다.

이러한 파일은 항상 FROM 명령을 사용하여 기본 이미지를 정의하는 것으로 시작합니다. 여기서부터 빌드 프로세스가 시작되고 이후에 수행되는 각 작업은 호스트에 커밋될 최종 이미지를 형성합니다.

용법:

# Build an image using the Dockerfile at current location
# Tag the final image with [name] (e.g. *nginx*)
# Example: sudo docker build -t [name] .
sudo docker build -t nginx_img . 

참고: Dockerfile에 대해 자세히 알아보려면 Docker 설명: Dockerfile을 사용하여 이미지 빌드 자동화 문서를 확인하십시오.

Dockerfile 명령 개요

  • 추가: 호스트에서 컨테이너로 파일 복사
  • CMD: 실행할 기본 명령을 설정하거나 ENTRYPOINT로 전달
  • ENTRYPOINT: 컨테이너 내부의 기본 진입점 애플리케이션 설정
  • ENV: 환경 변수 설정(예: 키 = 값)
  • EXPOSE: 포트를 외부에 노출
  • FROM: 사용할 기본 이미지 설정
  • MAINTAINER: Dockerfile의 작성자/소유자 데이터 설정
  • RUN: 명령 실행 및 종료 결과(컨테이너) 이미지 커밋
  • 사용자: 이미지에서 컨테이너를 실행할 사용자 설정
  • 볼륨: 호스트에서 컨테이너로 디렉토리 마운트
  • WORKDIR: 실행할 CMD 지시어의 디렉토리 설정

Dockerfile 만들기

nano 텍스트 편집기를 사용하여 현재 위치에 Dockerfile을 생성하려면 다음 명령을 실행합니다.

sudo nano Dockerfile

참고: 빌드에 저장하고 사용할 Dockerfile을 구성하려면 다음 줄을 차례로 추가하십시오.

기초 정의

FROM 이미지(예: Ubuntu) 및 MAINTAINER와 같은 기본 사항(기본)을 정의하여 Dockerfile을 시작하겠습니다.

############################################################
# Dockerfile to build Nginx Installed Containers
# Based on Ubuntu
############################################################

# Set the base image to Ubuntu
FROM ubuntu

# File Author / Maintainer
MAINTAINER Maintaner Name

Nginx 설치 지침

이전 섹션의 단계에 따라 Nginx를 설치하도록 블록을 구성하겠습니다.

# Install Nginx

# Add application repository URL to the default sources
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list

# Update the repository
RUN apt-get update

# Install necessary tools
RUN apt-get install -y nano wget dialog net-tools

# Download and Install Nginx
RUN apt-get install -y nginx    

부트스트래핑

Nginx 설치 지침을 추가한 후 Nginx를 구성하고 기본 구성 파일을 빌드 중에 제공한 파일로 대체하도록 Dockerfile을 가져오는 작업을 마무리하겠습니다.

# Remove the default Nginx configuration file
RUN rm -v /etc/nginx/nginx.conf

# Copy a configuration file from the current directory
ADD nginx.conf /etc/nginx/

# Append "daemon off;" to the beginning of the configuration
RUN echo "daemon off;" >> /etc/nginx/nginx.conf

# Expose ports
EXPOSE 80

# Set the default command to execute
# when creating a new container
CMD service nginx start

최종 Dockerfile

결국 Dockerfile은 다음과 같이 표시됩니다.

############################################################
# Dockerfile to build Nginx Installed Containers
# Based on Ubuntu
############################################################

# Set the base image to Ubuntu
FROM ubuntu

# File Author / Maintainer
MAINTAINER Maintaner Name

# Install Nginx

# Add application repository URL to the default sources
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list

# Update the repository
RUN apt-get update

# Install necessary tools
RUN apt-get install -y nano wget dialog net-tools

# Download and Install Nginx
RUN apt-get install -y nginx  

# Remove the default Nginx configuration file
RUN rm -v /etc/nginx/nginx.conf

# Copy a configuration file from the current directory
ADD nginx.conf /etc/nginx/

# Append "daemon off;" to the beginning of the configuration
RUN echo "daemon off;" >> /etc/nginx/nginx.conf

# Expose ports
EXPOSE 80

# Set the default command to execute
# when creating a new container
CMD service nginx start

CTRL+X를 누르고 Y로 확인하여 파일을 다시 저장하고 종료합니다.

Dockerfile을 사용하여 Nginx 컨테이너 자동 빌드

"기본\ 섹션에서 처음 살펴본 것처럼 Dockerfiles의 사용법은 "docker build\ 명령으로 호출하는 것으로 구성됩니다.

현재 디렉터리에서 구성(예: nginx.conf)을 복사하여 기본 디렉터리를 바꾸도록 docker에 지시하고 있으므로 빌드 프로세스를 시작하기 전에 이 Dockerfile과 함께 이 구성이 있는지 확인해야 합니다.

참고: 위에서 설명한 Nginx 구성 복사 절차는 구성 파일을 생성하기 위해 컨테이너에서 자신을 연결 및 분리하지 않아도 되므로 유연성이 뛰어나고 많은 시간을 절약할 수 있습니다. 이제 하나를 사용하여 이미지를 직접 빌드하고 실행할 수 있습니다.

텍스트 편집기 nano를 사용하여 샘플 nginx.conf를 만듭니다.

sudo nano nginx.conf

그리고 테스트를 위한 정방향 프록시로 사용하도록 내용을 바꿉니다.

worker_processes 1;

events { worker_connections 1024; }

http {

    sendfile on;
    
    server {

        listen 80;
        
        location / {
            proxy_pass http://httpstat.us/;
            proxy_set_header  X-Real-IP  $remote_addr;
        }
    }
}

CTRL+X를 누르고 Y로 확인하여 동일한 방식으로 nginx.conf를 저장하고 종료합니다.

이 도커 이미지를 사용하면 모든 진행 상황을 포팅하고 단일 명령으로 Nginx를 실행하는 컨테이너를 빠르게 만들 수 있습니다.

사용을 시작하려면 다음을 사용하여 새 컨테이너 이미지를 빌드합니다.

sudo docker build -t nginx_img_1 . 

그리고 nginx_img_1로 태그가 지정된 해당 이미지를 사용하여 새 컨테이너를 실행할 수 있습니다.

sudo docker run -name nginx_cont_1 -p 80:80 -i -t nginx_img_1

이제 드롭릿의 IP 주소를 방문할 수 있으며 Nginx 실행 도커 컨테이너가 작업을 수행하여 HTTP 상태 테스트 페이지로 전달합니다.

예:

# Usage: Visit http://[my droplet's ip]
http://95.85.10.236/200

샘플 응답:

200 OK

docker(다른 OS 포함) 설치에 대한 전체 지침은 docker.io에서 docker 설치 설명서를 확인하세요.

제출자: