Skip to content

Commit c114fbb

Browse files
committed
4日目
1 parent 635ea32 commit c114fbb

18 files changed

+801
-0
lines changed

docs/day04/04.md

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
---
2+
title: Linuxのコマンドに慣れる
3+
---
4+
5+
## ファイルシステム
6+
7+
Linuxのファイルシステムは、**ルートディレクトリ**と呼ばれる特殊なディレクトリを頂点とする木構造で表現され、この木構造の中の特定の要素を一意に表現するための表記を**パス**と呼びます。Linuxにおいてパスの区切り文字は`/`で、それが単体で利用された際はルートディレクトリを表します。例えば、ルートディレクトリの中の`home`ディレクトリの中の`utcode`という名前のディレクトリは`/home/utcode`という形で表現されます。
8+
9+
![ディレクトリの木構造](04/directory-tree.png)
10+
11+
また、PCは複数のユーザーで使用されることを前提に設計されているため、各ユーザーが使用できる個人的な領域として「ホームディレクトリ」が作成されます。Ubuntuをはじめとした標準的なLinuxでは、ホームディレクトリは「/home/ユーザー名」にあります。
12+
13+
Linuxには、最初から存在している**root**と呼ばれる特殊なユーザーがあります。`root`ユーザーは、コンピューター内の全てのファイルやディレクトリにアクセスできる権限を持っています。Ubuntuでは、rootユーザーのホームディレクトリは`/root`にあります。
14+
15+
## 相対パスと絶対パス
16+
17+
現在作業対象となっているディレクトリを**カレントディレクトリ**と呼びます。すべてのファイルやディレクトリは、ルートディレクトリを基準とした**絶対パス**で表される他、カレントディレクトリからの**相対パス**で表すことができます。例えば、カレントディレクトリが`/home/utcode`のとき、`/home/utcode/pictures/xxx.jpg``pictures/xxx.jpg`と表されます。
18+
19+
Ubuntuの場合は、標準状態でカレントディレクトリがターミナル上に表示される場合が多いです。以下の例の場合は`~/projects/sample`がカレントディレクトリです。
20+
21+
![カレントディレクトリの確認](04/check-current-directory.png)
22+
23+
:::tip
24+
ターミナル上で動作し、ユーザーの入力を受け取って実際に実行するソフトウェアを**シェル**と呼びます。コマンドを入力する場所(**プロンプト**)にカレントディレクトリを表示させるか否かはシェルの設定に依存しますが、Ubuntuのデフォルトである**bash**やmacOSのデフォルトである**zsh**では、標準で表示されるようになっています。
25+
:::
26+
27+
パスを表現するとき、様々な記号を用いることで、より複雑な関係を表現することができます。
28+
29+
| カレントディレクトリ | 目標のディレクトリ | 相対パス |
30+
| -------------------- | ---------------------- | --------------------------- |
31+
| /foo/bar | /foo/bar/baz | baz 又は ./baz |
32+
| /foo/bar | /foo/bar/baz/foobar | baz/foobar又は ./baz/foobar |
33+
| /foo/bar/baz | /foo/bar | .. 又は ./.. |
34+
| /foo/bar/baz | /foo | ../.. 又は ./../.. |
35+
| どこでも | /home/[ユーザー名]/foo | ~/foo |
36+
37+
カレントディレクトリは「.」、親ディレクトリは「..」、ホームディレクトリは「~」と表されることが分かります。
38+
39+
## コマンドの入力方法
40+
41+
コマンドはスペース区切りで入力し、最初がコマンド名、それ以降をそのコマンドの「引数」と呼びます。コマンド名や引数にスペース文字が含まれる場合は、値全体を`""`(ダブルクォーテーション)で囲むことでスペースが区切り文字として認識されることを防ぐことができます。以下にコマンドの一例を示します。
42+
43+
| コマンド名 | 機能 |
44+
| ------------ | ---------------------------- |
45+
| pwd | カレントディレクトリを表示 |
46+
| ls | ディレクトリの中身を一覧表示 |
47+
| cd [移動先] | カレントディレクトリを移動 |
48+
| mkdir [名前] | 新しいディレクトリを作成 |
49+
| touch [名前] | 新しいファイルを作成 |
50+
51+
## 課題
52+
53+
ホームディレクトリ内に以下のディレクトリ・ファイル構造を作成してください。
54+
55+
```
56+
[ホームディレクトリ]
57+
└── secret
58+
├── pictures
59+
│ └── xxx.txt
60+
└── videos
61+
├── yyy.txt
62+
└── zzz.txt
63+
```
27.5 KB
Loading

docs/day04/04/directory-tree.png

208 KB
Loading

docs/day04/05.md

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
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+
![docker-compose.ymlを含むプロジェクト](05/docker-project.png)
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+
![URL](05/url.png)
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+
![ポート番号](05/port.png)
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`にアクセスすることができたのです。

docs/day04/05/docker-project.png

113 KB
Loading

docs/day04/05/port.png

37.6 KB
Loading

docs/day04/05/url.png

18.5 KB
Loading

docs/day04/06.md

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
---
2+
title: PHPの動作
3+
---
4+
5+
PHPは、リクエストを受け取ったWebサーバーが、レスポンスを返す前に動作するプログラミング言語です。
6+
7+
## PHPが動作するWebサイト
8+
9+
```yml title="docker-compose.yml"
10+
version: '3'
11+
services:
12+
web:
13+
image: php:apache
14+
ports:
15+
- 8080:80
16+
volumes:
17+
- ./files:/var/www/html
18+
```
19+
20+
```php title="files/index.php"
21+
<!DOCTYPE html>
22+
<html lang="ja">
23+
<head>
24+
<meta charset="utf-8">
25+
<title>Hello World</title>
26+
</head>
27+
<body>
28+
<?php print('Hello PHP!'); ?>
29+
<script>document.write('Hello JS!');</script>
30+
</body>
31+
</html>
32+
```
33+
34+
プロジェクトディレクトリは以下のようになるはずです。
35+
36+
![PHPのDockerプロジェクト](06/docker-php-project.png)
37+
38+
詳細は後にするとして、とりあえず実行結果にアクセスすると、表示は大方予想通りになります。
39+
40+
![PHPを含むウェブサイトの表示](06/php-output.png)
41+
42+
しかしながら、ページ自体のソースを表示させてみるといかがでしょうか。
43+
44+
![PHPを含むウェブサイトのブラウザ側から見えるソース](06/php-source.png)
45+
46+
`Hello PHP!`の部分は出力内容しか残っていないことが分かります。これが、サーバーサイドで動作するプログラムの特徴です。プログラムは、実行結果がクライアントに送信される前に実行されるため、ブラウザからはサーバーサイドのプログラムのソースコードを表示させることができません。
47+
48+
## 動作原理
49+
50+
Dockerイメージの`php:apache`は、PHPが動作するよう設定されたApacheのイメージです。ポート番号は80、ドキュメントルートは`/var/www/html`に設定されています。
51+
52+
このApacheは、拡張子が`.php`のファイルに対してリクエストを受けたとき、PHPを起動させます。PHPは、ファイルの中から`<?php`から`?>`で囲まれた部分をPHPのプログラムとして実行します(囲まれていない部分は通常の出力と解釈されます)。この実行結果をApacheが受け取り、クライアント側に返却するようになっています。
121 KB
Loading

docs/day04/06/php-output.png

22.5 KB
Loading

0 commit comments

Comments
 (0)