웹사이트 검색

Ubuntu 14.04의 Docker 컨테이너에서 Nginx를 실행하는 방법


소개

이 자습서에서는 Docker 컨테이너에 Nginx를 배포하는 방법을 보여줍니다.

Nginx를 컨테이너화함으로써 우리는 sysadmin 오버헤드를 줄였습니다. 더 이상 패키지 관리자를 통해 Nginx를 관리하거나 소스에서 빌드할 필요가 없습니다. Docker 컨테이너를 사용하면 새 버전의 Nginx가 출시될 때 전체 컨테이너를 간단히 교체할 수 있습니다. Nginx 구성 파일과 콘텐츠만 유지 관리하면 됩니다.

Nginx는 자신을 다음과 같이 설명합니다.

nginx [engine x]는 원래 Igor Sysoev가 작성한 HTTP 및 역방향 프록시 서버, 메일 프록시 서버 및 일반 TCP 프록시 서버입니다.

실제로 많은 시스템 관리자는 Nginx를 사용하여 플랫 파일 웹사이트에서 NodeJS의 업스트림 API에 이르기까지 웹 콘텐츠를 제공합니다. 이 자습서에서는 기본 웹 페이지를 제공하므로 Docker 컨테이너로 Nginx를 구성하는 데 집중할 수 있습니다.

도커 컨테이너는 비교적 오래된 운영 관행인 컨테이너화의 대중적인 형태입니다. 컨테이너화는 가상화가 하드웨어를 추상화하는 반면 컨테이너화는 기본 운영 체제도 추상화한다는 점에서 가상화와 다릅니다. 실질적으로 이는 애플리케이션(또는 애플리케이션 그룹)을 컨테이너(또는 컨테이너)에 포장하여 모듈식, 휴대 가능, 구성 가능 및 경량으로 만들 수 있음을 의미합니다.

이 이식성은 다양한 운영 체제에 Docker 엔진(Docker Core라고도 하며 Docker라고도 함)을 설치할 수 있으며 누구나 작성한 기능 컨테이너가 실행될 수 있음을 의미합니다.

Docker에 대해 자세히 알아보려면 입문 Docker 자습서를 확인할 수 있습니다.

이 문서의 목적을 위해 Ubuntu 14.04에 Docker 엔진을 설치합니다.

Ubuntu용 Docker의 현재 안정 버전인 1.8.1을 설치합니다.

이 튜토리얼은 Docker를 처음 사용하는 Nginx 사용자를 대상으로 합니다. Nginx 컨테이너 설정을 위한 기본 명령만 원하는 경우 1단계를 수행한 다음 5단계로 이동할 수 있습니다.

컨테이너를 단계별로 구축하고 포트 매핑 및 분리 모드에 대해 알아보려면 전체 자습서를 따르십시오.

전제 조건

Nginx를 컨테이너화하려면 다음을 완료하십시오.

  • 보안을 위한 SSH 키 설정
  • sudo 사용자 설정
  • 커널 버전 확인

Docker 1.8.1은 최신 커널 기능에 의존하므로 커널이 3.10 이상인지 확인하십시오. 새로운 이미지는 상당히 새로운 커널을 실행하지만 확인이 필요한 경우 uname -r를 실행하십시오.

  1. uname -r

아래에 3.10 이상인 새로운 Ubuntu 14.04 Droplet의 출력이 포함되어 있으므로 이전 이미지에서 실행하지 않는 한 걱정할 필요가 없습니다.

Output
3.13.0-57-generic

1단계 - 도커 설치

Docker는 컴퓨터에서 Docker를 시작하고 실행하기 위한 시작 스크립트를 호스팅합니다. 간단히 다음 명령을 실행할 수 있습니다.

  1. sudo curl -sSL https://get.docker.com/ | sh

일반적으로 인터넷에서 임의의 스크립트를 셸( | sh)로 파이프하면 안 됩니다. 거의 모든 작업을 수행할 수 있기 때문입니다. 자신이 무엇을 얻고 있는지 알고 싶다면 get.docker.com을 살펴보십시오.

이 작업이 완료되면 아래와 같이 설치된 버전(판독값이 더 최신일 수 있음)과 sudo 없이/루트가 아닌 사용자로 실행하기 위한 몇 가지 지침이 표시됩니다. 하지만 sudo 사용자와 마찬가지로 이 튜토리얼을 실행하고 있으므로 이 튜토리얼의 목적을 위해 이에 대해 걱정할 필요가 없습니다.

Output
Client: Version: 1.8.3 API version: 1.20 Go version: go1.4.2 Git commit: f4bf5c7 Built: Mon Oct 12 05:37:18 UTC 2015 OS/Arch: linux/amd64 Server: Version: 1.8.3 API version: 1.20 Go version: go1.4.2 Git commit: f4bf5c7 Built: Mon Oct 12 05:37:18 UTC 2015 OS/Arch: linux/amd64

선택 사항: hello-world 컨테이너를 실행하여 모든 것이 예상대로 작동하는지 확인합니다.

  1. sudo docker run hello-world

아래와 비슷한 출력이 표시되어야 합니다.

Output
$ docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 535020c3e8ad: Pull complete af340544ed62: Already exists library/hello-world:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security. Digest: sha256:d5fbd996e6562438f7ea5389d7da867fe58e04d581810e230df4cc073271ea52 Status: Downloaded newer image for hello-world:latest Hello from Docker. This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker Hub account: https://hub.docker.com For more examples and ideas, visit: https://docs.docker.com/userguide/

이 작업이 완료되면 Docker의 기본 사항에 대해 자세히 알아볼 수 있습니다.

(선택 사항) 2단계 - 컨테이너 기본 사항 검토: 실행, 나열, 제거

이 섹션에서는 기본 컨테이너를 실행한 다음 제거하는 방법을 보여줍니다. 일반적인 Docker 사용 방법을 이미 알고 있고 Nginx 부분으로 건너뛰려면 5단계로 이동합니다.

Docker 설치의 일부로 Docker 클라이언트를 설치했으므로 컨테이너와 상호 작용할 수 있는 명령줄 도구에 액세스할 수 있습니다.

다음 명령을 실행하면;

  1. sudo docker ps -a

다음과 유사한 출력이 표시되어야 합니다.

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a3b149c3ddea hello-world "/hello" 3 minutes ago Exited (0) 3 minutes ago nostalgic_hopper

컨테이너에 대한 몇 가지 기본 정보를 볼 수 있습니다.

nostalgic_hopper와 같은 무의미한 이름이 있음을 알 수 있습니다. 이러한 이름은 컨테이너를 만들 때 지정하지 않으면 자동으로 생성됩니다.

또한 hello-world 예제 컨테이너가 3분 전에 실행되고 3분 전에 종료되었음을 알 수 있습니다.

이 명령으로 이 컨테이너를 다시 실행하면(nostalgic_hopper를 자신의 컨테이너 이름으로 교체):

  1. sudo docker start nostalgic_hopper

그런 다음 명령을 실행하여 컨테이너를 나열합니다.

  1. sudo docker ps -a

이제 컨테이너가 최근에 실행되었음을 확인할 수 있습니다.

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a3b149c3ddea hello-world "/hello" 4 minutes ago Exited (0) 9 seconds ago nostalgic_hopper

기본적으로 Docker 컨테이너는 할당된 명령을 실행한 다음 종료됩니다.

일부 컨테이너는 작업 목록을 통해 실행되고 완료되도록 설정되는 반면 다른 컨테이너는 무기한 실행됩니다.

이제 몇 가지 Docker 기본 사항을 살펴보았으므로 hello-world 이미지를 제거하겠습니다. 다시는 필요하지 않으므로 nostalgic_hopper 를 컨테이너 이름으로 바꾸거나 컨테이너 ID 사용).

  1. sudo docker rm nostalgic_hopper

다음으로 Nginx를 사용하기 시작합니다.

(선택 사항) 3단계 - 포트 노출 방법 배우기

이 섹션에서는 Nginx Docker 이미지를 다운로드하고 웹 서버로 공개적으로 액세스할 수 있도록 컨테이너를 실행하는 방법을 보여줍니다.

기본적으로 컨테이너는 인터넷에서 액세스할 수 없으므로 컨테이너의 내부 포트를 Droplet의 포트에 매핑해야 합니다. 이것이 바로 이 섹션에서 알려드릴 내용입니다!

하지만 먼저 Nginx 이미지를 얻습니다.

5단계에는 전체 컨테이너를 배포하기 위한 최종 명령이 포함되어 있으므로 구현 세부 정보에 지나치게 관심이 없다면 바로 건너뛸 수 있습니다.

다음 명령을 실행하여 Nginx Docker 이미지를 가져옵니다.

  1. sudo docker pull nginx

이렇게 하면 컨테이너에 필요한 모든 구성 요소가 다운로드됩니다. Docker는 이를 캐시하므로 컨테이너를 실행할 때 매번 컨테이너 이미지를 다운로드할 필요가 없습니다.

Docker는 Docker 파일(공식 이미지와 사용자가 제출한 이미지 모두 포함)의 공개 리포지토리인 Dockerhub라는 사이트를 유지 관리합니다. 우리가 다운로드한 이미지는 공식 Nginx 이미지로, 자체 이미지를 구축할 필요가 없습니다.

다음 명령으로 Nginx Docker 컨테이너를 시작하겠습니다.

  1. sudo docker run --name docker-nginx -p 80:80 nginx

  • run은 새 컨테이너를 생성하는 명령입니다.
  • --name 플래그는 컨테이너의 이름을 지정하는 방법입니다(비워 두면 2단계의 nostalgic_hopper와 같이 하나가 할당됨)
  • -p-p local-machine-port:internal-container-port 형식으로 노출하는 포트를 지정합니다. 이 경우 컨테이너의 포트 80을 서버의 포트 80에 매핑합니다.
  • nginx는 dockerhub에 있는 이미지의 이름입니다(전에 pull 명령으로 다운로드했지만 이미지가 없으면 Docker가 자동으로 이 작업을 수행함)

이것이 Nginx를 시작하는 데 필요한 전부입니다! Droplet의 IP 주소를 웹 브라우저에 붙여넣으면 Nginx의 "Welcome to nginx!\가 표시됩니다. 페이지.

또한 컨테이너를 대화식으로 실행하기 때문에 서버에 요청할 때 Nginx에 대한 로그가 업데이트되고 있음을 셸 세션에서 알 수 있습니다.

중단 바로 가기 CTRL+C를 눌러 쉘 세션으로 돌아갑시다.

지금 페이지를 로드하려고 하면 "연결 거부됨\ 페이지가 표시됩니다. 컨테이너를 종료했기 때문입니다. 다음 명령으로 이를 확인할 수 있습니다.

  1. sudo docker ps -a

아래 표시된 출력과 유사한 내용이 표시되어야 합니다.

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 05012ab02ca1 nginx "nginx -g 'daemon off" 57 seconds ago Exited (0) 47 seconds ago docker-nginx

Docker 컨테이너가 종료되었음을 알 수 있습니다.

Nginx가 작동하기 위해 컨테이너 이미지에 연결해야 하는 경우 Nginx는 그다지 유용하지 않을 것입니다. 따라서 다음 단계에서는 컨테이너가 독립적으로 실행될 수 있도록 컨테이너를 분리하는 방법을 보여드리겠습니다.

다음 명령을 사용하여 기존 docker-nginx 컨테이너를 제거합니다.

  1. sudo docker rm docker-nginx

다음 단계에서는 분리 모드에서 실행하는 방법을 보여줍니다.

(선택 사항) 4단계 - 분리 모드에서 실행하는 방법 배우기

다음 명령을 사용하여 분리된 새 Nginx 컨테이너를 만듭니다.

  1. sudo docker run --name docker-nginx -p 80:80 -d nginx

이 컨테이너를 백그라운드에서 실행하기 위해 -d 플래그를 추가했습니다.

출력은 단순히 새 컨테이너의 ID여야 합니다.

list 명령을 실행하면:

  1. sudo docker ps

우리는 이전에 보지 못한 출력에서 몇 가지를 보게 될 것입니다.

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b91f3ce26553 nginx "nginx -g 'daemon off" About a minute ago Up About a minute 0.0.0.0:80->80/tcp, 443/tcp docker-nginx

Exited (0) X minutes ago 대신 이제 Up About a minute가 있고 포트 매핑도 볼 수 있습니다.

브라우저에서 서버의 IP 주소로 다시 이동하면 "Welcome to nginx!\ 이 컨테이너를 분리 모드에서 실행하도록 Docker에 지시하는 -d 플래그를 지정했기 때문에 이번에는 백그라운드에서 실행됩니다.

이제 분리된 컨테이너에 실행 중인 Nginx 인스턴스가 있습니다!

그러나 구성 파일을 편집할 수 없고 컨테이너가 웹 사이트 파일에 액세스할 수 없기 때문에 아직 유용하지 않습니다.

다음 명령을 실행하여 컨테이너를 중지합니다.

  1. sudo docker stop docker-nginx

이제 컨테이너가 중지되었으므로(확인하려면 sudo docker ps -a로 확인할 수 있음) 다음 명령을 실행하여 컨테이너를 제거할 수 있습니다.

  1. sudo docker rm docker-nginx

이제 사용자 지정 웹 사이트 파일을 생성하기 위해 빠르게 중지하여 컨테이너의 최종 버전에 도달합니다.

5단계 - Nginx에서 제공할 웹 페이지 구축

이 단계에서는 웹 사이트에 대한 사용자 지정 인덱스 페이지를 만듭니다. 이 설정을 통해 (일시적) 컨테이너 외부에서 호스팅되는 영구 웹 사이트 콘텐츠를 가질 수 있습니다.

아래 표시된 명령을 실행하여 홈 디렉토리 내에 웹 사이트 콘텐츠를 위한 새 디렉토리를 만들고 이동해 보겠습니다.

  1. mkdir -p ~/docker-nginx/html
  2. cd ~/docker-nginx/html

이제 HTML 파일을 만들어 보겠습니다(Vim에 대한 명령이 표시되지만 원하는 텍스트 편집기를 사용할 수 있습니다).

  1. vim index.html

i를 눌러 삽입 모드로 들어갑니다. 아래에 표시된 내용을 붙여넣으십시오(또는 자유롭게 자신의 HTML 마크업을 추가하십시오).

<html>
  <head>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" integrity="sha256-MfvZlkHCEqatNoGiOXveE8FIwMzZg4W85qfrfIFBfYc= sha512-dTfge/zgoMYpP7QbHy4gWMEGsbsdZeCXz7irItjcC3sPUFtf0kuFbDz/ixG7ArTxmDjLXDmezHubeNikyKGVyQ==" crossorigin="anonymous">
    <title>Docker nginx Tutorial</title>
  </head>
  <body>
    <div class="container">
      <h1>Hello Digital Ocean</h1>
      <p>This nginx page is brought to you by Docker and Digital Ocean</p>
    </div>
  </body>
</html>

HTML에 익숙하다면 이것이 매우 기본적인 웹 페이지라는 것을 알 수 있습니다. 부트스트랩(웹 페이지에 반응형 스타일 모음을 제공하는 CSS 프레임워크)용 CDN을 가리키는 <link> 태그를 포함했습니다. 부트스트랩에 대한 자세한 내용을 읽을 수 있습니다.

이제 ESC를 누른 다음 :wqENTER를 눌러 이 파일을 저장할 수 있습니다.

  • write(w)는 Vim에게 변경 사항을 파일에 기록하도록 지시합니다.
  • quit(q)는 Vim에게 종료하라고 지시합니다.

이제 기본 Nginx 랜딩 페이지를 대체할 간단한 인덱스 페이지가 생겼습니다.

6단계 - 컨테이너를 로컬 파일 시스템에 연결

이 섹션에서는 모든 것을 하나로 합칠 것입니다. 포트 80을 통해 인터넷에서 액세스할 수 있도록 Nginx 컨테이너를 시작하고 서버의 웹 사이트 콘텐츠에 연결합니다.

볼륨에 대한 배경 정보 즉, 컨테이너에서 영구 서버 콘텐츠에 연결합니다.

Docker를 사용하면 가상 머신의 로컬 파일 시스템에서 컨테이너로 디렉터리를 연결할 수 있습니다.

우리의 경우 웹 페이지를 서버로 제공하기를 원하므로 컨테이너에 렌더링할 파일을 제공해야 합니다.

파일을 Dockerfile의 일부로 컨테이너에 복사하거나 나중에 컨테이너에 복사할 수 있지만 이 두 가지 방법 모두 웹 사이트를 컨테이너 내부의 정적 상태로 둡니다. Docker의 데이터 볼륨 기능을 사용하여 Droplet의 파일 시스템과 컨테이너의 파일 시스템 사이에 심볼릭 링크를 만들 수 있습니다. 이를 통해 기존 웹 페이지 파일을 편집하고 디렉터리에 새 파일을 추가할 수 있으며 컨테이너가 자동으로 해당 파일에 액세스합니다. Docker 및 볼륨에 대한 자세한 내용을 보려면 데이터 볼륨 설명서를 확인하세요.

Nginx 컨테이너는 기본적으로 /usr/share/nginx/html에서 인덱스 페이지를 찾도록 설정되어 있으므로 새 Docker 컨테이너에서 해당 위치에 있는 파일에 대한 액세스 권한을 부여해야 합니다. .

링크 만들기:

이를 위해 -v 플래그를 사용하여 로컬 머신(~/docker-nginx/html)의 폴더를 컨테이너의 상대 경로(< 코드>/usr/share/nginx/html).

다음 명령을 실행하여 이를 수행할 수 있습니다.

  1. sudo docker run --name docker-nginx -p 80:80 -d -v ~/docker-nginx/html:/usr/share/nginx/html nginx

-v ~/docker-nginx/html:/usr/share/nginx/html 명령에 새로 추가된 것이 볼륨 링크임을 알 수 있습니다.

  • -v는 볼륨을 연결하고 있음을 지정합니다
  • :의 왼쪽 부분은 가상 머신(~/docker-nginx/html)에서 파일/디렉토리의 위치입니다.
  • :의 오른쪽 부분은 컨테이너(/usr/share/nginx/html)에서 연결하는 위치입니다.

해당 명령을 실행한 후 이제 브라우저에서 DigitalOcean Droplet의 IP 주소를 가리키면 Hello Digital Ocean(또는 5단계에서 만든 웹 페이지)의 첫 번째 제목이 표시되어야 합니다.

다른 Nginx 기본값에 만족한다면 모든 설정이 완료된 것입니다.

~/docker-nginx/html/ 디렉터리에 더 많은 콘텐츠를 업로드할 수 있으며 라이브 웹사이트에 추가됩니다.

예를 들어 색인 파일을 수정하고 브라우저 창을 다시 로드하면 실시간으로 업데이트되는 것을 볼 수 있습니다. 원할 경우 이러한 방식으로 플랫 HTML 파일로 전체 사이트를 구축할 수 있습니다. 예를 들어 about.html 페이지를 추가한 경우 http://your_server_ip/about.html에서 액세스할 수 있습니다. 컨테이너와 상호 작용합니다.

(선택 사항) 7단계 - 자체 Nginx 구성 파일 사용

이 섹션은 Nginx 컨테이너에서 자체 Nginx 구성 파일을 사용하려는 고급 사용자를 위한 것입니다. 사용하려는 사용자 정의 구성 파일이 없으면 이 단계를 건너뛰십시오.

공개 HTML 디렉토리에 쓰지 않도록 디렉토리로 돌아가 보겠습니다.

  1. cd ~/docker-nginx

기본 구성 파일을 살펴보려면 Docker 복사 명령을 사용하여 복사하면 됩니다.

  1. sudo docker cp docker-nginx:/etc/nginx/conf.d/default.conf default.conf

Nginx용 사용자 지정 .conf 파일을 사용할 예정이므로 컨테이너를 다시 빌드해야 합니다.

먼저 컨테이너를 중지합니다.

  1. sudo docker stop docker-nginx

다음을 사용하여 제거하십시오.

  1. sudo docker rm docker-nginx

이제 로컬에서 기본 파일을 편집할 수 있습니다(새 디렉터리를 제공하거나 proxy_pass를 사용하여 일반 Nginx 설치에서와 같이 트래픽을 다른 앱/컨테이너로 전달). Nginx 구성 파일 가이드에서 Nginx의 구성 파일에 대해 읽을 수 있습니다.

사용자 지정 구성 파일을 저장했으면 Nginx 컨테이너를 만들 차례입니다. 적절한 경로와 함께 두 번째 -v 플래그를 추가하기만 하면 새로운 Nginx 컨테이너에 자신의 구성 파일에서 실행할 적절한 링크를 제공할 수 있습니다.

  1. sudo docker run --name docker-nginx -p 80:80 -v ~/docker-nginx/html:/usr/share/nginx/html -v ~/docker-nginx/default.conf:/etc/nginx/conf.d/default.conf -d nginx

또한 이 명령은 사용자 지정 웹 사이트 페이지에서 여전히 컨테이너에 연결됩니다.

구성 파일이 변경되면 Nginx가 핫 리로드하지 않기 때문에 컨테이너를 시작한 후 구성 파일을 변경하는 경우 docker restart 명령을 사용하여 컨테이너를 다시 시작해야 합니다.

  1. sudo docker restart docker-nginx

결론

이제 사용자 지정 웹 페이지를 제공하는 실행 중인 Nginx 컨테이너가 있습니다.

다른 컨테이너 기반 웹 앱을 제공하기 위해 Nginx를 리버스 프록시로 사용하기 위해 컨테이너를 함께 연결하는 방법을 배우려면 여기에서 Docker의 컨테이너 연결을 읽어보는 것이 좋습니다.

앱 컨테이너, 데이터베이스 컨테이너 및 이 Nginx 컨테이너와 같은 컨테이너 그룹을 관리하려면 Docker Compose를 살펴보십시오.