序章

Linuxコンテナは、システムの他の部分から分離された一連のプロセスです。 エンドユーザーにとって、Linuxコンテナは仮想マシンとして機能しますが、はるかに軽量です。 追加のLinuxカーネルを実行するオーバーヘッドはなく、コンテナーはCPUハードウェア仮想化のサポートを必要としません。 これは、同じサーバー上に仮想マシンよりも多くのコンテナーを作成できることを意味します。

顧客のために複数のWebサイトを実行する必要があるサーバーがあると想像してください。 一方では、各Webサイトは、ApacheまたはNginxWebサーバーの同じインスタンスの仮想ホスト/サーバーブロックである可能性があります。 一方、仮想マシンを使用する場合は、Webサイトごとに個別のネストされた仮想マシンを作成します。 Linuxコンテナーは、仮想ホストと仮想マシンの間のどこかにあります。

LXD を使用すると、これらのコンテナーを作成および管理できます。 LXDは、コンテナーのライフサイクル全体を管理するハイパーバイザーサービスを提供します。 このチュートリアルでは、LXDを構成し、それを使用してコンテナーでNginxを実行します。 次に、インターネットからコンテナにトラフィックをルーティングして、サンプルのWebページにアクセスできるようにします。

前提条件

このチュートリアルを完了するには、次のものが必要です。

  • Ubuntu20.04を実行しているサーバー。 ルート以外のsudoユーザーとファイアウォールを含むサーバーをセットアップするには、 Ubuntu 20.04を実行するDigitalOceanDropletを作成してから、初期サーバーセットアップガイドに従います。 サーバーのパブリックIPアドレスをメモします。 後でそれを次のように参照します your_server_ip.

  • 少なくとも5GBのブロックストレージ。 これを設定するには、DigitalOceanのBlockStorage VolumesQuickstartに従うことができます。 ブロックストレージの構成で、[ Manually Format & Mount LXDが必要に応じて準備できるようにするため。 これを使用して、コンテナに関連するすべてのデータを保存します。

注: Ubuntu 20.04以降、LXDはスナップパッケージとして正式に利用可能になりました。 これは新しいパッケージ形式であり、いくつかの利点があります。 スナップパッケージは、スナップパッケージをサポートする任意のLinuxディストリビューションにインストールできます。 LXDスナップパッケージを実行するときは、少なくとも2GBのRAMを搭載したサーバーを使用することをお勧めします。 次の表は、LXDスナップパッケージの機能をまとめたものです。

特徴 スナップパッケージ
利用可能なLXDバージョン 2.0、3.0、4.0、4.x
メモリ要件 snapdサービスの場合は中程度。 2GBのRAMを搭載した推奨サーバー
アップグレードに関する考慮事項 LXDのアップグレードを最大60日延期できます
他のパッケージ形式からアップグレードする機能 デブからスナップにアップグレードできます

このチュートリアルの残りの部分に従って、Ubuntu20.04のスナップパッケージのLXDを使用します。 ただし、LXD debパッケージを使用する場合は、チュートリアル Ubuntu18.04にLXDをインストールして使用する方法を参照してください。

ステップ1—LXD用の環境の準備

LXDを構成して実行する前に、サーバーの環境を準備します。 これには、sudoユーザーをに追加することが含まれます lxd ストレージバックエンドをグループ化して構成します。

非rootアカウントをに追加する lxd Unixグループ

root以外のアカウントを設定するときは、それらをに追加します lxd 次のコマンドを使用してグループ化します。 The adduser コマンドは、ユーザーアカウントを既存のUnixグループに追加するために、引数としてユーザーアカウントとUnixグループを取ります。

  1. sudo adduser sammy lxd

次に、新しいメンバーシップを適用します。

  1. su sammy

パスワードを入力してを押します ENTER.

最後に、ユーザーがに追加されたことを確認します lxd グループ:

  1. id -nG

次のような出力が表示されます。

  1. sammy sudo lxd

これで、LXDの構成を続行する準備が整いました。

ストレージバックエンドの準備

まず、ストレージバックエンドを構成します。

UbuntuでLXDを実行する場合に推奨されるストレージバックエンドは、ZFSファイルシステムです。 ZFSは、 DigitalOcean BlockStorageとも非常にうまく機能します。 LXDでZFSサポートを有効にするには、最初にパッケージリストを更新してから、 zfsutils-linux 補助パッケージ:

  1. sudo apt update
  2. sudo apt install -y zfsutils-linux

LXD初期化スクリプトを実行する準備がほぼ整いました。

その前に、ブロックストレージのデバイス名を特定してメモする必要があります。

これを行うには、 ls 確認するには /dev/disk/by-id/ ディレクトリ:

  1. ls -l /dev/disk/by-id/

この特定の例では、デバイス名のフルパスは次のとおりです。 /dev/disk/by-id/scsi-0DO_Volume_volume-fra1-0:

Output
total 0 lrwxrwxrwx 1 root root 9 Sep 16 20:30 scsi-0DO_Volume_volume-fra1-0 -> ../../sda

ストレージデバイスの完全なファイルパスを書き留めます。 LXDを構成するときに、次の手順で使用します。

ステップ2—LXDの初期化と構成

LXDは、Ubuntu20.04でスナップパッケージとして利用できます。 プリインストールされていますが、設定する必要があります。

まず、LXDスナップパッケージがインストールされていることを確認します。 コマンド snap list インストールされているスナップパッケージを表示します:

  1. snap list

Ubuntu20.04はLXD4.0.3をプレインストールし、 4.0/stable チャネル。 LXD 4.0は5年間(2025年まで)サポートされます。 セキュリティアップデートのみを受信します。

Output of the "snap list" command — Listing the installed snap packages
Name Version Rev Tracking Publisher Notes core18 20200724 1885 latest/stable canonical✓ base lxd 4.0.3 16922 4.0/stable/… canonical✓ - snapd 2.45.3.1 8790 latest/stable canonical✓ snapd

LXDにインストールされたスナップパッケージの詳細については、次を実行してください。 snap info lxd. パッケージが最後に更新された日時を含め、利用可能なバージョンを確認できます。

次に、LXDを構成します。

LXDのストレージオプションの構成

を使用してLXD初期化プロセスを開始します sudo lxd init 指図:

  1. sudo lxd init

まず、プログラムはLXDクラスタリングを有効にするかどうかを尋ねます。 このチュートリアルでは、を押します ENTER デフォルトを受け入れる no、またはタイプ no 次にを押します ENTER. LXDクラスタリングは、LXDセットアップの高可用性を可能にする高度なトピックであり、クラスター内で少なくとも3台のLXDサーバーを実行する必要があります。

Output
Would you like to use LXD clustering? (yes/no) [default=no]: no

次の6つのプロンプトは、ストレージプールを処理します。 次の応答を返します。

  • プレス ENTER 新しいストレージプールを構成します。
  • プレス ENTER デフォルトのストレージプール名を受け入れます。
  • プレス ENTER デフォルトを受け入れる zfs ストレージバックエンド。
  • プレス ENTER 新しいZFSプールを作成します。
  • タイプ yes 既存のブロックデバイスを使用します。
  • 最後に、ブロックストレージデバイス名へのフルパスを入力します(これは前に記録したものです。 次のようになります。 /dev/disk/by-id/device_name).

あなたの答えは次のようになります:

Output
Do you want to configure a new storage pool? (yes/no) [default=yes]: yes Name of the new storage pool [default=default]: default Name of the storage backend to use (btrfs, dir, lvm, zfs) [default=zfs]: zfs Create a new ZFS pool? (yes/no) [default=yes]: yes Would you like to use an existing block device? (yes/no) [default=no]: yes Path to the existing block device: /dev/disk/by-id/scsi-0DO_Volume_volume-fra1-01

これで、LXDのストレージバックエンドが構成されました。 LXDを継続する init スクリプトでは、いくつかのネットワークオプションを構成します。

LXDのネットワークオプションの構成

LXDは、MAAS(Metal As A Server)サーバーに接続するかどうかを尋ねます。 MAASは、ベアメタルサーバーを仮想マシンのように見せ、仮想マシンのように処理するソフトウェアです。

LXDをスタンドアロンモードで実行しているため、デフォルトを受け入れて回答します no:

Output
Would you like to connect to a MAAS server? (yes/no) [default=no]: no

次に、LXDコンテナのネットワークブリッジを構成するように求められます。 これにより、次の機能が有効になります。

  • 各コンテナは自動的にプライベートIPアドレスを取得します。
  • 各コンテナは、プライベートネットワークを介して相互に通信できます。
  • 各コンテナはインターネットへの接続を開始できます。
  • デフォルトでは、各コンテナはインターネットからアクセスできません。 明示的に有効にしない限り、インターネットから接続を開始してコンテナに到達することはできません。 次のステップで、特定のコンテナへのアクセスを許可する方法を学習します。

新しいローカルネットワークブリッジを作成するように求められたら、 yes:

Output
Would you like to create a new local network bridge? (yes/no) [default=yes]: yes

次に、デフォルト名を受け入れます。 lxdbr0:

Output
What should the new bridge be called? [default=lxdbr0]: lxdbr0

ブリッジのプライベートIPアドレス範囲の自動選択を受け入れます。

Output
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: auto What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: auto

最後に、LXDは次のその他の質問をします。

ネットワーク経由でLXDを管理するかどうかを尋ねられたら、を押します。 ENTER または答える no:

Output
Would you like LXD to be available over the network? (yes/no) [default=no]: no

古いコンテナイメージを自動的に更新するかどうかを尋ねられたら、を押します ENTER または答える yes:

Output
Would you like stale cached images to be updated automatically? (yes/no) [default=yes] yes

作成したYAML構成を表示して保持するかどうかを尋ねられたら、答えます yes もしあなたがそうするなら。 それ以外の場合は、 ENTER または答える no:

Output
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]: no

スクリプトはバックグラウンドで実行されます。 通常、出力を受信しません。

これで、LXDのネットワークとストレージのオプションが構成されました。 次に、最初のLXDコンテナを作成します。

ステップ2—LXDコンテナの作成と構成

LXDの構成が正常に完了したので、最初のコンテナーを作成および管理する準備が整いました。 LXDでは、を使用してコンテナを管理します lxc コマンドの後にアクションが続く list, launch, start, stopdelete.

使用する lxc list 使用可能なインストール済みコンテナを表示するには:

  1. lxc list

初めてなので lxc コマンドはLXDハイパーバイザーと通信し、コンテナーの起動方法に関する情報を表示します。 最後に、コマンドはコンテナの空のリストを表示します。 まだ作成していないため、これは予想されます。

Output of the "lxd list" command
To start your first container, try: lxc launch ubuntu:18.04 +------+-------+------+------+------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +------+-------+------+------+------+-----------+

次に、Nginxを実行するコンテナーを作成します。 これを行うには、最初に lxc launch 名前の付いたUbuntu18.04コンテナを作成して起動するコマンド webserver.

を作成します webserver 容器。 The 18.04ubuntu:18.04 Ubuntu18.04のショートカットです。 ubuntu: LXDイメージの事前設定されたリポジトリの識別子です。 あなたも使うことができます ubuntu:bionic 画像名の場合:

  1. lxc launch ubuntu:20.04 webserver

:実行すると、利用可能なすべてのUbuntuイメージの完全なリストを見つけることができます lxc image list ubuntu: およびその他のLinuxディストリビューションを実行して lxc image list images:. 両方 ubuntu:images: コンテナイメージのリポジトリです。 コンテナイメージごとに、コマンドを使用して詳細情報を取得できます lxc image info ubuntu:20.04.

コンテナを作成するのはこれが初めてなので、このコマンドはインターネットからコンテナイメージをダウンロードしてキャッシュします。 新しいコンテナのダウンロードが完了すると、次の出力が表示されます。

Output
Creating webserver Starting webserver

とともに webserver コンテナが起動しました。 lxc list それに関する情報を表示するコマンド。 追加しました --columns ns4 の列のみを表示するため name, stateIPv4 住所。 デフォルト lxc list コマンドは、さらに3つの列を表示します。IPv6アドレス、コンテナーが永続的であるか一時的であるか、および各コンテナーで使用可能なスナップショットがあるかどうかです。

  1. lxc list --columns ns4

出力には、各コンテナの名前、現在の状態、IPアドレス、およびタイプが記載されたテーブルが表示されます。

Output
+-----------+---------+------------------------------------+ | NAME | STATE | IPV4 | +-----------+---------+------------------------------------+ | webserver | RUNNING | your_webserver_container_ip (eth0) | +-----------+---------+------------------------------------+

LXDのDHCPサーバーはこのIPアドレスを提供し、ほとんどの場合、サーバーが再起動されても同じままです。 ただし、次の手順で作成します iptables インターネットからコンテナに接続を転送するルール。 したがって、LXDのDHCPサーバーに、常に同じIPアドレスをコンテナーに与えるように指示する必要があります。

次の一連のコマンドは、静的IP割り当てを取得するようにコンテナを構成します。 まず、ネットワーク構成を上書きします eth0 デフォルトのLXDプロファイルから継承されたデバイス。 これにより、静的IPアドレスを設定できるため、コンテナに出入りするWebトラフィックの適切な通信が保証されます。

具体的には、 lxc config device を実行するコマンドです config 構成するアクション device. 最初の行にはサブアクションがあります override デバイスをオーバーライドするには eth0 コンテナから webserver. 2行目には、を設定するサブアクションがあります ipv4.address のフィールド eth0 のデバイス webserver DHCPサーバーによって最初に指定されたIPアドレスへのコンテナー。

最初の実行 config 指図:

  1. lxc config device override webserver eth0

次のような出力が表示されます。

Output
Device eth0 overridden for webserver

次に、静的IPを設定します。

  1. lxc config device set webserver eth0 ipv4.address your_webserver_container_ip

コマンドが成功した場合、出力はありません。

コンテナを再起動します。

  1. lxc restart webserver

次に、コンテナのステータスを確認します。

  1. lxc list

コンテナが RUNNING そしてその IPV4 addressは静的アドレスです。

これで、コンテナー内にNginxをインストールして構成する準備が整いました。

ステップ3—LXDコンテナ内でのNginxの構成

このステップでは、に接続します webserver コンテナを作成し、Webサーバーを構成します。

でコンテナに接続します lxc shell コマンド。コンテナの名前を取得し、コンテナ内でシェルを開始します。

  1. lxc shell webserver

コンテナ内に入ると、シェルプロンプトは次のようになります。

  1. [environment second]

このシェルは、ルートシェルであっても、コンテナに限定されます。 このシェルで実行するものはすべてコンテナーに残り、ホストサーバーにエスケープできません。

注:シェルをコンテナに入れると、次のような警告が表示される場合があります mesg: ttyname failed: No such device. このメッセージは、コンテナ内のシェルがコマンドを実行しようとしたときに生成されます mesg 構成ファイルから /root/.profile. あなたはそれを安全に無視することができます。 表示されないようにするには、コマンドを削除します mesg n || true から /root/.profile.

コンテナに入ったら、パッケージリストを更新してNginxをインストールします。

  1. apt update
  2. apt install nginx

Nginxをインストールしたら、デフォルトのNginxWebページを編集します。 具体的には、このサイトが内部でホストされていることが明確になるように、2行のテキストを追加します。 webserver 容器。

使用する nano またはお好みのエディタで、ファイルを開きます /var/www/html/index.nginx-debian.html:

  1. nano /var/www/html/index.nginx-debian.html

ハイライトされた2つのフレーズをファイルに追加します。

/var/www/html/index.nginx-debian.html
<!DOCTYPE html> <html> <head> <title>Welcome to nginx on LXD container webserver!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx on LXD container webserver!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> ...

ファイルを2か所で編集し、具体的にテキストを追加しました on LXD container webserver. ファイルを保存して、テキストエディタを終了します。

次に、コンテナからログアウトします。

  1. logout

サーバーのデフォルトのプロンプトが戻ったら、次を使用します curl コンテナ内のWebサーバーが機能していることをテストします。 これを行うには、WebコンテナのIPアドレスが必要です。これは、 lxc list 以前のコマンド。

使用する curl Webサーバーをテストするには:

  1. curl http://your_webserver_container_ip

NginxのデフォルトのHTMLウェルカムページが出力として表示されます。 編集内容が含まれていることに注意してください。

Output
<!DOCTYPE html> <html> <head> <title>Welcome to nginx on LXD container webserver!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx on LXD container webserver!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> ...

Webサーバーは機能していますが、アクセスできるのは、ホスト上でプライベートIPを使用している場合のみです。 次のステップでは、外部リクエストをこのコンテナにルーティングして、世界中がインターネットを介してWebサイトにアクセスできるようにします。

ステップ4—LXDを使用して着信接続をNginxコンテナに転送する

Nginxを構成したので、Webサーバーコンテナーをインターネットに接続します。 まず、ポートで受信する可能性のある接続を転送するようにサーバーを設定する必要があります 80webserver 容器。 これを行うには、を作成します iptables ネットワーク接続を転送するルール。 IPTablesの詳細については、チュートリアルIPtablesファイアウォールの仕組みおよびIPtablesEssentials:一般的なファイアウォールルールとコマンドを参照してください。

これ iptables コマンドには2つのIPアドレスが必要です。サーバーのパブリックIPアドレス(your_server_ip)およびのプライベートIPアドレス webserver 容器 (your_webserver_container_ip)、これを使用して取得できます lxc list 指図。

次のコマンドを実行して、新しいIPtablesルールを作成します。

  1. PORT=80 PUBLIC_IP=your_server_ip CONTAINER_IP=your_container_ip IFACE=eth0 sudo -E bash -c 'iptables -t nat -I PREROUTING -i $IFACE -p TCP -d $PUBLIC_IP --dport $PORT -j DNAT --to-destination $CONTAINER_IP:$PORT -m comment --comment "forward to the Nginx container"'

そのコマンドを調べてみましょう:

  • -t nat 使用していることを指定します nat アドレス変換用のテーブル。
  • -I PREROUTING ルールをPREROUTINGチェーンに追加することを指定します。
  • -i $IFACE インターフェイスを指定します eth0、これは、Dropletsのホスト上のデフォルトのパブリックネットワークインターフェイスです。
  • -p TCP TCPプロトコルを使用していると言います。
  • -d $PUBLIC_IP ルールの宛先IPアドレスを指定します。
  • --dport $PORT:宛先ポートを指定します(など 80).
  • -j DNAT 宛先NAT(DNAT)へのジャンプを実行したいと言います。
  • --to-destination $CONTAINER_IP:$PORT リクエストを特定のコンテナのIPアドレスと宛先ポートに送信することを示しています。

注:このコマンドを再利用して、転送ルールを設定できます。 変数をリセットします PORT, PUBLIC_IP, CONTAINER_IPIFACE 行の先頭に。 ハイライトされた値を変更するだけです。

次に、IPTablesルールを一覧表示します。

  1. sudo iptables -t nat -L PREROUTING

次のような出力が表示されます。

[secondary_label Output] 
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       tcp  --  anywhere             your_server_ip       tcp dpt:http /* forward to this container */ to:your_container_ip:80
...

次に、インターネットからWebサーバーにアクセスできることをテストします。

使用 curl ローカルマシンからコマンドを実行して接続をテストします。

  1. curl --verbose 'http://your_server_ip'

ヘッダーの後に、コンテナで作成したWebページのコンテンツが表示されます。

Output
* Trying your_server_ip... * Connected to your_server_ip (your_server_ip) port 80 (#0) > GET / HTTP/1.1 > User-Agent: curl/7.47.0 > Accept: */* > < HTTP/1.1 200 OK < Server: nginx/1.10.0 (Ubuntu) ... <!DOCTYPE html> <html> <head> <title>Welcome to nginx on LXD container webserver!</title> <style> body { ...

これにより、リクエストがコンテナに送信されることが確認されます。

最後に、ファイアウォールルールを保存して、再起動後に再適用できるようにします。

これを行うには、最初にをインストールします iptables-persistent パッケージ:

  1. sudo apt install iptables-persistent

パッケージをインストールすると、アプリケーションは現在のファイアウォールルールを保存するように要求します。 現在のすべてのルールを受け入れて保存します。

マシンを再起動すると、ファイアウォールルールが読み込まれます。 さらに、LXDコンテナのNginxサービスが自動的に再起動します。

LXDが正常に構成されました。 最後のステップでは、サービスを停止して破棄する方法を学習します。

ステップ5—LXDを使用したコンテナの停止と削除

コンテナを削除して削除することを決定できます。 このステップでは、コンテナを停止して削除します。

まず、コンテナを停止します。

  1. lxc stop webserver

使用 lxc list ステータスを確認するコマンド:

  1. lxc list

コンテナの状態が次のようになっていることがわかります STOPPED:

Output
+-----------+---------+------+------+------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +-----------+---------+------+------+------------+-----------+ | webserver | STOPPED | | | PERSISTENT | 0 | +-----------+---------+------+------+------------+-----------+

コンテナを削除するには、 lxc delete:

  1. lxc delete webserver

ランニング lxc list 再び、実行中のコンテナがないことを示しています。

  1. lxc list

コマンドは以下を出力します:

+------+-------+------+------+------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------+-------+------+------+------+-----------+

使用 lxc help 追加のオプションを表示するコマンド。

トラフィックをコンテナにルーティングするファイアウォールルールを削除するには、最初にこのコマンドを使用してルールのリストでルールを見つけます。これにより、行番号が各ルールに関連付けられます。

  1. sudo iptables -t nat -L PREROUTING --line-numbers

次のように、行番号が前に付いたルールが表示されます。

Output
Chain PREROUTING (policy ACCEPT) num target prot opt source destination 1 DNAT tcp -- anywhere your_server_ip tcp dpt:http /* forward to the Nginx container */ to:your_container_ip

その行番号を使用して、ルールを削除します。

  1. sudo iptables -t nat -D PREROUTING 1

削除を確実にするために、ルールを再度リストします。

  1. sudo iptables -t nat -L PREROUTING --line-numbers

ルールが削除されます:

Output
Chain PREROUTING (policy ACCEPT) num target prot opt source destination

サーバーを再起動したときにルールが戻らないように、変更を保存します。

  1. sudo netfilter-persistent save

これで、独自の設定で別のコンテナを起動し、トラフィックを転送するための新しいファイアウォールルールを追加できます。

結論

このチュートリアルでは、LXDをインストールして構成しました。 次に、LXDコンテナ内で実行されているNginxを使用してWebサイトを作成し、IPtablesで公開しました。

ここから、それぞれが独自のコンテナに限定されたより多くのWebサイトを構成し、リバースプロキシを使用してトラフィックを適切なコンテナに転送できます。 チュートリアルUbuntu16.04でLXDを使用してNginxとHAProxyで複数のWebサイトをホストする方法では、そのセットアップについて説明します。

LXDの使用方法の詳細については、LXDリファレンスドキュメントを参照してください。

LXDで練習するには、オンラインでLXDを試して、Webベースのチュートリアルに従ってください。

LXDのユーザーサポートを利用するには、LXDディスカッションフォーラムにアクセスしてください。