序章
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グループを取ります。
- 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を構成するときに、次の手順で使用します。
ステップ2—LXDの初期化と構成
LXDは、Ubuntu20.04でスナップパッケージとして利用できます。 プリインストールされていますが、設定する必要があります。
まず、LXDスナップパッケージがインストールされていることを確認します。 コマンド snap list
インストールされているスナップパッケージを表示します:
- 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 packagesName 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
指図:
- sudo lxd init
まず、プログラムは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:20.04 webserver
注:実行すると、利用可能なすべてのUbuntuイメージの完全なリストを見つけることができます lxc image list ubuntu:
およびその他のLinuxディストリビューションを実行して lxc image list images:
. 両方 ubuntu:
と images:
コンテナイメージのリポジトリです。 コンテナイメージごとに、コマンドを使用して詳細情報を取得できます lxc image info ubuntu:20.04
.
コンテナを作成するのはこれが初めてなので、このコマンドはインターネットからコンテナイメージをダウンロードしてキャッシュします。 新しいコンテナのダウンロードが完了すると、次の出力が表示されます。
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 TCP
TCPプロトコルを使用していると言います。-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ディスカッションフォーラムにアクセスしてください。