開発者ドキュメント

Ubuntu14.04のDockerコンテナでNginxを実行する方法

序章

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

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

Nginxはそれ自体を次のように説明しています:

nginx [engine x]は、HTTPおよびリバースプロキシサーバー、メールプロキシサーバー、および汎用TCPプロキシサーバーであり、元々はIgorSysoevによって作成されました。

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

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

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

Dockerについて詳しく知りたい場合は、Dockerの入門チュートリアルをご覧ください。

この記事の目的のために、Ubuntu14.04にDockerEngineをインストールします。

現在安定しているバージョンのDockerforUbuntuをインストールします。これは1.8.1です。

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

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

前提条件

Nginxをコンテナ化するには、次の手順を実行してください。

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

  1. uname -r

以下に、3.10を超える新しいUbuntu 14.04ドロップレットからの出力を含めました。したがって、古いイメージでこれを実行しない限り、心配する必要はありません。

Output
3.13.0-57-generic

ステップ1—Dockerをインストールする

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

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

一般に、ランダムなスクリプトをインターネットからシェル( | sh)にパイプするべきではありません。それらは、ほとんど何でもできるからです。 自分が何に夢中になっているのかを知りたい場合は、get.docker.comをご覧ください。

これが完了すると、以下に示すようなインストール済みバージョン(読み取り値が新しい場合があります。これで問題ありません)と、root以外/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イメージをダウンロードし、コンテナーを実行してWebサーバーとしてパブリックにアクセスできるようにする方法を示します。

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

ただし、最初にNginxイメージを取得します。

ステップ5には、完全なコンテナーをデプロイするための最後のコマンドが含まれているため、実装の詳細にあまり関心がない場合は、そこから直接スキップできます。

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

  1. sudo docker pull nginx

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

Dockerは、Dockerファイル(公式イメージとユーザー送信イメージの両方を含む)のパブリックリポジトリであるDockerhubというサイトを維持しています。 ダウンロードしたイメージは公式のNginxイメージであるため、独自のイメージを作成する必要がありません。

次のコマンドでNginxDockerコンテナを起動しましょう:

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

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

コンテナをインタラクティブに実行しているため、サーバーにリクエストを送信すると、シェルセッションで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 tonginx!」が表示されます。 もう一度ページ。 今回は、-dフラグを指定したため、バックグラウンドで実行されています。このフラグは、Dockerにこのコンテナーをデタッチモードで実行するように指示します。

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

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

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

  1. sudo docker stop docker-nginx

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

  1. sudo docker rm docker-nginx

これで、コンテナの最終バージョンに到達し、カスタムWebサイトファイルを生成するためのクイックストップがあります。

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

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

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

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

ESCを押してから、:wqENTERを押すと、このファイルを保存できます。

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

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

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

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

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

この場合、Webページをサーバー化したいので、コンテナーにレンダリングするファイルを与える必要があります。

Dockerfileの一部としてファイルをコンテナーにコピーすることも、事後にコンテナーにコピーすることもできますが、これらの方法はどちらも、コンテナー内でWebサイトを静的な状態のままにします。 Dockerのデータボリューム機能を使用することで、Dropletのファイルシステムとコンテナーのファイルシステムの間にシンボリックリンクを作成できます。 これにより、既存のWebページファイルを編集して新しいファイルをディレクトリに追加でき、コンテナがそれらに自動的にアクセスします。 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に新しく追加されたのは、ボリュームリンクであることがわかります。

そのコマンドを実行した後、ブラウザでDigitalOcean DropletのIPアドレスを指定すると、 Hello Digital Ocean (または手順5で作成したWebページ)の最初の見出しが表示されます。

他のNginxのデフォルトに満足している場合は、すべて設定されています。

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

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

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

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

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

  1. cd ~/docker-nginx

デフォルトの設定ファイルを確認したい場合は、Dockercopyコマンドを使用してコピーしてください。

  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

これで、デフォルトファイルをローカルで編集できます(新しいディレクトリを提供するため、または通常のNginxインストールの場合と同様にproxy_passを使用してトラフィックを別のアプリ/コンテナーに転送するため)。 Nginxの構成ファイルについては、Nginx構成ファイルガイドを参照してください。

カスタム構成ファイルを保存したら、Nginxコンテナーを作成します。 適切なパスを使用して2番目の-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

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

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

  1. sudo docker restart docker-nginx

結論

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

Nginxを他のコンテナーベースのWebアプリに提供するためのリバースプロキシとして使用する目的でコンテナーをリンクする方法について知りたい場合は、ここからDockerのコンテナーリンクを読むことをお勧めします。

アプリコンテナ、データベースコンテナ、このNginxコンテナなどのコンテナのグループを管理する場合は、 DockerComposeをご覧ください。

モバイルバージョンを終了