序章
Linuxコンテナは、システムの他の部分から分離された一連のプロセスです。 エンドユーザーにとって、Linuxコンテナーは仮想マシンとして機能しますが、はるかに軽量です。 追加のLinuxカーネルを実行するオーバーヘッドはなく、コンテナーはCPUハードウェア仮想化のサポートを必要としません。 これは、同じサーバー上に仮想マシンよりも多くのコンテナーを作成できることを意味します。
顧客のために複数のWebサイトを実行する必要があるサーバーがあると想像してください。 一方では、各Webサイトは、ApacheまたはNginxWebサーバーの同じインスタンスの仮想ホスト/サーバーブロックである可能性があります。 一方、仮想マシンを使用する場合は、Webサイトごとに個別のネストされた仮想マシンを作成します。 Linuxコンテナーは、仮想ホストと仮想マシンの間のどこかにあります。
LXD を使用すると、これらのコンテナーを作成および管理できます。 LXDは、コンテナーのライフサイクル全体を管理するハイパーバイザーサービスを提供します。 このチュートリアルでは、LXDを構成し、それを使用してコンテナーでNginxを実行します。 次に、インターネットからコンテナにトラフィックをルーティングして、サンプルのWebページにアクセスできるようにします。
前提条件
このチュートリアルを完了するには、次のものが必要です。
-
Ubuntu18.04を実行しているサーバー。 ルート以外のsudoユーザーとファイアウォールを含むサーバーをセットアップするには、Ubuntu 18.04を実行するDigitalOceanDropletを作成してから、初期サーバーセットアップガイドに従います。 サーバーのパブリックIPアドレスをメモします。 後でそれを次のように参照します
your_server_ip. -
少なくとも5GBのブロックストレージ。 これを設定するには、DigitalOceanのBlockStorage VolumesQuickstartに従うことができます。 ブロックストレージの構成で、[
Manually Format & MountLXDが必要に応じて準備できるようにするため。 これを使用して、コンテナに関連するすべてのデータを保存します。
注:LXDはUbuntu18.04にプリインストールされており、インストールされているLXDパッケージはdebパッケージです。 ただし、Ubuntu 20.04以降、新しいバージョンのLXDはsnapパッケージとしてのみ利用できるようになりました。
したがって、Ubuntu 18.04は、lexDをdebパッケージとして持つ最後のUbuntuバージョンです。 このLXDdebパッケージは、2023年までの標準サポートと2028年のEndofLifeをサポートしています。 パッケージ形式を決定するには、以下の表を参照してください。
| 特徴 | debパッケージ | スナップパッケージ |
|---|---|---|
| 利用可能なLXDバージョン | 3.0 | 2.0、3.0、4.0、4.x |
| メモリ要件 | 最小限 | 中程度、 snapd サービス |
| アップグレードに関する考慮事項 | LXDをアップグレードしないことを決定できます | LXDのアップグレードを最大60日延期できます |
| 他のパッケージ形式から切り替える機能 | サポートされていません | デブからスナップに切り替えることができます |
このチュートリアルの残りの部分に従って、Ubuntu18.04のdebパッケージのLXDを使用します。 ただし、Ubuntu 18.04でLXDスナップパッケージを使用する場合は、[TODO-tokyo-FOR-LXD-IN-UBUNTU-20.04]を参照してください。
ステップ1—LXDの構成
LXDはUbuntu18.04でdebパッケージとして利用できます。 プリインストールされていますが、使用する前に設定する必要があります。 LXDは、LXDサービスと、サービスの構成に役立つデフォルトのクライアントユーティリティで構成されています。 このクライアントユーティリティは lxc. クライアントユーティリティは、次のように実行すると、LXDサービスにアクセスできます。 root、またはroot以外のアカウントがのメンバーである場合 lxd Unixグループ。 以下では、root以外のユーザーアカウントをに追加する方法を示します。 lxd Unixグループを作成し、ストレージバックエンドの構成を続行します。
非rootアカウントをに追加する lxd Unixグループ
root以外のアカウントを設定するときは、それらをに追加します lxd 次のコマンドを使用してグループ化します。 The adduser コマンドは、ユーザーアカウントを既存のUnixグループに追加するために、引数としてユーザーアカウントとUnixグループを取ります。
- sudo adduser sammy lxd
次に、新しいメンバーシップを適用します。
- su sammy
パスワードを入力してを押します ENTER.
最後に、ユーザーがに追加されたことを確認します lxd グループ:
- id -nG
次のような出力が表示されます。
- sammy sudo lxd
これで、LXDの構成を続行する準備が整いました。
ストレージバックエンドの準備
まず、ストレージバックエンドを構成します。
UbuntuでLXDを実行する場合に推奨されるストレージバックエンドは、ZFSファイルシステムです。 ZFSは、 DigitalOcean BlockStorageとも非常にうまく機能します。 LXDでZFSサポートを有効にするには、最初にパッケージリストを更新してから、 zfsutils-linux 補助パッケージ:
- sudo apt update
- sudo apt install -y zfsutils-linux
LXD初期化スクリプトを実行する準備がほぼ整いました。
その前に、ブロックストレージのデバイス名を特定してメモする必要があります。
これを行うには、 ls 確認するには /dev/disk/by-id/ ディレクトリ:
- ls -l /dev/disk/by-id/
この特定の例では、デバイス名のフルパスは次のとおりです。 /dev/disk/by-id/scsi-0DO_Volume_volume-fra1-0:
Outputtotal 0
lrwxrwxrwx 1 root root 9 Sep 16 20:30 scsi-0DO_Volume_volume-fra1-0 -> ../../sda
ストレージデバイスの完全なファイルパスを書き留めます。 次のサブセクションで使用します。
これで、LXDを初期化する準備が整いました。 を使用してLXDを初期化します sudo lxd init 指図:
- sudo lxd init
プロンプトが表示されます。 次の2つのセクションでは、各質問に対する適切な回答について説明します。
LXDのストレージオプションの構成
まず、プログラムはLXDクラスタリングを有効にするかどうかを尋ねます。 このチュートリアルでは、を押します ENTER デフォルトを受け入れる no、またはタイプ no 次にを押します ENTER. LXDクラスタリングは、LXDセットアップの高可用性を可能にする高度なトピックであり、クラスター内で少なくとも3台のLXDサーバーを実行する必要があります。
OutputWould 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).
あなたの答えは次のようになります:
OutputDo 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:
OutputWould you like to connect to a MAAS server? (yes/no) [default=no]: no
次に、LXDコンテナのネットワークブリッジを構成するように求められます。 これにより、次の機能が有効になります。
- 各コンテナは自動的にプライベートIPアドレスを取得します。
- 各コンテナは、プライベートネットワークを介して相互に通信できます。
- 各コンテナはインターネットへの接続を開始できます。
- デフォルトでは、各コンテナはインターネットからアクセスできません。 明示的に有効にしない限り、インターネットから接続を開始してコンテナに到達することはできません。 次のステップで、特定のコンテナへのアクセスを許可する方法を学習します。
新しいローカルネットワークブリッジを作成するように求められたら、 yes:
OutputWould you like to create a new local network bridge? (yes/no) [default=yes]: yes
次に、デフォルト名を受け入れます。 lxdbr0:
OutputWhat should the new bridge be called? [default=lxdbr0]: lxdbr0
ブリッジのプライベートIPアドレス範囲の自動選択を受け入れます。
OutputWhat 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:
OutputWould you like LXD to be available over the network? (yes/no) [default=no]: no
古いコンテナイメージを自動的に更新するかどうかを尋ねられたら、を押します ENTER または答える yes:
OutputWould you like stale cached images to be updated automatically? (yes/no) [default=yes] yes
作成したYAML構成を表示して保持するかどうかを尋ねられたら、答えます yes もしあなたがそうするなら。 それ以外の場合は、 ENTER または答える no:
OutputWould 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, stop と delete.
使用する lxc list 使用可能なインストール済みコンテナを表示するには:
- lxc list
初めてなので lxc コマンドはLXDハイパーバイザーと通信し、コンテナーの起動方法に関する情報を表示します。 最後に、コマンドはコンテナの空のリストを表示します。 まだ作成していないため、これは予想されます。
Output of the "lxd list" commandTo 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.04 の ubuntu:18.04 Ubuntu18.04のショートカットです。 ubuntu: LXDイメージの事前設定されたリポジトリの識別子です。 あなたも使うことができます ubuntu:bionic 画像名の場合:
- lxc launch ubuntu:18.04 webserver
注:実行すると、利用可能なすべてのUbuntuイメージの完全なリストを見つけることができます lxc image list ubuntu: およびその他のLinuxディストリビューションを実行して lxc image list images:. 両方 ubuntu: と images: コンテナイメージのリポジトリです。 コンテナイメージごとに、コマンドを使用して詳細情報を取得できます lxc image info ubuntu:18.04. このチュートリアルの目的でUbuntu18.04でコンテナーを起動しますが、独自のプロジェクトで使用可能な任意のUbuntuバージョンを選択できます。
コンテナを作成するのはこれが初めてなので、このコマンドはインターネットからコンテナイメージをダウンロードしてキャッシュします。 新しいコンテナのダウンロードが完了すると、次の出力が表示されます。
OutputCreating webserver
Starting webserver
とともに webserver コンテナが起動しました。 lxc list それに関する情報を表示するコマンド。 追加しました --columns ns4 の列のみを表示するため name, state と IPv4 住所。 デフォルト lxc list コマンドは、さらに3つの列を表示します。IPv6アドレス、コンテナーが永続的であるか一時的であるか、および各コンテナーで使用可能なスナップショットがあるかどうかです。
- 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 指図:
- lxc config device override webserver eth0
次のような出力が表示されます。
OutputDevice eth0 overridden for webserver
次に、静的IPを設定します。
- lxc config device set webserver eth0 ipv4.address your_webserver_container_ip
コマンドが成功した場合、出力は送信されません。
コンテナを再起動します。
- lxc restart webserver
次に、コンテナのステータスを確認します。
- lxc list
コンテナが RUNNING そしてその IPV4 addressは静的アドレスです。
これで、コンテナー内にNginxをインストールして構成する準備が整いました。
ステップ3—LXDコンテナ内でのNginxの構成
このステップでは、に接続します webserver コンテナを作成し、Webサーバーを構成します。
でコンテナに接続します lxc shell コマンド。コンテナの名前を取得し、コンテナ内でシェルを開始します。
- lxc shell webserver
コンテナ内に入ると、シェルプロンプトは次のようになります。
- [environment second]
このシェルは、ルートシェルであっても、コンテナに限定されます。 このシェルで実行するものはすべてコンテナーに残り、ホストサーバーにエスケープできません。
注:シェルをコンテナに入れると、次のような警告が表示される場合があります mesg: ttyname failed: No such device. このメッセージは、コンテナ内のシェルがコマンドを実行しようとしたときに生成されます mesg 構成ファイルから /root/.profile. あなたはそれを安全に無視することができます。 表示されないようにするには、コマンドを削除します mesg n || true から /root/.profile.
コンテナに入ったら、パッケージリストを更新してNginxをインストールします。
- apt update
- apt install nginx
Nginxをインストールしたら、デフォルトのNginxWebページを編集します。 具体的には、このサイトが内部でホストされていることが明確になるように、2行のテキストを追加します。 webserver 容器。
使用する nano またはお好みのエディタで、ファイルを開きます /var/www/html/index.nginx-debian.html:
- 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. ファイルを保存して、テキストエディタを終了します。
次に、コンテナからログアウトします。
- logout
サーバーのデフォルトのプロンプトが戻ったら、次を使用します curl コンテナ内のWebサーバーが機能していることをテストします。 これを行うには、WebコンテナのIPアドレスが必要です。これは、 lxc list 以前のコマンド。
使用する curl Webサーバーをテストするには:
- 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サーバーコンテナーをインターネットに接続します。 まず、ポートで受信する可能性のある接続を転送するようにサーバーを設定する必要があります 80 に webserver 容器。 これを行うには、を作成します iptables ネットワーク接続を転送するルール。 IPTablesの詳細については、チュートリアルIPtablesファイアウォールの仕組みおよびIPtablesEssentials:一般的なファイアウォールルールとコマンドを参照してください。
これ iptables コマンドには2つのIPアドレスが必要です。サーバーのパブリックIPアドレス(your_server_ip)およびのプライベートIPアドレス webserver 容器 (your_webserver_container_ip)、これを使用して取得できます lxc list 指図。
次のコマンドを実行して、新しいIPtablesルールを作成します。
- 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 TCPTCPプロトコルを使用していると言います。-d $PUBLIC_IPルールの宛先IPアドレスを指定します。--dport $PORT:宛先ポートを指定します(など80).-j DNAT宛先NAT(DNAT)へのジャンプを実行したいと言います。--to-destination $CONTAINER_IP:$PORTリクエストを特定のコンテナのIPアドレスと宛先ポートに送信することを示しています。
注:このコマンドを再利用して、転送ルールを設定できます。 変数をリセットします PORT, PUBLIC_IP, CONTAINER_IP と IFACE 行の先頭に。 ハイライトされた値を変更するだけです。
次に、IPTablesルールを一覧表示します。
- 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 ローカルマシンからコマンドを実行して接続をテストします。
- 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 パッケージ:
- sudo apt install iptables-persistent
パッケージをインストールすると、アプリケーションは現在のファイアウォールルールを保存するように要求します。 現在のすべてのルールを受け入れて保存します。
マシンを再起動すると、ファイアウォールルールが読み込まれます。 さらに、LXDコンテナのNginxサービスが自動的に再起動します。
LXDが正常に構成されました。 最後のステップでは、サービスを停止して破棄する方法を学習します。
ステップ5—LXDを使用したコンテナの停止と削除
コンテナを削除して削除することを決定できます。 このステップでは、コンテナを停止して削除します。
まず、コンテナを停止します。
- lxc stop webserver
使用 lxc list ステータスを確認するコマンド:
- lxc list
コンテナの状態が次のようになっていることがわかります STOPPED:
Output+-----------+---------+------+------+------------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+-----------+---------+------+------+------------+-----------+
| webserver | STOPPED | | | PERSISTENT | 0 |
+-----------+---------+------+------+------------+-----------+
コンテナを削除するには、 lxc delete:
- lxc delete webserver
ランニング lxc list 再び、実行中のコンテナがないことを示しています。
- lxc list
コマンドは以下を出力します:
+------+-------+------+------+------+-----------+
| 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
1 DNAT tcp -- anywhere your_server_ip tcp dpt:http /* forward to the Nginx container */ to:your_container_ip
その行番号を使用して、ルールを削除します。
- sudo iptables -t nat -D PREROUTING 1
削除を確実にするために、ルールを再度リストします。
- sudo iptables -t nat -L PREROUTING --line-numbers
ルールが削除されます:
OutputChain PREROUTING (policy ACCEPT)
num target prot opt source destination
サーバーを再起動したときにルールが戻らないように、変更を保存します。
- sudo netfilter-persistent save
これで、独自の設定で別のコンテナを起動し、トラフィックを転送するための新しいファイアウォールルールを追加できます。
結論
このチュートリアルでは、LXDをインストールして構成しました。 次に、LXDコンテナ内で実行されているNginxを使用してWebサイトを作成し、IPtablesで公開しました。
ここから、それぞれが独自のコンテナに限定されたより多くのWebサイトを構成し、リバースプロキシを使用してトラフィックを適切なコンテナに転送できます。 チュートリアルUbuntu16.04でLXDを使用してNginxとHAProxyで複数のWebサイトをホストする方法では、そのセットアップについて説明します。
LXDの使用方法の詳細については、LXDリファレンスドキュメントを参照してください。
LXDで練習するには、オンラインでLXDを試して、Webベースのチュートリアルに従ってください。
LXDのユーザーサポートを利用するには、LXDディスカッションフォーラムにアクセスしてください。