Dockerのプログラミングメモ第3回です。何回かに分けてメモを投稿していきます。
なお、この記事はプログラミングメモですのでどんどん追記していきます。
第3回はWEBサーバを構築/ Nginxのインストール/ネットワークの概要を確認していきます。
Dockerに入門したのに、すぐにDockerを学ばずWEBサーバを構築する理由は、Dockerを理解する上でLinuxの基礎とNetworkの基礎の把握が必要だからです。
【参考記事】
- 【Udemy】もう怖くないLinuxコマンド。手を動かしながらLinuxコマンドラインを5日間で身に付けよう
- 【Udemy】【3週間で学ぶ】Amazon Linux Bash シェルスクリプト実践講座!!初心者でも1からマスターする
- 【Udemy】Linux とネットワークの基礎から学ぶ Docker 入門
【関連記事】
- 【第1回】Dockerインストール→Linux(CentOS7)を起動
- 【第2回】Linuxの概要/GCPでUbuntuをインストール
- 【第3回】WEBサーバを構築(Nginx)/ネットワークの概要
- 【第4回】WEBアプリ構築/Dockerでの環境構築準備
- 【第5回】Dockerの概要
- 【第6回】Dockerのインストール・作成・起動・停止
- 【第7回】PHPの開発環境を構築(PHPとApacheのみ)
- 【第8回】PHPの開発環境を構築(docker-composeで複数コンテナを一括で起動)
- 【第9回】PHPの環境構築_その2_(環境構築自動化)
WEBサーバーを構築してみる
LinuxにNginxをインストールしてWEBサーバーを構築する
Nginxのインストール
手順
> GCPでGCEを起動しSSH接続する
> 以下のコマンドを実施
$ sudo apt updateを実施
$ sudo apt install nginx
> GCEの外部IPをクリック
Nginxのトップページが表示されない場合の確認ポイント
- ’sudo apt install nginx’が成功したか
- GCPのファイアーウォールの設定は正しいか
- httpsではなくhttpになっているか
- ブラウザのシークレットウィンドウだと表示されるか
自作のHTMLをブラウザで表示してみる
# 現在の設定
$ ls /var/www/html/
index.nginx-debian.html
$ cd /var/www/html/
$ cat index.nginx-debian.html
$ pwd
/var/www/html
$ sudo vi hello.html
> ブラウザでIPアドレスの後で/hello.htmlとつけてブラウジング
プロセスの基本
# プロセス 実行中のプログラム
# 以下のコマンドで確認可能
$ pstree -p
systemd(1)─┬─... # systemdのプロセス
:
├─nginx(26867)─┬─nginx(26872) # Nginxのプロセス
│ └─nginx(26873)
:
├─sshd(1606)───sshd(28275)───sshd(28385)───bash(28386)───pstree(28602) # SSHのプロセス
:
Linuxの起動の流れとプロセス管理
- カーネルによるプロセス管理
- CPUは本来、コアが一つなら一つだけプログラムが動かせる
- OSの中核であるカーネルがCPUの時間を順番にプロセスに割り当てて複数プロセスが同時に動いているように振る舞う
Linuxの起動の流れとプロセス管理
- 電源ON → CPUがマザーボードのROMにある「BIOS」を実行する
- BIOSがストレージからメモリに「ブートローダ」を読み込んで実行する
- ブートローダがストレージからメモリに「カーネル」を読み込んで実行する
- カーネルが「init」プロセスを起動する
initプロセスとは
- PID1で動く親プロセス
- 最近はsystemdというプログラムがよく使われている
Nginxを手動で実行してみる
# Nginxのステータスを確認
# activeになっている
$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2023-02-17 23:57:04 UTC; 6h ago
:
:
# stop nginx
# inactiveになった
$ sudo systemctl stop nginx
$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Sat 2023-02-18 06:59:16 UTC; 4s ago
:
:
—
# 再度起動
$ ls -l /usr/sbin/nginx
-rwxr-xr-x 1 root root 1149096 Nov 10 06:38 /usr/sbin/nginx
$ sudo /usr/sbin/nginx -g 'daemon off;'
# プロンプトは返らない
# Nginxはアクティブになる
# システムDで動かした方がいい
# 再度sytemctlで Nginxを起動する
# activeになった
$ sudo systemctl start nginx
$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2023-02-18 07:10:46 UTC; 6s ago
:
:
ネットワークの仕組みの概要
IPアドレス
- ネットワーク上の住所
- 通信先のコンピュータはIPアドレスで決まる
- 127.0.0.1は自分自身を指すIPアドレス/別名:localhost
ポート番号
- マンションの部屋番号に例えられる
- 一つのコンピュータで複数のプログラムが通信を持っている
- ポート番号によってどのプログラムが接続するのか伝える
メッセージ
- WEBサーバー(Nginxなど)の場合
- HTTPリクエスト、HTTPレスポンスという形式でメッセージをやりとりする
- クライアントとサーバーが適切にやりとりするために通信方式ごとにメッセージの形式が決まっている
curlとtelnetでWebサーバと通信してみる
> curlコマンドで確認
$ curl -v localhost
* Rebuilt URL to: localhost/
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> Host: localhost
> User-Agent: curl/7.58.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/1.14.0 (Ubuntu)
< Date: Sat, 18 Feb 2023 09:09:35 GMT
< Content-Type: text/html
< Content-Length: 612
< Last-Modified: Fri, 17 Feb 2023 23:57:03 GMT
< Connection: keep-alive
< ETag: "63f0144f-264"
< Accept-Ranges: bytes
<
:
:
:
* Connection #0 to host localhost left intact
> telnetでも手動で確認可能
$ telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1
Host: localhost
User-Agent: curl/7.58.0
Accept: */*
:
:
# 同様にレスポンスがあることを確認
# Ctrl + C で抜ける
TCP/IP モデル
メッセージの形式/やり取りの手順
アプリケーション層 | HTTP SSH FTP SMTP TCP UDP |
トランスポート層 | 接続の確立、パケットの分割/組立 TCP UDP |
インターネット層 | IPアドレスで指定された先にパケットを配送 IP ICMP |
ネットワークインターフェース層 | ハードウェアが通信を実現する イーサネット 有線LAN IEEE802.11 無線LAN |