Ubuntu 14.04のDockerコンテナでNginxを実行する方法

前書き

このチュートリアルでは、DockerコンテナにNginxをデプロイする方法を示します。

Nginxをコンテナ化することにより、システム管理者のオーバーヘッドを削減しました。 パッケージマネージャーを介してNginxを管理したり、ソースからビルドしたりする必要がなくなります。 Dockerコンテナを使用すると、Nginxの新しいバージョンがリリースされたときにコンテナ全体を簡単に置き換えることができます。 Nginx構成ファイルとコンテンツを維持するだけです。

Nginxは自分自身を次のように説明します。

_ nginx [engine x]は、HTTPおよびリバースプロキシサーバー、メールプロキシサーバー、および一般的なTCPプロキシサーバーであり、元はIgor Sysoevによって作成されました。 _

実際には、多くのシステム管理者はNginxを使用して、フラットファイルWebサイトからNodeJSのアップストリームAPIまで、Webコンテンツを提供します。 このチュートリアルでは、基本的なWebページを提供するため、DockerコンテナーでNginxを構成することに集中できます。

Dockerコンテナーは、比較的古い操作プラクティスの一般的な形式であるコンテナー化です。 コンテナー化は仮想化とは異なり、仮想化はハードウェアを抽象化し、コンテナー化はベースオペレーティングシステムも抽象化します。 実際には、これは、アプリケーション(またはアプリケーションのグループ)を取得し、それらを1つまたは複数のコンテナーにラップして、モジュラー、ポータブル、構成可能、および軽量にすることができることを意味します。

この移植性により、さまざまなオペレーティングシステムにDocker Engine(Docker Core、または単にDockerとも呼ばれます)をインストールでき、誰でも作成した機能コンテナーを実行できます。

Dockerの詳細については、https://www.digitalocean.com/community/tutorials/the-docker-ecosystem-an-introduction-to-common-components [Docker入門チュートリアル]をご覧ください。

この記事の目的のために、Ubuntu 14.04にDocker Engineをインストールします。

Ubuntu用のDockerの現在の安定バージョンである1.8.1をインストールします。

このチュートリアルは、Dockerを初めて使用するNginxユーザーを対象としています。 Nginxコンテナーをセットアップするための裸のコマンドだけが必要な場合は、ステップ1を実行してからステップ5にジャンプできます。

コンテナを段階的に構築し、ポートマッピングとデタッチモードについて学習する場合は、チュートリアル全体に従ってください。

前提条件

Nginxをコンテナ化するには、次を完了してください。

  • できればhttps://www.digitaloceanを使用して、https://www.digitalocean.com/community/tutorials/how-to-create-your-first-digitalocean-droplet-virtual-server [Ubuntu 14.04サーバー]をセットアップします。 com / community / tutorials / how-to-use-ssh-keys-with-digitalocean-droplets [SSH keys] for security

  • sudo userを設定します

  • カーネルバージョンを確認する

Docker 1.8.1は、かなり最近のカーネル機能に依存しているため、カーネルが* 3.10 *以上であることを確認してください。 新しいイメージではかなり新しいカーネルが実行されますが、確認する必要がある場合は、 `+ uname -r +`を実行するだけです。

uname -r

以下に、3.10を超える新しいUbuntu 14.04ドロップレットからの出力を含めたので、これをhttps://www.digitalocean.com/community/tutorialsで実行していない限り、心配する必要はありません。 / how-to-update-a-digitalocean-server-s-kernel [古い画像]。

Output3.13.0-57-generic

ステップ1-Dockerのインストール

Dockerは、マシン上でDockerを起動して実行するための起動スクリプトをホストします。 コマンドを実行するだけです:

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

これが完了すると、インストールされたバージョンが以下のように表示されます(読み取り値が新しくなる場合がありますが、これで問題ありません)。 ただし、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 +`コンテナを実行して、すべてが期待どおりに動作することを確認します。

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 Clientをインストールしたので、コンテナーと対話できるコマンドラインツールにアクセスできます。

次のコマンドを実行した場合;

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

コンテナに関する基本的な情報を確認できます。

「++」のような無意味な名前があることに気付くでしょう。コンテナの作成時に名前を指定しない場合、これらの名前は自動的に生成されます。

`+ hello-world +`サンプルコンテナが3分前に実行され、3分前に終了したこともわかります。

このコマンドでこのコンテナを再度実行すると( `++`を独自のコンテナ名に置き換えます):

sudo docker start

次に、コマンドを実行してコンテナーをリストします。

sudo docker ps -a

これで、コンテナが最近実行されたことがわかります。

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

デフォルトでは、Dockerコンテナーは割り当てられたコマンドを実行してから終了します。

一部のコンテナは、タスクのリストを実行して終了するように設定されますが、他のコンテナは無期限に実行されます。

Dockerの基本をいくつか確認したので、 `+ hello-world `イメージは削除する必要があります( `+`をコンテナ名に置き換えるか、コンテナIDを使用することを忘れないでください) 。

sudo docker rm

次に、Nginxの使用を開始します。

(オプション)ステップ3-ポートを公開する方法の学習

このセクションでは、Nginx Dockerイメージをダウンロードし、コンテナーを実行してWebサーバーとして一般にアクセスできるようにする方法を示します。

デフォルトでは、コンテナはインターネットからアクセスできないため、コンテナの_internal_ポートをDropletのポートにマッピングする必要があります。 それがこのセクションがあなたに教えることです!

ただし、最初にNginx画像を取得します。

次のコマンドを実行して、Nginx Dockerイメージを取得します。

sudo docker pull nginx

これにより、コンテナに必要なすべてのコンポーネントがダウンロードされます。 Dockerはこれらをキャッシュするので、コンテナを実行するたびにコンテナイメージをダウンロードする必要はありません。

Dockerは、https://hub.docker.com/ [Dockerhub]というサイトを維持しています。これは、Dockerファイル(公式およびユーザー送信の画像を含む)の公開リポジトリです。 ダウンロードした画像は公式のNginxのもので、独自の画像を作成する必要がありません。

次のコマンドでNginx Dockerコンテナーを開始しましょう。

sudo docker run --name docker-nginx -p 80:80 nginx
  • `+ run +`は新しいコンテナを作成するコマンドです

  • `+-name +`フラグはコンテナの名前を指定する方法です(空白のままにした場合、ステップ2のように割り当てられます)

  • `+ -p `は、公開するポートを ` -p local-machine-port:internal-container-port +`の形式で指定します。 この場合、コンテナのポート80をサーバーのポート80にマッピングしています

  • `+ nginx`はdockerhub上の画像の名前です(以前にpullコマンドでダウンロードしましたが、画像が見つからない場合はDockerがこれを自動的に行います)

Nginxを起動するために必要なことはこれだけです! DropletのIPアドレスをWebブラウザーに貼り付けると、Nginxの「Welcome to nginx!」ページが表示されます。

また、シェルセッションでは、コンテナをインタラクティブに実行しているため、サーバーにリクエストを送信するとNginxのログが更新されていることに気付くでしょう。

ブレークショートカット `+ CTRL + C +`を押して、シェルセッションに戻りましょう。

今すぐページを読み込もうとすると、「接続拒否」ページが表示されます。 これは、コンテナをシャットダウンしたためです。 次のコマンドでこれを確認できます。

sudo docker ps -a

次のような出力が表示されます。

OutputCONTAINER 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は、コンテナイメージを動作させるために添付する必要がある場合、あまり役に立ちません。そのため、次のステップでは、コンテナを切り離して独立して実行できるようにする方法を示します。

次のコマンドを使用して、既存の `+ docker-nginx +`コンテナを削除します。

sudo docker rm docker-nginx

次のステップでは、分離モードで実行する方法を示します。

(オプション)ステップ4-デタッチモードでの実行方法の学習

次のコマンドを使用して、新しい分離されたNginxコンテナーを作成します。

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

このコンテナをバックグラウンドで実行するために、 `+ -d +`フラグを追加しました。

出力は、新しいコンテナのIDになります。

listコマンドを実行した場合:

sudo docker ps

これまでに見たことのない出力でいくつか見ます。

OutputCONTAINER 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!」ページが再び表示されます。 今回は `+ -d +`フラグを指定したため、バックグラウンドで実行されます。これは、Dockerにこのコンテナをデタッチモードで実行するように指示するためです。

これで、分離されたコンテナにNginxの実行中のインスタンスができました!

ただし、構成ファイルを編集することはできず、コンテナはWebサイトファイルにアクセスできないため、まだ十分に役立ちません。

次のコマンドを実行してコンテナを停止します。

sudo docker stop docker-nginx

コンテナが停止したので(確認したい場合は `+ sudo docker ps -a +`で確認できます)、次のコマンドを実行してコンテナを削除できます。

sudo docker rm docker-nginx

これで、コンテナの最終バージョンに到達し、すぐにカスタムWebサイトファイルを生成できます。

ステップ5-Nginxで提供するWebページの構築

この手順では、Webサイトのカスタムインデックスページを作成します。 この設定により、(一時的な)コンテナの外部でホストされる永続的なウェブサイトコンテンツを作成できます。

以下のコマンドを実行して、ホームディレクトリ内にウェブサイトコンテンツ用の新しいディレクトリを作成し、そこに移動しましょう。

mkdir -p ~/docker-nginx/html
cd ~/docker-nginx/html

次に、HTMLファイルを作成しましょう(Vimのコマンドを示しますが、好きなテキストエディターを使用できます)。

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に精通している場合、これは非常に基本的なWebページであることがわかります。 BootstrapのCDN(Webページにレスポンシブスタイルのコレクションを提供するCSSフレームワーク)を指す `+ <link> +`タグが含まれています。 Bootstrapの詳細をご覧ください。

このファイルを保存するには、「+ ESC 」を押してから「:wq 」と「 ENTER +」を押します。

  • write( + w +)はVimに変更をファイルに書き込むよう指示します

  • quit( + q +)はVimに終了するよう指示します

これで、デフォルトのNginxランディングページを置き換える簡単なインデックスページが作成されました。

ステップ6-コンテナをローカルファイルシステムにリンクする

このセクションでは、すべてをまとめます。 Nginxコンテナーを起動して、ポート80を介してインターネットからアクセスできるようにし、サーバー上のWebサイトコンテンツに接続します。

ボリュームに関する背景情報。つまり、コンテナから永続的なサーバーコンテンツにリンクします。

Dockerを使用すると、仮想マシンのローカルファイルシステムからコンテナーにディレクトリをリンクできます。

私たちのケースでは、Webページをサーバー化するため、レンダリングするファイルをコンテナに提供する必要があります。

Dockerfileの一部としてファイルをコンテナにコピーするか、事後にコンテナにコピーすることができますが、これらのメソッドはどちらもWebサイトをコンテナ内の静的な状態のままにします。 Dockerのデータボリューム機能を使用すると、Dropletのファイルシステムとコンテナーのファイルシステムの間にシンボリックリンクを作成できます。 これにより、既存のWebページファイルを編集して、新しいファイルをディレクトリに追加すると、コンテナが自動的にアクセスします。 Dockerとボリュームの詳細については、https://docs.docker.com/userguide/dockervolumes/ [データボリュームドキュメント]をご覧ください。

Nginxコンテナはデフォルトで `+ / usr / share / nginx / html +`でインデックスページを検索するように設定されているため、新しいDockerコンテナでは、その場所のファイルへのアクセスを許可する必要があります。

リンクの作成:

これを行うには、 + -v +`フラグを使用して、ローカルマシン( `+〜/ docker-nginx / html +)からフォルダーをコンテナー内の相対パス( `+ / usr / share / nginx / html + `)。

これを実現するには、次のコマンドを実行します。

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で作成したWebページ)の最初の見出しが表示されます。

他のNginxのデフォルトに満足していれば、設定は完了です。

さらにコンテンツを `+〜/ docker-nginx / html / +`ディレクトリにアップロードすると、ライブWebサイトに追加されます。

たとえば、インデックスファイルを変更し、ブラウザウィンドウをリロードすると、リアルタイムで更新を確認できます。 必要に応じて、この方法でフラットなHTMLファイルからサイト全体を構築できます。 たとえば、 `+ about.html `ページを追加した場合、コンテナと対話する必要なく、 ` http:/// about.html +`でアクセスできます。

(オプション)ステップ7-独自のNginx構成ファイルの使用

このセクションは、Nginxコンテナーで独自のNginx構成ファイルを使用したい上級ユーザー向けです。 使用するカスタム設定ファイルがない場合は、この手順をスキップしてください。

ディレクトリに戻って、パブリックHTMLディレクトリに書き込まないようにしましょう。

cd ~/docker-nginx

デフォルトの設定ファイルをご覧になりたい場合は、Dockerのcopyコマンドを使用してコピーしてください:

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

Nginxにカスタムの `+ .conf +`ファイルを使用するため、コンテナを再構築する必要があります。

最初にコンテナを停止します:

sudo docker stop docker-nginx

それを削除します。

sudo docker rm docker-nginx

これで、デフォルトのファイルをローカルで編集できます(新しいディレクトリを提供するか、通常のNginxインストールの場合と同様に、トラフィックを別のアプリ/コンテナに転送するために「+ proxy_pass +」を使用します)。 Nginxの構成ファイルについては、https://www.digitalocean.com/community/tutorials/understanding-the-nginx-configuration-file-structure-and-configuration-contexts [Nginx config file guide]で確認できます。

カスタム構成ファイルを保存したら、Nginxコンテナーを作成します。 適切なパスを持つ2番目の `+ -v +`フラグを追加するだけで、新しいNginxコンテナに独自の設定ファイルから実行する適切なリンクを提供できます。

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

このコマンドは、カスタムWebサイトページ内でもコンテナーにリンクします。

コンテナの起動後に設定ファイルに変更を加えた場合は、 `+ docker restart +`コマンドを使用してコンテナを再起動する必要があることに注意してください。設定ファイルが変更された場合、Nginxはホットリロードしません。

sudo docker restart docker-nginx

結論

これで、カスタムWebページを提供する実行中のNginxコンテナーができました。

Nginxを他のコンテナにサービスを提供するためのリバースプロキシとして使用するためにコンテナをリンクすることについて学びたい場合は、ここからDockerのhttps://docs.docker.com/userguide/dockerlinks/ [コンテナリンク]を読むことをお勧めします。ベースのWebアプリ。

アプリコンテナー、データベースコンテナー、このNginxコンテナーなどのコンテナーのグループを管理する場合は、https://docs.docker.com/compose/ [Docker Compose]をご覧ください。

Related