序章

このチュートリアルでは、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
  • run 新しいコンテナを作成するコマンドです
  • The --name フラグは、コンテナの名前を指定する方法です(空白のままにすると、手順2の nostalgic_hopper のように割り当てられます)
  • -p 公開するポートを次の形式で指定します -p local-machine-port:internal-container-port. この場合、コンテナのポート80をサーバーのポート80にマッピングしています。
  • nginx はdockerhub上のイメージの名前です(以前にpullコマンドでダウンロードしましたが、イメージが欠落している場合、Dockerはこれを自動的に実行します)

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

を押すと、このファイルを保存できます ESC、 その後 :wqENTER:

  • 書きます (w)ファイルに変更を書き込むようにVimに指示します
  • 終了する (q)Vimに終了するように指示します

これで、デフォルトの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 ボリュームリンクです。

  • -v ボリュームをリンクしていることを指定します
  • の左側の部分 : 仮想マシン上のファイル/ディレクトリの場所です(~/docker-nginx/html)
  • の右側の部分 : コンテナ内でリンクしている場所です(/usr/share/nginx/html)

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

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

より多くのコンテンツをにアップロードできます ~/docker-nginx/html/ ディレクトリ、そしてそれはあなたのライブウェブサイトに追加されます。

たとえば、インデックスファイルを変更し、ブラウザウィンドウをリロードすると、リアルタイムで更新されるのを確認できます。 必要に応じて、この方法でフラットな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

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

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

  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

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

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

  1. sudo docker restart docker-nginx

結論

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

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

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