O2 BLOG

インフラ/デプロイ カリキュラム

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.txttest-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
    • Exit
  • Proxmoxをインストール
    • Install Proxmox VE を押してインストール
    • 初期設定
      • Management Network Configuration
        • Hostname (例:pve04.local)
        • IP Address (例:192.168.1.100)
      • 設定一覧

第三章:仮想化とは

目標

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を外部公開

内容

ここまでやった君ならできる