Ubuntu 22.04でDockerコンテナ上でNginxを実行する方法
イントロダクション
Nginxは、静的または動的なウェブサイトの配信、逆プロキシ、負荷分散、その他のHTTPやプロキシサーバーの機能に使用されるオープンソースのウェブサーバーです。大量の同時接続を処理するために作られ、インターネット上で最大かつ最もアクセスの多いサイトのホスティングに使用される人気のあるウェブサーバーです。
Dockerは人気のあるオープンソースのコンテナ化ツールであり、従来のサーバーや仮想マシンに比べて少ないリソースを消費しながら、ソフトウェアアプリケーションのポータブルで一貫した実行環境を提供するために使用されます。Dockerはコンテナを使用し、カーネルやファイルシステムのようなシステムリソースを共有しながら、オペレーティングシステムレベルで実行される分離されたユーザースペース環境です。
Nginxをコンテナ化することで、システム管理の手間を削減することが可能です。たとえば、パッケージマネージャでNginxの管理やソースからビルドする必要がありません。Dockerコンテナを使用すると、新しいバージョンのNginxがリリースされた場合には、コンテナ全体を置き換えることができます。これにより、Nginxの設定ファイルとコンテンツのみを管理すれば良くなります。
このチュートリアルでは、NginxをDockerコンテナで設定して、小さなウェブページを提供する方法を学びます。
前提条件
このチュートリアルに従うためには、以下が必要です。
- One Ubuntu 22.04 server set up by following the Ubuntu 22.04 initial server setup guide, including a sudo non-root user and a firewall.
- Docker installed on your server. Complete Steps 1 and 2 of our How To Install and Use Docker on Ubuntu 22.04 tutorial.
あなたのサーバーにDockerがインストールされている場合、最初のステップに進むことができます。
ステップ1 — Docker HubからNginxをダウンロードする
Dockerは、公式とユーザーが提供するイメージを含むDockerファイルの公開リポジトリであるDockerhubというサイトを管理しています。Dockerの公式イメージは、独自のイメージをビルドする手間を省くことで、アプリケーションの迅速な開発に利用することができます。これらのイメージは、Dockerコミュニティによって管理されており、最も一般的な使用ケースに対応しています。
以下のコマンドを実行することで、デフォルトのNginx設定を備えたプリビルド済みのDockerイメージからNginxをダウンロードできます。
- docker pull nginx
コンテナのために必要なすべてのコンポーネントをダウンロードします。Dockerはこれらをキャッシュしており、コンテナを実行する際には毎回コンテナイメージをダウンロードする必要がありません。
Nginxがインストールされているので、コンテナを設定してウェブサーバーとして公開できます。Nginx Dockerコンテナを起動するには、次のコマンドを実行してください。
- docker run –name docker-nginx -p 80:80 nginx
このコマンドについて、以下に簡単な説明をします。
- run is the command to create a new container
- The –name flag is how you specify the name of the container. If left blank, a generated name like nostalgic_hopper will be assigned.
- -p specifies the port you are exposing in the format of -p local-machine-port:internal-container-port. In this case, you are mapping port :80 in the container to port :80 on the server.
- nginx is the name of the image on Docker Hub.
ウェブブラウザで、サーバーのIPアドレスを入力して、Nginxのデフォルトのランディングページを表示させます。
また、ターミナルでも、サーバーにリクエストを行うたびにNginxのログが更新されていることにも気づいてください。これは、コンテナをインタラクティブに実行しているためです。
ターミナルで、実行中のコンテナを停止するには、CTRL+Cを入力してください。
コンテナを閉じたため、もう着陸ページを見ることができません。以下のコマンドでコンテナの状態を確認できます。
- docker ps -a
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コンテナが終了していることが明らかになりました。
このコマンドを使用して、既存のdocker-nginxコンテナを削除してください。
- docker rm docker-nginx
次の段階では、コンテナを分離して独立して実行できるようにします。
ステップ2:バックグラウンドモードでの実行
このコマンドを使用して新しい独立した Nginx コンテナを作成してください。
- docker run –name docker-nginx -p 80:80 -d nginx
-dフラグを付けることで、このコンテナをバックグラウンドで実行しています。
出力はコンテナのIDです。
b91f3ce26553f3ffc8115d2a8a3ad2706142e73d56dc279095f673580986257
ドッカーのpsコマンドを実行すると、コンテナについての新しい情報が表示されます。
- docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b91f3ce26553 nginx “/docker-entrypoint.…” 56 seconds ago Up 54 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp docker-nginx
STATUS列には、Exited(0) X分前ではなく、今は約1分upしています。また、出力の一部としてポートマッピングも含まれていることにも注意してください。
再びデフォルトのNginxランディングページにアクセスするために、ブラウザにサーバーのIPアドレスを入力してください。今回は、Dockerにこのコンテナをデタッチモードで実行するよう指定するための-dフラグが設定されているため、バックグラウンドで実行されています。
現在、デタッチされたコンテナ内でNginxの実行インスタンスがあります。現時点では、コンテナはウェブサイトのファイルにアクセスできません。
次のコマンドを実行してコンテナを停止してください。
- docker stop docker-nginx
コンテナが停止したので、以下のコマンドを実行することでコンテナを削除できます。
- docker rm docker-nginx
今、コンテナーから独立した形でNginxを実行する方法がわかったので、次のステップではランディングページを作成し、Nginxを設定することにします。
ステップ3 – Nginxで提供するウェブページの作成
このステップでは、ウェブサイトのためにカスタムページを作成します。このセットアップにより、コンテナの外でホストされる持続的なウェブサイトのコンテンツを持つことができます。
ホームディレクトリ内にウェブサイトのコンテンツ用の新しいディレクトリを作成してください。
- mkdir -p ~/docker-nginx/html
このコマンドを実行してそれに移動してください。
- cd ~/docker-nginx/html
サーバーで使用するためのHTMLファイルを作成してください。以下の例ではnanoを使用していますが、お好きなテキストエディタを使用することもできます。
- nano index.html
以下のHTMLコンテンツを挿入してください。
<html>
<head>
<title>Docker nginx Tutorial</title>
</head>
<body>
<div class="container">
<h1>Hello Silicon Cloud</h1>
<p>This Nginx page is brought to you by Docker and Silicon Cloud</p>
</div>
</body>
</html>
もしもあなたがnanoテキストエディタを使用している場合は、「CTRL+X」、そして「Y」、そして「ENTER」を押してこのファイルを終了して保存してください。
今、デフォルトのNginxランディングページを置き換える索引ページがあります。
ステップ4:コンテナをローカルファイルシステムにリンクする
このステップでは、Nginxをコンテナにリンクして、ポート80を介して公開できるようにし、またサーバー上のウェブサイトコンテンツに接続します。
Dockerでは、仮想マシンのローカルファイルシステムからディレクトリをコンテナにリンクすることができます。新しいウェブページを提供したい場合は、コンテナにレンダリングするためのファイルを与える必要があります。
Dockerfileの一部として、またはその後にコンテナ内にファイルをコピーすることができますが、これらの方法ではウェブサイトはコンテナ内に静的な状態で残ります。Dockerのデータボリューム機能を使うことで、サーバーのファイルシステムとコンテナのファイルシステムの間にシンボリックリンクを作成することができます。これにより、既存のウェブページファイルを編集したり、新しいファイルをディレクトリに追加することができます。シンボリックリンクを使用すると、コンテナはこれらのファイルにアクセスできます。Dockerとボリュームに関してもっと詳しく知りたい場合は、データボリュームのドキュメントをご覧ください。
デフォルトでは、Nginxコンテナは/index.htmlを/usr/share/nginx/htmlで探します。新しいDockerコンテナでは、その場所にあるファイルへのアクセスを提供する必要があります。
これを行うために、次のコマンドを使用して、サーバーの~/docker-nginx/htmlフォルダーをコンテナー内の相対パス/usr/share/nginx/htmlにマッピングするために、-vフラグを使用します。
- docker run –name docker-nginx -p 80:80 -d -v ~/docker-nginx/html:/usr/share/nginx/html nginx
以下はコマンドの簡単な説明です。
- -v flag specifies that you’re linking a volume.
- To the left of the : is the location of your directory on your server, ~/docker-nginx/html.
- To the right of the : is the location that you are symbolically linking to your container /usr/share/nginx/html.
そのコマンドを実行した後、サーバーのIPアドレスをブラウザに入力して新しいランディングページを表示してください。
デフォルトのNginxの設定で満足している場合は、他に設定する必要はありません。
~ /docker-nginx/html/ディレクトリにさらにコンテンツをアップロードすることができます。それはライブウェブサイトに追加されます。
例えば、HTMLファイルを修正してブラウザをリフレッシュすれば、それが適切に更新されます。また、この方法でHTMLファイルを使って完全なサイトを構築することもできます。例えば、about.htmlページを追加した場合、コンテナとのやり取りなしにhttp://your_server_ip/about.htmlでアクセスできます。
ステップ5 — 独自のNginx設定ファイルを使用する(オプション)
Nginxの機能により多くの制御を持ちたい場合は、Dockerコンテナと一緒にカスタムのNginx設定ファイルを使用することができます。
最初に、トップレベルのプロジェクトディレクトリに戻っていることを確認してください。
- cd ~/docker-nginx
Dockerのコピーコマンドを使用して、Nginxの設定ディレクトリをプロジェクトフォルダにコピーしてください。
- docker cp docker-nginx:/etc/nginx/conf.d/default.conf default.conf
Nginxにはカスタムの.confファイルを使用するため、コンテナを再構築する必要があります。
最初にコンテナを停止させてください。
- docker stop docker-nginx
それを取り除いてください。
- docker rm docker-nginx
現在、デフォルトのNginx設定ファイルをローカルで編集して、新しいディレクトリを提供するか、またはproxy_passを使用してトラフィックを他のアプリケーションやコンテナに転送することができます。通常のNginxのインストールと同様に、Nginxの設定ファイルについては、弊社のNginx設定ファイルガイドをご覧いただけます。
設定ファイルを保存したら、Nginxコンテナを作成する時間です。適切なパスを持つ-vフラグを追加して、新しいNginxコンテナに自分の設定ファイルから実行するための適切なリンクを提供します。例えば:
- 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
このコマンドは、カスタムウェブサイトのページをコンテナに接続します。
設定ファイルを変更した後は、コンテナを再起動するためにdocker restartコマンドを使用する必要があります。これは、Nginxが設定ファイルを変更してもホットリロードしないためです。
- docker restart docker-nginx
これにより、コンテナが再起動され、関連するページに変更が反映されるはずです。
結論
現在、カスタムのウェブページを提供するNginxコンテナが実行中であり、コンテナ内からNginxを設定する方法を学びました。
もしコンテナの仕組みについてもっと学びたいと思ったら、私たちのコンテナ入門チュートリアルを rep=og:…再確認してください。
さらに、もしあなたが2つのDockerコンテナ間でデータを共有する方法を学びたいと興味があるのであれば、私たちの「Dockerコンテナ間でデータを共有する方法」チュートリアルをご覧ください。