インフラ/デプロイ カリキュラム
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
の使用方法です
# ダウンロードできるパッケージリストを更新 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 に移動
- ボタンを押しダウンロード(数時間かかる場合もある)
- インストールメディア作成ツールのダウンロード
- 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
- CPU Setup
- Exit
- Startupタブ
- Proxmoxをインストール
- Install Proxmox VE を押してインストール
- 初期設定
- Management Network Configuration
- Hostname (例:pve04.local)
- IP Address (例:192.168.1.100)
- 設定一覧
- Management Network Configuration
第三章:仮想化とは
目標
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イメージのテンプレートを作成
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ドライブを定義してやることで後の設定を簡単にする
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の作成
- テンプレートのクローン
作成したテンプレートを右クリックしてクローン
ID,名前(サービス名),モードを決めてクローン
- 完全クローン:ストレージをそのままコピー
- リンククローン:差分だけ保持
Cloud-initの設定
VMを起動する前に設定することで起動直後の初期設定をしないですむ
- ユーザー: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をダウンロードする。
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の作成
- テンプレートのクローン 作成したテンプレートを右クリックしてクローン
ID,名前(サービス名),モードを決めてクローン
- 完全クローン:ストレージをそのままコピー
- リンククローン:差分だけ保持
CTの設定
CTを起動する前に設定することで起動直後の初期設定をしないですむ
- ユーザー: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
version: '3' services: web: image: 'nginx:1.17' container_name: 'docker-nginx-web' ports: ['8080:80']
web
がサービス名image
では公開されてあるdockerイメージを指定container_name
でコンテナに命名
次に以下コマンドでコンテナを立ち上げる。
docker compose up
コマンドを使用したディレクトリにあるdocker-compose.yml
を参照し,Dockerコンテナを起動してくれる。
localhost:8080
に移動するとnginxのページが表示されるはず。
- 同階層に
nginx.conf
を作成 - 同階層に
html
ディレクトリを作成し,index.html
を作成 docker-compose.yml
を編集
nginx.conf
server { listen 80; location / { root /var/www/vhosts/html; index index.html index.htm; try_files $uri /index.html; } }
docker-compsoe.yml
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
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が表示されるのでログイン。
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
ここで,./cloudflare
にTunnelの使用に必要なcert.pem
を得る。
Tunnel作成
トンネルの名前を指定して作成 ※ すでに作成している名前だとエラーが起きる
group-managerだと,gm2-stg
という名前に設定した。
今後も<product-name>-stg
とかにすると後でわかりやすいかも。
docker compose run --rm cloudflare tunnel create <tunnel-name>
ここで、./cloudflare
に<tunnel-id>.json
を得る
設定ファイル作成
cloudflare/config.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すべてに対して以下のコマンドを実行
docker compose run --rm cloudflare tunnel route dns <tunnel-name> <hostname(example.hoge.net)>
起動
以上の設定を済ませてしまえば今後は以下コマンドで起動するだけ。
docker compose -f docker-compose.stage.yml up
以下のログが確認出来たら成功
INF Connection <tunnel-id> registered with protocol: http2
第八章:デプロイしてみよう
ProxmoxのCTで独自ドメインでNginxを外部公開
内容
ここまでやった君ならできる