Ubuntu 16.04でLXDをセットアップして使用する方法

前書き

Linux containerは、ネームスペースやコントロールグループなどのLinuxカーネルセキュリティ機能を使用して、システムの他の部分から分離されたプロセスのグループです。 これは仮想マシンに似た構造ですが、はるかに軽量です。追加のカーネルを実行したり、ハードウェアをシミュレートしたりするオーバーヘッドはありません。 つまり、同じサーバー上に複数のコンテナを簡単に作成できます。

たとえば、顧客向けに複数のWebサイトを実行するサーバーがあるとします。 従来のインストールでは、各WebサイトはApacheまたはNginx Webサーバーの同じインスタンスの仮想ホストになります。 ただし、Linuxコンテナを使用すると、各Webサイトを独自のWebサーバーを備えた独自のコンテナに設定できます。 Linuxコンテナーを使用して、アプリケーションとその依存関係をコンテナーにバンドルし、システムの他の部分に影響を与えません。

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

前提条件

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

  • 1つのUbuntu 16.04サーバー。チュートリアルhttps://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04[Ubuntu 16.04での初期サーバーセットアップ]に従って構成され、sudo non -rootユーザーとファイアウォール。

  • 必要に応じて、チュートリアルhttps://www.digitalocean.com/community/tutorial_series/getting-started-with-digitalocean-block-storage[DigitalOceanブロックストレージ入門]に従って20GB以上のブロックストレージを追加します。 これを使用して、コンテナに関連するすべてのデータを保存できます。

ステップ1-LXDの構成

LXDはすでにUbuntuにインストールされていますが、サーバーで使用する前に適切に構成する必要があります。 ユーザーアカウントを設定してコンテナを管理し、コンテナを保存するストレージバックエンドのタイプを設定し、ネットワークを設定する必要があります。

非rootユーザーアカウントを使用してサーバーにログインします。 次に、ユーザーを「+ lxd +」グループに追加して、すべてのコンテナー管理タスクを実行できるようにします。

sudo usermod --append --groups lxd

サーバーからログアウトし、再度ログインして、新しいSSHセッションが新しいグループメンバーシップで更新されるようにします。 ログインしたら、LXDの設定を開始できます。

次に、ストレージバックエンドを構成します。 LXDの推奨ストレージバックエンドはZFSファイルシステムで、事前に割り当てられたファイルに保存されるか、https://www.digitalocean.com/products/storage/ [ブロックストレージ]を使用して保存されます。 LXDでZFSサポートを使用するには、パッケージリストを更新し、 `+ zfsutils-linux +`パッケージをインストールします。

sudo apt-get update
sudo apt-get install zfsutils-linux

LXDを構成できるようになりました。 `+ lxd init +`コマンドでLXD初期化プロセスを開始します:

sudo lxd init

ストレージバックエンドの詳細を指定するよう求められます。 その構成を完了すると、コンテナーのネットワークを構成します。

最初に、新しいストレージプールを構成するかどうかを尋ねられます。 `+ yes。+`と答えるべきです。

Do you want to configure a new storage pool (yes/no) [default=yes]?

次に、ストレージバックエンドのプロンプトが表示され、「+ dir 」または「 zfs 」の2つの選択肢が表示されます。 ` dir `オプションは、サーバーのファイルシステム上のディレクトリにコンテナを保存するようLXDに指示します。 ` zfs +`オプションは、ファイルシステムと論理ボリュームマネージャーを組み合わせたZFSを使用します。

`+ zfs `オプションを使用します。 ` zfs +`を使用することにより、ストレージの効率と応答性の両方が得られます。 たとえば、同じ初期コンテナイメージから10個のコンテナを作成する場合、それらはすべて単一のコンテナイメージのディスク領域を使用します。 それ以降、初期コンテナイメージへの変更のみがストレージバックエンドに保存されます。

OutputName of the storage backend to use (dir or zfs) [default=zfs]:

「+ zfs 」を選択すると、新しいZFSプールを作成し、プールに名前を付けるように求められます。 ` yes `を選択してプールを作成し、プール ` lxd +`を呼び出します。

OutputCreate a new ZFS pool (yes/no) [default=yes]?
Name of the new ZFS pool [default=lxd]:

次に、既存のブロックデバイスを使用するかどうかを尋ねられます。

OutputWould you like to use an existing block device (yes/no) [default=no]?

「+ yes 」と言うと、LXDにそのデバイスの場所を伝える必要があります。 「 no +」と言うと、LXDは事前に割り当てられたファイルを使用します。 このオプションでは、サーバー自体の空き領域を使用します。

事前に割り当てられたファイルを使用するかブロックデバイスを使用するかに応じて、次の2つのセクションがあります。 ケースに適した手順に従ってください。 ストレージメカニズムを指定したら、コンテナのネットワークオプションを構成します。

オプション1-事前割り当てファイルの使用

コンテナを保存するための別のブロックストレージデバイスにアクセスできない場合は、事前に割り当てられたファイルを使用します。 事前に割り当てられたファイルを使用してコンテナを保存するようにLXDを設定するには、次の手順に従います。

まず、既存のブロックデバイスを使用するように求められたら、「+ no +」と入力します。

OutputWould you like to use an existing block device (yes/no) [default=no]?

次に、* loop device *のサイズを指定するよう求められます。これは、LXDが事前に割り当てたファイルと呼ぶものです。 +事前に割り当てられたファイルに推奨されるデフォルトサイズを使用します。

OutputSize in GB of the new loop device (1GB minimum) [default=15]:

経験則として、15GBは実際に作成する必要がある最小サイズです。コンテナを作成した後に少なくとも10GBの空き容量が残るように十分なスペースを事前に割り当てたい場合。

デバイスを構成すると、ネットワーク設定を構成するように求められます。 link:#step-2-%E2%80%94-configuring-networking [ステップ2]に移動して、セットアップを続行します。

オプション2 –ブロックデバイスの使用

Block Storageをストレージバックエンドとして使用する場合、LXDの構成で指定するために、作成したBlock Storageボリュームを指すデバイスを見つける必要があります。 https://cloud.digitalocean.com [DigitalOceanコントロールパネル]の[ボリューム]タブに移動し、ボリュームを見つけて、[その他]ポップアップをクリックし、[構成手順]をクリックします。

ボリュームをフォーマットするコマンドを見て、デバイスを見つけます。 具体的には、 `+ sudo mkfs.ext4 -F +`コマンドで指定されたパスを探します。 そのページからコマンドを実行しないでください。LXDに与える正しいデバイス名を見つける必要があるだけです。 次の図は、ボリュームのデバイス名の例を示しています。 赤い線で下線が引かれている部分のみが必要です。

image:https://assets.digitalocean.com/articles/lxd_containers_ubuntu_1604/6rDyC1l.png [構成手順は、作成されたブロックストレージボリュームのデバイスを示しています。]

次のコマンドでデバイス名を特定することもできます。

ls -l
total 0
lrwxrwxrwx 1 root root  9 Sep  16 20:30  -> ../../sda

この場合、ボリュームのデバイス名は「+ / dev / disk / by-id / scsi-0D0_Volume_volume-fra1-01 +」ですが、実際のデバイス名は異なる場合があります。

ボリュームのデバイス名を特定したら、LXDのインストールを続行します。 既存のブロックデバイスの使用についてプロンプトが表示されたら、「+ yes +」を選択し、デバイスへのパスを指定します。

Output of the "lxd init" commandWould you like to use an existing block device (yes/no) [default=no]?
Path to the existing block device:

ディスクを指定すると、ネットワークオプションを構成するように求められます。

ステップ2-ネットワークの構成

ストレージバックエンドを設定すると、LXDのネットワークを設定するよう求められます。

まず、LXDは、ネットワーク経由でアクセス可能にするかどうかを尋ねます。 「+ yes 」を選択すると、このサーバーにSSH接続することなく、ローカルコンピューターからLXDを管理できます。 デフォルト値の「 no +」のままにします:

Output of the "lxd init" command - LXD over the networkWould you like LXD to be available over the network (yes/no) [default=no]?

このオプションを有効にする場合は、https://stgraber.org/2016/04/12/lxd-2-0-remote-hosts-and-container-migration-612/ [LXD 2.0:リモートホストとコンテナをお読みください移行]をご覧ください。

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

  • 各コンテナは自動的にプライベートIPアドレスを取得します。

  • コンテナはプライベートネットワークを介して相互に通信できます。

  • 各コンテナは、インターネットへの接続を開始できます。

  • 作成するコンテナには、インターネットからアクセスできません。明示的に有効にしない限り、インターネットから接続してコンテナに到達することはできません。 次の手順で、特定のコンテナへのアクセスを許可する方法を学習します。

LXDブリッジの構成を求められたら、「+ yes +」を選択します。

Output of the "lxd init" command - Networking for the containersDo you want to configure the LXD bridge (yes/no) [default=yes]?

次のダイアログが表示されます:

image:https://assets.digitalocean.com/articles/lxd_containers_ubuntu_1604/u9D79uB.png [LXDネットワーク構成、構成ウィザードの開始]

ネットワークブリッジをセットアップすることを確認します。

ブリッジに名前を付けるように求められます。 デフォルト値を受け入れます。

IPv4とIPv6の両方のネットワーク構成を実行するように求められます。 このチュートリアルでは、IPv4のみを使用します。

IPv4サブネットのセットアップを求められたら、*はい*を選択します。 ランダムなサブネットが設定されたことが通知されます。 [OK]を選択して続行します。

有効なIPv4アドレスの入力を求められたら、デフォルト値を受け入れます。

有効なCIDRマスクの入力を求められたら、デフォルト値を受け入れます。

最初のDHCPアドレスの入力を求められたら、デフォルト値を受け入れます。 DHCPクライアントの最大数と同様に、最後のDHCPアドレスにも同じことを行います。

IPv4トラフィックをNAT変換するように求められたら、[はい]を選択します。

IPv6サブネットの構成を求められたら、*いいえ*を選択します。 ネットワークのセットアップが完了すると、次の出力が表示されます。

OutputWarning: Stopping lxd.service, but it can still be activated by:
 lxd.socket
LXD has been successfully configured.

コンテナを作成する準備が整いました。

ステップ3-Nginxコンテナーの作成

LXDの構成が正常に完了しました。これで、最初のコンテナーを作成および管理する準備が整いました。 コンテナを管理するには、 `+ lxc +`コマンドを使用します。

利用可能なインストール済みコンテナを表示するには、 `+ lxc list +`を使用します。

lxc list

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

Output of the "lxd list" commandGenerating a client certificate. This may take a minute...
If this is your first time using LXD, you should also run: sudo lxd init
To start your first container, try: lxc launch ubuntu:16.04

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

`+ lxc +`コマンドがLXDハイパーバイザーと通信するのはこれが初めてなので、出力により、コマンドがLXDとの安全な通信のためのクライアント証明書を自動的に作成したことがわかります。 次に、コンテナの起動方法に関する情報が表示されます。 最後に、コマンドはコンテナーの空のリストを表示しますが、これはまだ作成していないため予想されます。

Nginxを実行するコンテナーを作成しましょう。 そのためには、 `+ lxc launch `コマンドを使用して、 ` webserver +`という名前のUbuntu 16.04コンテナーを作成して起動します。

`+ webserver +`コンテナを作成します:

lxc launch ubuntu:x webserver

`+ ubuntu:x `の ` x `は、Ubuntu 16.04のコードネームであるXenialの最初の文字へのショートカットです。 ` ubuntu:`は、LXDイメージの事前構成済みリポジトリの識別子です。 イメージ名に ` ubuntu:16.04 +`を使用することもできます。

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

OutputGenerating a client certificate. This may take a minute...
If this is your first time using LXD, you should also run: sudo lxd init
To start your first container, try: lxc launch ubuntu:16.04

Creating webserver
Retrieving image: 100%
Starting webserver

コンテナが実行されたので、 `+ lxc list +`コマンドを使用してコンテナに関する情報を表示します:

lxc list

出力には、各コンテナの名前、現在の状態、IPアドレス、タイプ、およびスナップショットが作成されているかどうかを示すテーブルが表示されます。

出力

+-----------+---------+-----------------------+------+------------+-----------+
|  NAME     |  STATE  |         IPV4          | IPV6 |    TYPE    | SNAPSHOTS |
+-----------+---------+-----------------------+------+------------+-----------+
| webserver | RUNNING |  (eth0)   |      | PERSISTENT | 0         |
+-----------+---------+-----------------------+------+------------+-----------+

コンテナのIPv4アドレスをメモします。 ファイアウォールを設定して、外部からのトラフィックを許可するために必要になります。

それでは、コンテナ内でNginxをセットアップしましょう。

ステップ4-Nginxコンテナーの構成

`+ webserver +`コンテナに接続して、Webサーバーを設定しましょう。

`+ lxc exec +`コマンドでコンテナに接続します。このコマンドは、コンテナの名前と実行するコマンドを受け取ります:

lxc exec webserver -- sudo --login --user ubuntu

最初の「-」文字列は、「+ lxc 」のコマンドパラメータがそこで停止することを示し、残りの行はコンテナ内で実行されるコマンドとして渡されます。 コマンドは ` sudo --login --user ubuntu `で、コンテナ内の事前設定されたアカウント ` ubuntu +`にログインシェルを提供します。

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

コンテナ内のこの* ubuntu *ユーザーには、事前設定された `+ sudo `アクセスがあり、パスワードを入力せずに ` sudo +`コマンドを実行できます。 このシェルは、コンテナの範囲に制限されています。 このシェルで実行するものはすべてコンテナに残り、ホストサーバーにエスケープできません。

このコンテナでNginxをセットアップしましょう。 コンテナ内のUbuntuインスタンスのパッケージリストを更新し、Nginxをインストールします。

sudo apt-get update
sudo apt-get install nginx

次に、このサイトのデフォルトのWebページを編集し、このサイトが `+ webserver `コンテナでホストされていることを明確にするテキストを追加します。 ファイル ` / var / www / html / index.nginx-debian.html +`を開きます:

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

ファイルに次の変更を加えます。

編集済みファイル/var/www/html/index.nginx-debian.html

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx !</title>
<style>
   body {
       width: 35em;
       margin: 0 auto;
       font-family: Tahoma, Verdana, Arial, sans-serif;
   }
</style>
</head>
<body>
<h1>Welcome to nginx !</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 +」を追加しました。 ファイルを保存して、エディターを終了します。

コンテナからログアウトし、ホストサーバーに戻ります。

logout

コンテナ内のWebサーバーが動作していることをテストするには、 `+ curl `を使用します。 前に ` lxd list +`コマンドを使用して見つけたWebコンテナのIPアドレスが必要になります。

curl http:///

出力は次のようになります。

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

Webサーバーは動作していますが、プライベートIPを介してのみアクセスできます。 外部のリクエストをこのコンテナにルーティングして、世界がウェブサイトにアクセスできるようにします。

ステップ5-Nginxコンテナーへの着信接続の転送

パズルの最後のピースは、Webサーバーコンテナーをインターネットに接続することです。 Nginxはコンテナにインストールされており、デフォルトではインターネットからアクセスできません。 ポート「80」でインターネットから受信する接続を「+ webserver 」コンテナに転送するようにサーバーを設定する必要があります。 これを行うために、接続を転送するための「 iptables +」ルールを作成します。 IPTablesの詳細については、https://www.digitalocean.com/community/tutorials/how-the-iptables-firewall-works [IPtables Firewallの仕組み]およびhttps://www.digitalocean.com/community/をご覧ください。チュートリアル/ iptables-essentials-common-firewall-rules-and-commands [IPtables Essentials:Common Firewall Rules and Commands]。

+ iptables +`コマンドには、サーバーのパブリックIPアドレス( ``)と `+ nginx +`コンテナのプライベートIPアドレス( `)の2つのIPアドレスが必要です。 + lxc list + `コマンド。

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

PORT= PUBLIC_IP= CONTAINER_IP= \
sudo -E bash -c 'iptables -t nat -I PREROUTING -i eth0 -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 eth0 +`は、ドロップレットのデフォルトのパブリックインターフェイスであるインターフェイス* eth0 *を指定します。

  • 「+ -p TCP +」は、TCPプロトコルを使用していることを示します。

  • `+ -d $ PUBLIC_IP +`は、ルールの宛先IPアドレスを指定します。

  • +-dport $ PORT +:宛先ポートを指定します( `+ 80 +`など)。

  • `+ -j DNAT +`は、Destination NAT(DNAT)へのジャンプを実行したいことを示しています。

  • `+-to-destination $ CONTAINER_IP:$ PORT +`は、特定のコンテナのIPアドレスと宛先ポートにリクエストを送信することを要求します。

次のコマンドを実行して、IPTablesルールを一覧表示できます。

sudo iptables -t nat -L PREROUTING

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

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

次のように、 `+ curl +`コマンドを使用してローカルコンピューターからWebサーバーにアクセスすることで、Webサーバーが実際にインターネットからアクセスできることをテストします。

curl --verbose  'http://'

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

Output*   Trying ...
* Connected to  () 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 !</title>
<style>
   body {
...

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

最後に、ファイアウォールルールを保存して再起動後に再適用されるようにするには、 `+ iptables-persistent +`パッケージをインストールします:

sudo apt-get install iptables-persistent

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

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

すべての設定が完了したので、それを分解する方法を見てみましょう。

手順5-コンテナの停止と削除

コンテナを降ろして交換することを決定する場合があります。 そのプロセスを見ていきましょう。

コンテナを停止するには、 `+ lxc stop +`を使用します。

lxc stop

ステータスを確認するには、 `+ lxc list +`コマンドを使用します。

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

コンテナを削除するには、 `+ lxc delete +`を使用します:

lxc delete webserver

`+ lxc list +`を再度実行すると、コンテナが実行されていないことがわかります。

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

追加オプションを表示するには、 `+ lxc help +`コマンドを使用します。

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

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

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

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

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

sudo iptables -t nat -D PREROUTING

ルールを再度リストして、ルールがなくなったことを確認します。

`sudo iptables -t nat -L PREROUTING --line-numbers`

ルールはなくなります:

OutputChain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination

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

sudo netfilter-persistent save

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

結論

LXDコンテナで実行されるNginxを使用してWebサイトを設定しました。 ここから、それぞれが独自のコンテナに限定されたより多くのWebサイトを設定し、リバースプロキシを使用して適切なコンテナにトラフィックを誘導できます。 チュートリアルhttps://www.digitalocean.com/community/tutorials/how-to-host-multiple-web-sites-with-nginx-and-haproxy-using-lxd-on-ubuntu-16-04[How to Ubuntu 16.04でLXDを使用してNginxとHAProxyを使用して複数のWebサイトをホストする]では、その設定について説明します。

LXDを使用すると、コンテナの完全な状態のスナップショットを取得できるため、後でバックアップを作成したり、コンテナを簡単にロールバックしたりできます。 また、LXDを2つの異なるサーバーにインストールすると、それらを接続し、インターネット経由でサーバー間でコンテナーを移行することができます。

LXDの詳細については、LXDのメンテナーが作成したhttps://stgraber.org/2016/03/11/lxd-2-0-blog-post-series-012/[LXD 2.0のブログ投稿のこのシリーズ]を参照してください。 。

また、https://linuxcontainers.org/lxd/try-it/ [LXDをオンラインで試す]でWebベースのチュートリアルに従ってさらに練習することもできます。

Related