# インフラ/デプロイ カリキュラム ###### tags: `curriculum` `インフラ` [TOC] ## 目標 - Linuxの基本を知り,ProxmoxでCTを作成できる - Docker・Docker Composeの挙動を理解し,本番環境をつくる - Networkを理解し,独自ドメインでアクセス可能にする ## 成果物 ProxmoxのCT上に`<name>.nutmeg.cloud`でアクセスできるNginxサーバーをDocker・Docker Composeで立ち上げる ## 構成 ### 第一章:Linuxの基本 #### 目標 Linuxの基本を知る #### 内容 ##### Linuxとは Linuxとは、WindowsやMacと同じOS(オペレーティングシステム)の一種です。OSとはコンピューターを動かすための基本的なソフトウェアです。 LinuxはUNIXというOSに基づいて作られており,同じくUNIXベースのMacOSはコマンドやファイルシステムに似ている部分が多くあります。 Linuxは他のWindowsやMacとは異なり,オープンソースで誰でも自由に利用・改良できます。そのため,様々な種類(ディストリビューション)があります。有名なものに,Debian,Ubuntu,CentOSなどがあります。 ##### Ubuntuの特徴 UbuntuはDebianをベースに作られたLinuxディストリビューションです。 UbuntuはDebianと同じパッケージ管理システム`apt`を採用しているため,Debianパッケージ(アプリ)をそのまま利用することが可能です。 以下はパッケージ管理システム`apt`の使用方法です ```bash # ダウンロードできるパッケージリストを更新 sudo apt update # インストールされたパッケージをすべて更新 sudo apt upgrade # dockerをインストール sudo apt install docker ``` また,Linux brewをインストールすることでMac同様に`brew`コマンドを使用することが可能です。 ##### Linux・UNIXのコマンド UNIXコマンドとは,UNIXシステムや,その派生のLinux・MacOSなどで使われるコマンドです。 UNIXコマンドは,シェル(bash,zsh,fish,etc...)と呼ばれるプログラムを通して,キーボードから入力された文字列を解釈し,システムに対する命令として実行します。 | コマンドの種類 | 説明 | 例 | | :--- | :--- | :--- | | ファイル操作 | ファイルやディレクトリを作成、削除、移動、コピー、検索などするコマンド | touch, rm, mv, cp, find | | テキスト処理 | テキストファイルの内容を表示、編集、結合、分割、置換などするコマンド | cat, less, head, tail, sed | | システム管理 | システムの状態や設定を確認、変更するコマンド | ps, top, kill, date, uname | | ネットワーク | ネットワークの接続や通信を行うコマンド | ping, ssh, scp, curl, wget | UNIXコマンドは,単独で使うこともできますが,パイプやリダイレクトといった機能を使って,複数のコマンドを組み合わせることで,より高度な処理を行うこともできます。 ``` cat .bashrc | grep aaa ``` ##### Linux・UNIXのディレクトリ構成 Unixのディレクトリ構成は,ファイルシステム階層標準(FHS)という規格に基づいて決められています。 FHSでは,ディレクトリの役割や内容に応じて,ルートディレクトリ(/)の下にさまざまなサブディレクトリを配置しています。 * /binには基本的なコマンドの実行ファイル * /etcにはシステム全体の設定ファイル * /homeには一般ユーザーのホームディレクトリ * /devにはデバイスファイル が格納されています。 #### 宿題 - touchコマンドで`touch-test.txt`というファイルを作成 - `ls`コマンドでファイルがあることを確認 - `nano`コマンドで中身を編集 - `cat`コマンドで中身を確認 - `mkdir`コマンドで`test-dir`を作成 - `mv`コマンドで`touch-test.txt`を`test-dir`に移動 - `touch-test.txt`がどこにあるか`find`コマンドで探してみる - 次回のために,Proxmoxのインストーラー作成 ### 第二章:Proxmoxの準備 #### 目標 Proxmoxを渡したPCに構築し,操作することができる。 #### 内容 ##### Proxmoxインストーラーの作成 - ハイパーバイザーOSのダウンロード - [Proxmox VE 7.1](https://www.proxmox.com/en/downloads/item/proxmox-ve-7-1-iso-installer) に移動 - ボタンを押しダウンロード(数時間かかる場合もある) - インストールメディア作成ツールのダウンロード - [Rufus](https://forest.watch.impress.co.jp/library/software/rufus) に移動 - ダウンロード - インストーラ作成 - 設定 - デバイス:インストーラーにしたいUSBを選択 - ブートの種類:ファイルから選ぶ - 右側の ダウンロード/選択:選択にしてクリックしProxmoxを指定 - メディア作成 - スタートを押下し数分間待つ ##### インストール - BIOS起動 - Windows PCを起動 - Shift+再起動 - オプションが表示されるのでトラブルシューティングを選択 - 詳細オプションの中の,UEFI ファームウェアの設定を選択 - proxmoxのUSBを刺して再起動してBIOSを開く - BIOSの設定(PCによって変わる) - Startupタブ - USBのインストーラーを優先的に起動するため,Primary Boot Sequence を USBが一番になるように設定 - Advancedタブ - CPU Setup - Intel(r) Virtualization Technology を Enable - VT-d を Enable - Exit - Proxmoxをインストール - Install Proxmox VE を押してインストール - 初期設定 - Management Network Configuration - Hostname (例:pve04.local) - IP Address (例:192.168.1.100) - 設定一覧 ![](https://i.imgur.com/9uE98Ye.jpg) ### 第三章:仮想化とは #### 目標 Linuxの仮三想化について理解しProxmoxでVMを作成する #### 内容 ##### 仮想化とは 仮想化とは,物理的なコンピューターのリソースを複数の仮想的なコンピューターに分割して利用する技術です。Linuxにおいては、仮想化には主に以下の3種類の方法があります。 - ホスト型 ホスト型はOS上に土台となる仮想化ソフトウェアをインストールし、仮想化ソフトウェアで仮想マシンを稼働させる方法です。すでに動作しているコンピュータの中に仮想マシンが作れるためホストOSと仮想化ソフトウェアを動作させるのでハードウェアにかかるリソースは余計に消費をしてしまいます(オーバーヘッド)。従って、本番環境には適さず,検証環境にはよく使われます。これは,仮想化環境の構築がしやすいためです。ホスト型の仮想化ソフトウェアにはOracle VM Virtualbox,bluestacksなどがあります。 - ハイパーバイザー型 ハイパーバイザーと呼ばれるソフトウェアを利用して、物理的なコンピューター上に複数の仮想マシンを作成します。仮想マシンはハイパーバイザーを介してリソースを共有しますが、それぞれ独立したオペレーティングシステムを実行できます。例えば、Microsoft Hyper-V,KVMやXenなどがハイパーバイザーです。WSL2はHyper-Vを使用し実現されています。ProxmoxもKVMを内部的に使用しているため,GUIでVMを作成することができます。 - コンテナ型 ハイパーバイザーを利用せずに、カーネルレベルでリソースの隔離や制御を行う技術です。物理的なコンピューター上に複数のコンテナと呼ばれる仮想的な環境を作成します。コンテナは同じカーネルを共有しますが、それぞれ独立したファイルシステムやプロセス空間を持ちます。例えば、LXCやDockerなどがコンテナ型仮想化の技術です。 ##### Proxmoxを使用したVM作成 ###### VMテンプレートの作成 - pveのコンソールにてVMイメージのテンプレートを作成 ```bash wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img qm create 999 --memory 1024 --net0 virtio,bridge=vmbr0 qm importdisk 999 focal-server-cloudimg-amd64.img local-lvm qm set 999 --name Ubuntu-20.04 qm set 999 --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-999-disk-0 ``` - Cloud-initの設定 Cloud-initドライブを定義してやることで後の設定を簡単にする ```bash qm set 999 --ide2 local-lvm:cloudinit qm set 999 --boot c --bootdisk scsi0 qm set 999 --serial0 socket --vga serial0 qm template 999 ``` ###### VMの作成 - テンプレートのクローン 作成したテンプレートを右クリックしてクローン ![](https://i.imgur.com/PpwBatj.png) ID,名前(サービス名),モードを決めてクローン ![](https://i.imgur.com/LmoMMyw.png) * 完全クローン:ストレージをそのままコピー * リンククローン:差分だけ保持 ###### Cloud-initの設定 VMを起動する前に設定することで起動直後の初期設定をしないですむ ![](https://i.imgur.com/M3altUz.png) - ユーザー:nutmeg - パスワード:XXXXXXX - IP構成:192.168.1.<サービスID>/24 - デフォルトゲートウェイ:192.168.1.1 ###### 起動 起動と同時にCloud-initの処理がまわる ### 第四章:コンテナについて コンテナについて学習しProxmoxでCT作成 #### 内容 ##### コンテナとは Linuxカーネルを実行しているホスト上で、複数の隔離されたLinuxシステム(コンテナ)を走らせる仮想化技術のことです。コンテナは仮想マシンを作り出すのではなく、OSが利用するリソースを隔離することで独立した環境を提供します。これは,ハードウェアをシミュレートする必要がないため、仮想化によるオーバーヘッドはほぼ存在しません。また、コンテナは起動や停止が高速に実行できます。 Linuxでコンテナ型仮想化を実現するソフトウェアとしては、LXC(Linux Containers)やDockerなどがあります。今回はProxmoxでLXCを使用したコンテナを作成します。 LXCはLinuxカーネル2.6.24より搭載されたcgroupsと呼ばれるリソース管理機構を用いて実装されており、プロセスに対しchrootのように特定のディレクトリをルートディレクトリと認識させ、かつcgroupsの名前空間機能を使って各種リソースを隔離することで、仮想的な環境の構築を実現しています。 DockerはLXCをベースに開発されたもので、コンテナの作成や管理を簡単に行えるようにしたものです。Dockerではコンテナのイメージを作成し、それを元にコンテナを起動します。こちらは次章で学習します。 ###### CTテンプレートの作成 - pveのコンソールにてVMイメージのテンプレートを作成 localボリュームのタブからCTテンプレートを選択し,TempletesボタンからUbuntuをダウンロードする。 ```bash pct create 1000 local:vztmpl/ubuntu-20.04-standard_20.04-1_amd64.tar.gz -storage local-lvm -unprivileged 1 --features nesting=1 pct set 1000 -net0 name=eth0,bridge=vmbr0,ip=dhcp pct set 1000 -hostname ubuntu-20.04 pct start 1000 pct enter 1000 # --lxcコンテナ内--- adduser nutmeg gpasswd -a nutmeg sudo apt update apt upgrade apt install mysql-client curl wget docker docker-compose exit # -------- pct stop 1000 pct template 1000 ``` ###### CTの作成 - テンプレートのクローン 作成したテンプレートを右クリックしてクローン ![](https://i.imgur.com/PpwBatj.png) ID,名前(サービス名),モードを決めてクローン ![](https://i.imgur.com/LmoMMyw.png) * 完全クローン:ストレージをそのままコピー * リンククローン:差分だけ保持 ###### CTの設定 CTを起動する前に設定することで起動直後の初期設定をしないですむ ![](https://i.imgur.com/M3altUz.png) - ユーザー:nutmeg - パスワード:XXXXXXX - IP構成:192.168.1.<サービスID>/24 - デフォルトゲートウェイ:192.168.1.1 ###### 起動 VMに比べてくそほど早い。 NUTMEGでは現状このCTを本番環境とし,ここにデプロイを行います。 ### 第五章:Docker・Docker Composeとは Docker・Docker Composeを知り,Nginxコンテナを立ち上げる。 ##### Dockerとは Dockerとは、アプリケーションをコンテナという単位で管理する仕組みです。コンテナは、アプリケーションの実行に必要な環境や依存関係を一つにまとめたもので、どのようなOSやハードウェアでも同じように動作します。これにより、開発やテスト、デプロイなどの作業を効率的に行うことができます。 ##### Docker Composeとは Docker Composeとは、複数のDockerコンテナを一括で管理するツールです。Docker Composeでは、YAMLファイルにコンテナの設定を記述し、コマンド一つで起動や停止などの操作ができます。これにより、複雑なアプリケーションの構成や連携を簡単に実現することができます。 ##### NginxをDocker Composeで立ち上げ - WSL上に作業フォルダ`nginx-docker`をコマンドで作成 - コマンドで`docker-compose.yml`を作成 - お気に入りのエディタで`docker-compose.yml`を編集 `docker-compsoe.yml` ```yaml! version: '3' services: web: image: 'nginx:1.17' container_name: 'docker-nginx-web' ports: ['8080:80'] ``` - `web`がサービス名 - `image`では公開されてあるdockerイメージを指定 - `container_name`でコンテナに命名 次に以下コマンドでコンテナを立ち上げる。 ```bash! docker compose up ``` コマンドを使用したディレクトリにある`docker-compose.yml`を参照し,Dockerコンテナを起動してくれる。 `localhost:8080`に移動するとnginxのページが表示されるはず。 - 同階層に`nginx.conf`を作成 - 同階層に`html`ディレクトリを作成し,`index.html`を作成 - `docker-compose.yml`を編集 `nginx.conf` ```nginx! server { listen 80; location / { root /var/www/vhosts/html; index index.html index.htm; try_files $uri /index.html; } } ``` `docker-compsoe.yml` ```yaml! version: '3' services: web: image: 'nginx:1.17' container_name: 'docker-nginx-web' # 以下を追記・変更 volumes: - './nginx.conf:/etc/nginx/conf.d/default.conf' - './html:/var/www/vhosts/html' ports: ['8080:80'] ``` - `volumes`でホストのファイルをDockerに同期する - `ports`でホストとDockerのポートを同期する 以上で,`index.html`を編集すると`localhost:8080`のページが変わるはず。 ### 第六章:ネットワークの基礎 ネットワークの基本を理解する #### 内容 - ドメイン:インターネット上で識別される名前のことで、例えば「tech-camp.in」や「google.com」などがあります。ドメインは、IPアドレスと対応づけられています。 - DNS:Domain Name Systemの略で、ドメインとIPアドレスの対応関係を管理するシステムのことです。DNSによって、人間が覚えやすいドメインでインターネット上のサイトにアクセスできます。 - IPアドレス:Internet Protocol Addressの略で、インターネット上で通信する際に割り当てられる番号のことです。IPアドレスは、グローバルIPアドレスとプライベートIPアドレスに分けられます。 - グローバルIPアドレス:世界中で一意に決まるIPアドレスで、インターネットに接続する際に必要です。プロバイダから割り振られます。 - プライベートIPアドレス:特定のネットワーク内で使用されるIPアドレスで、ルーターなどから割り振られます。同じプライベートIPアドレスでも、異なるネットワークでは別々に使用できます。 - ポート:コンピューター内で通信する際に使用される番号のことです。ポート番号は、通信するアプリケーションやサービスによって決まります。例えば、Webサイトにアクセスする際は80番ポートを使用します。 - リバースプロキシ:一般的なプロキシサーバーは、クライアントからサーバーへの通信を仲介するものですが、リバースプロキシはその逆で、サーバーからクライアントへの通信を仲介します。リバースプロキシは、負荷分散やセキュリティ強化などの目的で使用されます。 - VPN:Virtual Private Networkの略で、インターネット上に仮想的な専用回線を作る技術のことです。VPNを使用すると、遠隔地からでも安全に特定のネットワークに接続できます。 課題 - 上記の単語を使ってどうやってgoogle.comにアクセスできるのか説明してみよう - 独自ドメインでウェブサイトを公開するにはどんな設定が必要か考えてみよう - グローバルIPがないときに外部公開は可能か考えてみよう - NUTMEGクラウドはどうやって動いているか一通り説明してみよう ### 第七章:Cloudflaredの使い方 CloudflareでNginxを独自ドメインで外部に公開する #### 内容 ##### docker-compose.ymlを編集 cloudflareのサービスを追加し,以下のように設定する。 - cloudflareコンテナを使用 - `./cloudflare`を`/home/nonroot/.cloudflared`にマウント - 起動時にtunnelを起動 `docker-compose.stage.yaml` ```yaml! version: '3' services: web: ... cloudflare: image: 'cloudflare/cloudflared:latest' container_name: 'docker-nginx-cloudflare' volumes: ['./cloudflare:/home/nonroot/.cloudflared'] command: tunnel run ``` ここで`./cloudflare`ディレクトリをDockerユーザーでも書き込み可能に指定しておく ``` chmod o+rwx ./cloudflare ``` ##### Cloudflare設定 ###### NUTFESのアカウントでログイン cloudflare.com に移動しログイン ###### コンテナ内のcloudflareを認証 以下のコマンドを入力するとログインURLが表示されるのでログイン。 ```bash! docker compose run --rm cloudflare tunnel login # ↓ 出力 Please open the following URL and log in with your Cloudflare account: https://dash.cloudflare.com/argotunnel... Leave cloudflared running to download the cert automatically. ... ``` URLの先に飛ぶと以下の画面に遷移し,使用したいドメインでAuthorize ![](https://i.imgur.com/rOynYak.png) ここで,`./cloudflare`にTunnelの使用に必要な`cert.pem`を得る。 ###### Tunnel作成 トンネルの名前を指定して作成 ※ すでに作成している名前だとエラーが起きる group-managerだと,`gm2-stg`という名前に設定した。 今後も`<product-name>-stg`とかにすると後でわかりやすいかも。 ```bash! docker compose run --rm cloudflare tunnel create <tunnel-name> ``` ここで、`./cloudflare`に`<tunnel-id>.json`を得る ###### 設定ファイル作成 `cloudflare/config.yaml` ```yaml! tunnel: <tunnel-id> credentials-file: /home/nonroot/.cloudflared/<tunnel-id>.json protocol: http2 # eduroam 対策 ingress: - hostname: <name>.nutmeg.cloud service: http://web:8080 - service: http_status:404 ``` ###### コンソールからDNSの設定 configで設定したhostmameすべてに対して以下のコマンドを実行 ```bash! docker compose run --rm cloudflare tunnel route dns <tunnel-name> <hostname(example.hoge.net)> ``` ##### 起動 以上の設定を済ませてしまえば今後は以下コマンドで起動するだけ。 ```bash! docker compose -f docker-compose.stage.yml up ``` 以下のログが確認出来たら成功 ```bash! INF Connection <tunnel-id> registered with protocol: http2 ``` ### 第八章:デプロイしてみよう ProxmoxのCTで独自ドメインでNginxを外部公開 #### 内容 ここまでやった君ならできる