|
| 1 | +--- |
| 2 | +title: Webサーバー |
| 3 | +--- |
| 4 | + |
| 5 | +## Dockerを用いてWebサーバーを構築する |
| 6 | + |
| 7 | +新しいディレクトリを作成し、VSCodeで開きましょう。`docker-compose.yml`という名前のファイルを作成し、以下の内容を記述します。 |
| 8 | + |
| 9 | +```yml |
| 10 | +version: '3' |
| 11 | +services: |
| 12 | + web: |
| 13 | + image: httpd |
| 14 | + ports: |
| 15 | + - 8080:80 |
| 16 | + volumes: |
| 17 | + - ./files:/usr/local/apache2/htdocs |
| 18 | +``` |
| 19 | +
|
| 20 | +続いて`files`ディレクトリを作成して、適当な`index.html`をその中に作成してください。 |
| 21 | + |
| 22 | + |
| 23 | + |
| 24 | +プロジェクトディレクトリで以下のコマンドを実行します。 |
| 25 | + |
| 26 | +``` |
| 27 | +$ docker-compose up |
| 28 | +``` |
| 29 | +
|
| 30 | +[http://localhost:8080/](http://localhost:8080/) にアクセスして、先ほど作成したHTMLファイルの内容が表示されることを確認してください。 |
| 31 | +
|
| 32 | +:::tip |
| 33 | +`docker-compose up`コマンドで起動したサーバーは、`Ctrl + C`のショートカットで終了させることができます。 |
| 34 | +::: |
| 35 | +
|
| 36 | +## URLの構造 |
| 37 | +
|
| 38 | +私たちがウェブサイトにアクセスする場合には、**URL**を用いるのが普通です。URLには様々な情報が含まれています。 |
| 39 | +
|
| 40 | + |
| 41 | +
|
| 42 | +### ② ドメイン |
| 43 | +クライアントがサーバーにリクエストを送信する際、まず最初に使用されるのがドメインです。ドメンは、インターネット上でサーバーの場所を区別するための文字列です。 |
| 44 | +
|
| 45 | +:::note |
| 46 | +②の場所に入る文字列を、正確には**FQDN**と呼びます。FQDNは、`www.utcode.net`のような文字列で、`www`を**ホスト名**、`utcode.net`をドメインと呼びます。 |
| 47 | +
|
| 48 | +しかしながら、FQDN、ホスト、ドメインが同じ意味で用いられる場合も多いので注意が必要です。 |
| 49 | +::: |
| 50 | +
|
| 51 | +:::tip |
| 52 | +多くの端末では、`localhost`とすることで自分自身にアクセスすることができます。 |
| 53 | +::: |
| 54 | +
|
| 55 | +### ③ ポート |
| 56 | +
|
| 57 | +クライアントからリクエストを受けるコンピューターをサーバーと呼びますが、そのリクエストを実際に受け取って処理を行うソフトウェアもまた、サーバーと呼びます。 |
| 58 | +
|
| 59 | +このため、一台の物理的なサーバーで稼働しているソフトウェアとしてのサーバーが一種類とは限りません。どのソフトウェアの通信なのかを区別するため、外部からの接続を待ち受けするソフトウェアは、`0 ~ 2^16 – 1 (65535)`の整数で表される**ポート**番号を指定する必要があります。 |
| 60 | +
|
| 61 | + |
| 62 | +
|
| 63 | +サーバーの種類によって使われるポート番号は大体決まっています。例えば、Webサーバーの場合は、80番または443番が使用されるのが普通です。後述するプロトコルがHTTPの場合は80番、HTTPSの場合は443番のとき、URLにおけるポート番号は省略可能になります。一般的なURLにポート番号が存在していないのはこのためです。 |
| 64 | +
|
| 65 | +### ① プロトコル |
| 66 | +
|
| 67 | +複数のコンピューターが正しく通信を行うためには、事前に通信の方法を定めておく必要があります。通信を行うための取り決めを、**プロトコル**と呼びます。ウェブサイトを提供するためのプロトコルは**HTTP**または**HTTPS**です。 |
| 68 | +
|
| 69 | +### ④ パス |
| 70 | +
|
| 71 | +通信先のサーバーにおける、リクエストするリソースの場所を表す文字列です。具体的な解釈の方法はプロトコルで決まっているわけではなく、サーバーソフトウェアの実装次第です。 |
| 72 | +
|
| 73 | +## DockerとDocker Composeの使い方 |
| 74 | +
|
| 75 | +以前インストールしたDockerは、**仮想化**のためのソフトウェアです。サーバーは通常物理的な筐体ですが、仮想化を用いることで、あるコンピューターの中にあたかも別のコンピューターが存在するかのようにふるまわせることができます。 |
| 76 | +
|
| 77 | +**Docker Compose**は、複雑なコマンド体系を持つDockerを扱いやすくするためのソフトウェアです。`docker-compose.yml`という名前のファイルにサーバーの構成を記述し、`docker-compose up`とするだけで、様々なサーバーを起動させることができます。 |
| 78 | +
|
| 79 | +先ほどの`docker-compose.yml`を見直してみましょう。このファイルは、**YAML**と呼ばれる可読性の高いフォーマットで記述します。 |
| 80 | +
|
| 81 | +```yml |
| 82 | +version: '3' # docker-compose.ymlの仕様のバージョン |
| 83 | +services: |
| 84 | + web: |
| 85 | + image: httpd |
| 86 | + ports: |
| 87 | + - 8080:80 |
| 88 | + volumes: |
| 89 | + - ./files:/usr/local/apache2/htdocs |
| 90 | +``` |
| 91 | + |
| 92 | +:::tip |
| 93 | +VSCodeの拡張機能 [Docker](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker) をインストールしておくと便利です。 |
| 94 | +::: |
| 95 | + |
| 96 | +YAMLは、JavaScriptオブジェクトに変換することが可能な形式です。このファイルの内容をJavaScriptの式で記述すると、下記のような形式になります。 |
| 97 | + |
| 98 | +```js |
| 99 | +({ |
| 100 | + version: '3', |
| 101 | + services: { |
| 102 | + web: { |
| 103 | + image: 'httpd', |
| 104 | + ports: [ |
| 105 | + '8080:80' |
| 106 | + ], |
| 107 | + volumes: [ |
| 108 | + './files:/usr/local/apache2/htdocs' |
| 109 | + ] |
| 110 | + } |
| 111 | + } |
| 112 | +}) |
| 113 | +``` |
| 114 | + |
| 115 | +`services`の各プロパティが、一台のサーバーを表します。Docker Composeは、このプロパティ一つごとに、仮想的なLinux端末(**コンテナ**)ひとつを生成します。上記の例の場合は`web`ひとつだけです。 |
| 116 | + |
| 117 | +`service.サービス名.image`には、コンテナのベースとなるイメージ名を指定します。このイメージは、通常[Docker Hub](https://hub.docker.com/)上にアップロードされているもので、公式・非公式ともにさまざまな種類が用意されています。 |
| 118 | + |
| 119 | +`service.サービス名.ports`は、`ローカル側ポート:コンテナ側ポート`形式の文字列配列を指定します。この指定をすることで、`localhost`の指定ポートへの通信を、コンテナ側の指定ポートへ転送することができます。 |
| 120 | + |
| 121 | +`service.サービス名.volumes`は、`ローカル側パス:コンテナ側パス`形式の文字列配列で、ローカル側のファイルシステムを、コンテナ側のファイルシステムと同期させることができるようになります。 |
| 122 | + |
| 123 | +## Webサーバー |
| 124 | + |
| 125 | +`httpd`イメージは、Dockerが公式に提供している、**Apache**を含むイメージです。Apacheは、世界で一般的に使用されるWebサーバーの一種です。 |
| 126 | + |
| 127 | +Webサーバーは通常、**ドキュメントルート**と呼ばれるディレクトリを設定し、そのディレクトリ内にあるファイルを公開します。URLに含まれるパスは、そのドキュメントルートからの相対パスです。 |
| 128 | + |
| 129 | +Dockerの`httpd`イメージでは、ドキュメントルートが`/usr/local/apache2/htdocs`、ポート番号が80に設定されています。これが、Docker Composeの設定によりそれぞれ`./files`、8080番ポートに転送されているため、`http://localhost:8080/`のURLで`./files/index.html`にアクセスすることができたのです。 |
0 commit comments