2 Linuxコンテナの管理

警告:

Oracle Linux 7は現在延長サポート中です。詳細は、Oracle Linux拡張サポートおよびOracleオープン・ソース・サポート・ポリシーを参照してください。

できるだけ早くアプリケーションとデータをOracle Linux 8またはOracle Linux 9に移行してください。

この章では、組織のニーズとプリファレンスに応じてLinuxコンテナを構成およびカスタマイズする様々な方法について説明します。

ノート:

このドキュメント全体を通して、特に指定されていないかぎり、ホストシステムで提供されているすべてのコマンドを実行する必要があります。

オペレーティング・システム・コンテナの構成

次以降の項では、Oracle Linux yumサーバーのパッケージからインストールされたルート・ファイル・システムのコピーを含むLinuxコンテナを設定する方法について説明します。

ソフトウェアのインストールおよび構成

  1. btrfs-progsパッケージをインストールします。
    sudo yum install btrfs-progs
  2. lxcおよびwgetパッケージをインストールします。
    sudo yum install lxc wget

    このコマンドは、必要なパッケージをすべてインストールします。LXCテンプレート・スクリプトは、/usr/share/lxc/templatesにインストールされます。LXCは、wgetを使用して、パッケージをOracle Linux yumサーバーからダウンロードします。

  3. LXCネットワーク管理サービスlxc-netを起動し、ブート時にサービスが開始するように構成します。
    sudo systemctl start lxc-net.service
    sudo systemctl enable lxc-net.service

    LXCには、コンテナのネットワーク・ブリッジングをサポートする独自のネットワーク管理サービスが含まれています。

  4. LXCヘッダー・ファイルおよびライブラリを必要とするアプリケーションをコンパイルする場合は、lxc-develパッケージをインストールします。
    sudo yum install lxc-devel

コンテナのファイル・システムの設定

ノート:

LXCテンプレート・スクリプトでは、コンテナが/containerに作成されると仮定します。システムの構成がこの仮定と異なる場合、スクリプトを編集する必要があります。

  1. /dev/sdbなど、適切にサイズ調整されたデバイス上でbtrfsファイル・システムを作成します。
    sudo mkfs.btrfs /dev/sdb
  2. /containerファイル・システムをマウントします。/containerディレクトリは、LXCのインストール時に自動的に作成されます。
    sudo mount /dev/sdb /container
  3. /etc/fstabファイルに/containerのエントリを追加します。
    /dev/sdb      /container    btrfs    defaults   0 0

詳細は、Oracle Linux 7: ファイル・システムの管理のBtrfsファイル・システムについてを参照してください。

コンテナの作成および起動

ノート:

この項の手順では、/usr/share/lxc/templatesにある、Oracle Linux(lxc-oracle)用のLXCテンプレート・スクリプトを使用します。

Oracle Linuxコンテナは、最低でも400MBのディスク容量を必要とします。

  1. lxc-oracleテンプレート・スクリプトを使用してol6ctr1というOracle Linux 6コンテナを作成します。
    sudo lxc-create -n ol6ctr1 -B btrfs -t oracle -- --release=6.latest
    Host is OracleEverything 7.0
    Create configuration file /container/ol6ctr1/config
    Yum installing release 6.latest for x86_64
      .
      .
      .
      yum-metadata-parser.x86_64 0:1.1.2-16.el6                                     
      zlib.x86_64 0:1.2.3-29.el6                                                    
    
    Complete!
    Rebuilding rpm database
    Patching container rootfs /container/ol6ctr1/rootfs for Oracle Linux 6.5
    Configuring container for Oracle Linux 6.5
    Added container user:oracle password:oracle
    Added container user:root password:root
    Container : /container/ol6ctr1/rootfs
    Config    : /container/ol6ctr1/config
    Network   : eth0 (veth) on lxcbr0

    ノート:

    LXCバージョン1.0以上で、btrfsのスナップショット機能を使用する場合は、-B btrfsオプションを指定する必要があります。詳細は、lxc-create(1)マニュアル・ページを参照してください。

    lxc-createコマンドによって、テンプレート・スクリプトlxc-oracleが実行され、ルート・ファイル・システムとしてbtrfsサブボリューム/container/ol6ctr1/rootfsを持つ/container/ol6ctr1にコンテナが作成されます。コマンドは、次にyumを使用して、Oracle Linux yumサーバーからOracle Linux 6の使用可能な最新の更新をインストールします。また、コンテナの構成設定を/container/ol6ctr1/configファイルに、そのfstabファイルを/container/ol6ctr1/fstabに書き込みます。コンテナのデフォルト・ログ・ファイルは/container/ol6ctr1/ol6ctr1.logです。

    lxc-createには、--オプションの後に、次のテンプレート・オプションを指定できます。

    -a | --arch=i386|x86_64

    アーキテクチャを指定します。デフォルト値は、ホストのアーキテクチャです。

    --baseurl=pkg_repo

    パッケージ・リポジトリのファイルURIを指定します。また、次のように--archオプションと--releaseオプションを使用して、アーキテクチャとリリースも指定する必要があります。

    mount -o loop OracleLinux-R7-GA-Everything-x86_64-dvd.iso /mnt
    lxc-create -n ol70beta -B btrfs -t oracle -- -R 7.0 -a x86_64 --baseurl=file:///mnt/Server
    -P | --patch=path

    指定したパスのrootfsにパッチを適用します。

    --privileged[=rt]

    /proc階層下の特定のカーネル・パラメータの値を調整できます。

    コンテナは、権限ファイルを使用して、いくつかの例外を除き、/proc読取り専用をマウントします。Oracle Linuxコンテナのカーネル・パラメータ設定の構成を参照してください。

    このオプションによりCAP_SYS_NICE機能も有効になり、ネガティブなnice値(スケジューリングに適しています)を設定することで、コンテナ内から処理ができます。

    =rt (リアルタイム)修飾子を指定すると、コンテナの構成ファイル内またはコンテナの起動時に、lxc.cgroup.cpu.rt_runtime_us設定を構成できます。この設定は、cpu.rt_period_usのシステム全体の値によって設定された基本期間からコンテナがCPUリソースにアクセスできる最大継続期間(マイクロ秒)を指定します。それ以外の場合、コンテナはcpu.rt_runtime_usのシステム全体の値を使用し、消費するCPUリソースが多くなりすぎる可能性があります。また、この修飾子は、コンテナの再起動によって、すべてのプロセスの終了、およびクリーンな状態への起動が確実に行われるようにします。

    -R | --release=major.minor

    インストールするOracleリリースのメジャー・リリース番号とマイナー更新番号を指定します。majorの値は、4、5、6または7に設定できます。minorlatestを指定すると、利用できる最新のメジャー・リリースのリリース・パッケージがインストールされます。ホストがOracle Linuxを実行している場合、デフォルト・リリースはホストにインストールされているリリースと同じです。それ以外の場合、デフォルト・リリースは、Oracle Linux 6の最新の更新です。

    -r | --rpms=rpm_name

    指定したRPMをコンテナにインストールします。

    -t | --templatefs=rootfs

    既存のシステム、コンテナまたはコピーしたいOracle VMテンプレートのルート・ファイル・システムへのパスを指定します。このオプションは、他のテンプレート・オプションとともに指定しないでください。追加コンテナの作成を参照してください。

    -u | --url=repo_URL

    Oracle Public Yum以外のYumリポジトリを指定します。たとえば、ローカルYumサーバーからインストールを実行する場合があります。リポジトリ・ファイルは、コンテナのルート・ファイル・システムの、/etc/yum.repos.dに構成されます。デフォルトのURLはhttps://yum.oracle.comです。

  2. コンテナの追加のコピーを初期状態で作成したい場合、コンテナのルート・ファイル・システムのスナップショットを作成します。たとえば:

    sudo btrfs subvolume snapshot /container/ol6ctr1/rootfs /container/ol6ctr1/rootfs_snap

    Oracle®Linux 7: ファイル・システムの管理のBtrfsファイル・システムについておよび追加コンテナの作成を参照してください。

  3. デフォルト・ログ・ファイル以外のログ・ファイルに診断出力を書き込むデーモンとしてコンテナol6ctr1を起動します。
    sudo lxc-start -n ol6ctr1 -d -o /container/ol6ctr1_debug.log -l DEBUG

    ノート:

    -dオプションを省略すると、コンテナのコンソールは現在のシェル内で開きます。

    使用できるロギング・レベルは、FATALCRITWARNERRORNOTICEINFO、およびDEBUGです。すべてのlxc-*コマンドにロギング・レベルを設定できます。

    ホスト・システム上でps -ef --forestコマンドを実行し、lxc-startプロセス以下のプロセス・ツリーに、/usr/sbin/sshdおよび/sbin/mingettyプロセスがコンテナで起動したことが示されたら、ホストからコンテナにログインできます。コンテナへのログインを参照してください。

lxc-oracleテンプレート・スクリプトについて

ノート:

テンプレート・スクリプトを修正すると、それ以降そのスクリプトから作成するすべてのコンテナの構成ファイルが変更されます。コンテナのconfigファイルを修正すると、そのコンテナに加えて、それ以降にクローニングを行うすべてのコンテナの構成が変更されます。

lxc-oracleテンプレート・スクリプトでは、実行中のコンテナに割り当てられる次のようなシステム設定とリソースが定義されます。

  • oracleユーザーとrootユーザーのデフォルト・パスワードで、それぞれoracleおよびrootに設定されています

  • ホスト名(lxc.utsname)で、コンテナの名前に設定されています

  • 使用可能なターミナルの数(lxc.tty)で、4に設定されています

  • ホスト上のコンテナのルート・ファイル・システムの場所(lxc.rootfs)

  • fstabマウント構成ファイルの場所(lxc.mount)

  • コンテナで使用できないすべてのシステム機能(lxc.cap.drop)

  • ローカル・ネットワーク・インタフェース構成(lxc.network)

  • 許可されるすべてのcgroupデバイス(lxc.cgroup.devices.allow)

テンプレート・スクリプトは、仮想ネットワーク・タイプ(lxc.network.type)とブリッジ(lxc.network.link)を、vethlxcbr0に設定します。外部システムがネットワークを介してコンテナにアクセスできるようにするmacvlanブリッジまたは仮想イーサネット・ポート・アグリゲータを使用する場合、コンテナの構成ファイルを変更する必要があります。vethとmacvlanについておよびmacvlanを使用するためのコンテナの変更を参照してください。

セキュリティを強化するには、lxc.cap.drop機能を非コメント化して、コンテナでrootが特定のアクションを実行しないようにします。たとえば、sys_admin機能を削除すると、rootがコンテナのfstabエントリを書込み可能として再マウントすることを防げます。ただし、sys_adminを削除すると、コンテナですべてのファイル・システムをマウントできず、hostnameコマンドが無効になります。デフォルトで、テンプレート・スクリプトでは、次の機能が削除されます: mac_adminmac_overridesetfcapsetpcapsys_modulesys_nicesys_pacctsys_rawioおよびsys_time

詳細は、capabilities(7)およびlxc.conf(5)の各マニュアル・ページを参照してください。

コンテナを作成すると、テンプレート・スクリプトにより、コンテナの構成設定とマウント構成が/container/name/configおよび/container/name/fstabに書き込まれ、コンテナのルート・ファイル・システムが/container/name/rootfs配下に設定されます。

クローンに既存のルート・ファイル・システムを指定しないかぎり、テンプレート・スクリプトにより、rootfsに次のパッケージが(デフォルトでは、https://yum.oracle.comのOracle Linux Yum Serverから)インストールされます。

  • chkconfig: /etc/rc*.d階層を維持するためのchkconfigユーティリティ。

  • dhclient: DHCPクライアント・デーモン(dhclient)とdhclient-script

  • initscripts: /etc/inittabファイルと/etc/init.dスクリプト。

  • openssh-server: オープン・ソースのSSHサーバー・デーモン(/usr/sbin/sshd)。

  • oraclelinux-release: Oracle Linuxのリリースと情報ファイル。

  • passwd: PAMを使用してパスワードを設定または変更するためのpasswdユーティリティ。

  • policycoreutils: SELinuxポリシー・コア・ユーティリティ。

  • rootfiles: rootユーザーが必要とする基本ファイル。

  • rsyslog: 強化されたシステム・ロギング・デーモンおよびカーネル・メッセージ・トラップ・デーモン。

  • vim-minimal: VIMエディタの最小バージョン。

  • yum: RPMパッケージをインストール、更新および管理するためのyumユーティリティ。

テンプレート・スクリプトは、コンテナのネットワークを設定し、ボリューム管理(LVM)、デバイス管理(udev)、ハードウェア・クロック、readaheadおよびPlymouthブート・システムなどの不必要なサービスを無効にするための、rootfs配下のシステム構成ファイルを編集します。

vethとmacvlanについて

デフォルトでは、lxc-oracleテンプレート・スクリプトは、vethブリッジを設定することによってネットワークを設定します。このモードでは、コンテナは、lxc-netサービスがコンテナとホストの間のプライベート仮想ブリッジ・ネットワーク(lxcbr0)上で実行しているdnsmasqサーバーからIPアドレスを取得します。このホストでは、コンテナはiptablesのNATルールを使用してネットワークの残りの部分に接続できますが、これらのルールではコンテナへの着信接続はできません。vethブリッジ上のホストと他のコンテナは、どちらもブリッジを介してコンテナに対してネットワーク・アクセスします。

図2-1に、vethブリッジlxcbr0を介して接続されている2つのコンテナを持つホスト・システムを示します。

図2-1 vethブリッジを使用しているコンテナのネットワーク構成


この図は、vethブリッジlxcbr0を介して接続されている2つのコンテナを持つホスト・システムを示しています。このホストは、NATルールを使用して、コンテナがeth0経由でネットワークの残りの部分に接続することを可能にしますが、これらのルールではコンテナへの着信接続はできません。

ネットワーク接続がホスト外部からコンテナ経由で接続できるようにしたい場合、コンテナはホストと同じネットワーク上のIPアドレスを持つ必要があります。この構成を実現する方法の1つは、macvlanブリッジを使用して、コンテナのための独立した論理ネットワークを作成することです。このネットワークは、実質的には、ホストのネットワーク・インタフェースに接続されたローカル・ネットワークの拡張です。外部システムは、まるでネットワーク上の独立したシステムであるかのようにコンテナにアクセスでき、コンテナは、ブリッジ上に構成された他のコンテナや外部のシステムへのネットワーク・アクセスを持っています。コンテナは、ローカル・ネットワーク上の外部DHCPサーバーからIPアドレスを取得することもできます。ただし、vethブリッジとは異なり、ホスト・システムは、コンテナへのネットワーク・アクセスを持っていません。

図2-2に、macvlanブリッジを介して接続されている2つのコンテナを持つホスト・システムを示します。

図2-2 macvlanブリッジを使用しているコンテナのネットワーク構成


この図は、macvlanブリッジを介して接続されている2つのコンテナを持つホスト・システムを示しています。このブリッジは、実質的に、eth0を介して接続されているネットワークの拡張です。

コンテナがネットワーク上で互いを認識できないようにするには、macvlanの仮想イーサネット・ポート・アグリゲータ(VEPA)モードを構成します。図2-3に、macvlan VEPAにより別々にネットワークに接続されている2つのコンテナを持つホスト・システムを示します。各コンテナは実質的にネットワークに直接接続されますが、どちらのコンテナもネットワーク経由で他のコンテナやホストにアクセスできません。

図2-3 macvlan VEPAを使用しているコンテナのネットワーク構成


図は、macvlan VEPAにより別々にネットワークに接続されている2つのコンテナを持つホスト・システムを示しています。

macvlanの構成の詳細は、macvlanを使用するためのコンテナの変更と、lxc.conf(5)のマニュアル・ページを参照してください。

macvlanを使用するためのコンテナの変更

ブリッジまたはmacvlanのVEPAモードを使用するようにコンテナを変更するには、/container/name/configを編集して、次の行を上書きします。

lxc.network.type = veth
lxc.network.link = lxcbr0
lxc.network.flags = up

ブリッジ・モードの場合は次のように上書きします:

lxc.network.type = macvlan
lxc.network.macvlan.mode = bridge
lxc.network.flags = up
lxc.network.link = eth0

VEPAモードの場合は次のように上書きします:

lxc.network.type = macvlan
lxc.network.macvlan.mode = vepa
lxc.network.flags = up
lxc.network.link = eth0

これらのサンプル構成で、lxc.network.linkの設定では、コンテナのネットワーク・インタフェースが、ホストのeth0インタフェース経由でアクセスできるネットワーク上で認識できるようにすることを想定しています。

静的IPアドレスを使用するためのコンテナの変更

デフォルトでは、macvlanによって接続されているコンテナは、ローカル・ネットワーク上のDHCPサーバーからIPアドレスを取得します。コンテナにサーバーの動作をさせる場合、通常は静的IPアドレスを構成します。コンテナに静的IPアドレスを提供するようにDHCPを構成することも、コンテナのconfigファイル内でアドレスを定義することもできます。

DHCPを使用してコンテナが取得しない静的IPアドレスを構成するには:

  1. /container/name/rootfs/etc/sysconfig/network-scripts/ifcfg-iface (ifaceはネットワーク・インタフェースの名前)を編集し、次の行を変更します。

    BOOTPROTO=dhcp

    変更後:

    BOOTPROTO=none
  2. /container/name/configファイルに次の行を追加します。

    lxc.network.ipv4 = xxx.xxx.xxx.xxx/prefix_length

    前の例では、xxx.xxx.xxx.xxx/prefix_lengthは、コンテナのIPアドレス(CIDR形式)です。例: 192.168.56.100/24

    ノート:

    アドレスは、ネットワーク上で使用中であったり、DHCPサーバーによって別のシステムに割り当てられる候補であったりしてはなりません。

    コンテナによって提供されるネットワーク・サービスへのアクセスを許可するようにホスト上のファイアウォールを構成することが必要になる場合もあります。

コンテナへのログイン

lxc-consoleコマンドを使用して実行中のコンテナにログインできます。
sudo lxc-console -n name [-t tty_number]

tty番号を指定しない場合は、最初に利用できるターミナルにログインします。

たとえば、ol6ctr1上のターミナルにログインするには、次のように入力します。
sudo lxc-console -n ol6ctr1

lxc-consoleセッションを終了するには、[Ctrl]+[A][Q]の順に入力します。

また、lxc-0.9.0-2.0.5パッケージ(またはこのパッケージの以降のバージョン)をインストールする場合は、sshを使用してコンテナにログインできます。

ノート:

lxc-consoleを使用したログインを可能にするには、コンテナでターミナルの/sbin/mingettyプロセスを実行している必要があります。同様に、sshを使用する場合、コンテナでSSHデーモン(/usr/sbin/sshd)を実行している必要があります。

追加コンテナの作成

既存のコンテナをクローニングするには、この例に示すように、lxc-cloneコマンド\を使用します。

sudo lxc-clone -o ol6ctr1 -n ol6ctr2
別の方法として、lxc-createコマンドを使用して、既存のシステムからルート・ファイル・システム、コンテナまたはOracle VMテンプレートをコピーすることによってコンテナを作成できます。--templatefsテンプレート・オプションの引数として、ルート・ファイル・システムのパスを指定します。
sudo lxc-create -n ol6ctr3 -B btrfs -t oracle -- --templatefs=/container/ol6ctr1/rootfs_snap

この例は、新しいコンテナのrootfsを、コンテナol6ctr1に属するrootfsのスナップショットからコピーします。追加のコンテナは/container/ol6ctr3に作成され、新しいrootfsスナップショットが/container/ol6ctr3/rootfsに作成されます。

ノート:

LXCバージョン1.0以上で、btrfsのスナップショット機能を使用する場合は、-B btrfsオプションを指定する必要があります。詳細は、lxc-create(1)マニュアル・ページを参照してください。

コンテナのホスト名を変更するには、/container/name/rootfs/etc/sysconfig/networkおよび/container/name/rootfs/etc/sysconfig/network-scripts/ifcfg-ifaceHOSTNAME設定を編集します。ここでifaceはネットワーク・インタフェースの名前です(eth0など)。

コンテナの監視および停止

構成されているコンテナを表示するには、lxc-lsコマンドを使用します。

sudo lxc-ls
ol6ctr1
ol6ctr2 

ホスト・システム上で動作しているコンテナを表示するには、--activeオプションを指定します。

sudo lxc-ls --active
ol6ctr1 
コンテナの状態を表示するには、ホストでlxc-infoコマンドを使用します。
sudo lxc-info -n ol6ctr1
Name:           ol6ctr1
State:          RUNNING
PID:            5662
IP:             192.168.122.188
CPU use:        1.63 seconds
BlkIO use:      18.95 MiB
Memory use:     11.53 MiB
KMem use:       0 bytes
Link:           vethJHU5OA
 TX bytes:      1.42 KiB
 RX bytes:      6.29 KiB
 Total bytes:   7.71 KiB

コンテナの状態は、ABORTINGRUNNINGSTARTINGSTOPPEDまたはSTOPPINGのいずれかです。lxc-infoによってコンテナがRUNNING状態であると表示されても、/usr/sbin/sshdまたは/sbin/mingettyプロセスがコンテナで起動していなければ、ログインすることはできません。コンテナでinitまたはsystemdプロセスが最初にネットワーキングおよび構成済の他の様々なサービスを開始する時間を考慮しておく必要があります。

ホストからコンテナのプロセスの状態を表示するには、ps -ef --forestを実行してlxc-startプロセス以下のプロセス・ツリーを確認するか、lxc-attachコマンドを使用してコンテナ内でpsコマンドを実行します。

sudo ps -ef --forest
UID   PID   PPID  C STIME TTY    TIME     CMD
...
root  3171     1  0 09:57 ?      00:00:00 lxc-start -n ol6ctr1 -d
root  3182  3171  0 09:57 ?      00:00:00  \_ /sbin/init
root  3441  3182  0 09:57 ?      00:00:00      \_ /sbin/dhclient -H ol6ctr1 ...
root  3464  3182  0 09:57 ?      00:00:00      \_ /sbin/rsyslogd ...
root  3493  3182  0 09:57 ?      00:00:00      \_ /usr/sbin/sshd
root  3500  3182  0 09:57 pts/5  00:00:00      \_ /sbin/mingetty ... /dev/console
root  3504  3182  0 09:57 pts/1  00:00:00      \_ /sbin/mingetty ... /dev/tty1
root  3506  3182  0 09:57 pts/2  00:00:00      \_ /sbin/mingetty ... /dev/tty2
root  3508  3182  0 09:57 pts/3  00:00:00      \_ /sbin/mingetty ... /dev/tty3
root  3510  3182  0 09:57 pts/4  00:00:00      \_ /sbin/mingetty ... /dev/tty4
...
sudo lxc-attach -n ol6ctr1 -- /bin/ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  19284  1516 ?        Ss   04:57   0:00 /sbin/init
root       202  0.0  0.0   9172   588 ?        Ss   04:57   0:00 /sbin/dhclient
root       225  0.0  0.1 245096  1332 ?        Ssl  04:57   0:00 /sbin/rsyslogd
root       252  0.0  0.1  66660  1192 ?        Ss   04:57   0:00 /usr/sbin/sshd
root       259  0.0  0.0   4116   568 lxc/console Ss+ 04:57   0:00 /sbin/mingett
root       263  0.0  0.0   4116   572 lxc/tty1 Ss+  04:57   0:00 /sbin/mingetty
root       265  0.0  0.0   4116   568 lxc/tty2 Ss+  04:57   0:00 /sbin/mingetty
root       267  0.0  0.0   4116   572 lxc/tty3 Ss+  04:57   0:00 /sbin/mingetty
root       269  0.0  0.0   4116   568 lxc/tty4 Ss+  04:57   0:00 /sbin/mingetty
root       283  0.0  0.1 110240  1144 ?        R+   04:59   0:00 /bin/ps aux

ヒント:

コンテナが正しく起動しているように見えない場合、ホストからそのプロセス・ツリーを調査すると、通常、問題の所在がわかります。

ol6ctrlなどのコンテナにログインしている場合、ps -efコマンドによる出力は次の例のようになります。
sudo ps -ef
UID   PID  PPID  C STIME TTY          TIME CMD
root    1     0  0 11:54 ?        00:00:00 /sbin/init
root  193     1  0 11:54 ?        00:00:00 /sbin/dhclient -H ol6ctr1 ...
root  216     1  0 11:54 ?        00:00:00 /sbin/rsyslogd -i ...
root  258     1  0 11:54 ?        00:00:00 /usr/sbin/sshd
root  265     1  0 11:54 lxc/console 00:00:00 /sbin/mingetty ... /dev/console
root  271     1  0 11:54 lxc/tty2 00:00:00 /sbin/mingetty ... /dev/tty2
root  273     1  0 11:54 lxc/tty3 00:00:00 /sbin/mingetty ... /dev/tty3
root  275     1  0 11:54 lxc/tty4 00:00:00 /sbin/mingetty ... /dev/tty4
root  297     1  0 11:57 ?        00:00:00 login -- root
root  301   297  0 12:08 lxc/tty1 00:00:00 -bash
root  312   301  0 12:08 lxc/tty1 00:00:00 ps -ef
プロセス番号がホストの同じプロセスの番号とは異なっており、それらはすべてコンテナのプロセス1 (/sbin/init)の下位にあることに注意してください。
コンテナの実行を一時停止または再開するには、ホスト・システムでlxc-freezeおよびlxc-unfreezeコマンドを使用します。
sudo lxc-freeze -n ol6ctr1
sudo lxc-unfreeze -n ol6ctr1

ホストからは、--nokillオプションを指定してlxc-stopコマンドを使用することで、コンテナを正しい手順でシャットダウンできます。

sudo lxc-stop --nokill -n ol6ctr1
別の方法として、ol6ctrlコンテナへのログイン中に、haltなどのコマンドを実行できます。
sudo halt
Broadcast message from root@ol6ctr1
	(/dev/tty2) at 22:52 ...

The system is going down for halt NOW!
lxc-console: Input/output error - failed to read

例に示すとおり、ホストのシェル・プロンプトに戻ります。

プロセスを即座に終了してコンテナをシャットダウンするには、ホストでlxc-stopコマンドを-kオプションを指定して使用します。
sudo lxc-stop -k -n ol6ctr1

コンテナの動作をデバッグする場合、通常はコンテナを破棄してテンプレート・スクリプトの変更後に新しいバージョンを作成するため、これが最も簡単な方法です。

コンテナの状態を監視するには、lxc-monitorコマンドを使用します。
sudo lxc-monitor -n ol6ctr1
'ol6ctr1' changed state to [STARTING]
'ol6ctr1' changed state to [RUNNING]
'ol6ctr1' changed state to [STOPPING]
'ol6ctr1' changed state to [STOPPED]
コンテナが指定した状態に変更されるのを待機するには、lxc-waitコマンドを使用します。
sudo lxc-wait -n $CTR -s ABORTING && lxc-wait -n $CTR -s STOPPED && echo "Container $CTR terminated with an error."

実行中のコンテナ内でのコマンドの開始

ノート:

lxc-attachコマンドは、lxc-0.9.0-2.0.4パッケージ以降のUEK R3でサポートされています。

ホスト・システムからは、lxc- attachを使用することで、次のように、すでに実行されているコンテナ内で任意のコマンドを実行できます。

sudo lxc-attach -n ol6ctr1 -- /bin/ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  19284  1516 ?        Ss   04:57   0:00 /sbin/init
root       202  0.0  0.0   9172   588 ?        Ss   04:57   0:00 /sbin/dhclient
root       225  0.0  0.1 245096  1332 ?        Ssl  04:57   0:00 /sbin/rsyslogd
root       252  0.0  0.1  66660  1192 ?        Ss   04:57   0:00 /usr/sbin/sshd
root       259  0.0  0.0   4116   568 lxc/console Ss+ 04:57   0:00 /sbin/mingett
root       263  0.0  0.0   4116   572 lxc/tty1 Ss+  04:57   0:00 /sbin/mingetty
root       265  0.0  0.0   4116   568 lxc/tty2 Ss+  04:57   0:00 /sbin/mingetty
root       267  0.0  0.0   4116   572 lxc/tty3 Ss+  04:57   0:00 /sbin/mingetty
root       269  0.0  0.0   4116   568 lxc/tty4 Ss+  04:57   0:00 /sbin/mingetty
root       283  0.0  0.1 110240  1144 ?        R+   04:59   0:00 /bin/ps aux

詳細は、lxc-attach(1)マニュアル・ページを参照してください。

コンテナ・リソースの制御

Linuxコンテナでは、その実装でcgroupを使用しており、lxc-cgroupコマンドを使用して、コンテナによる他のコンテナを基準とするシステム・リソースへのアクセスを制御できます。たとえば、コンテナを実行できるCPUコアを表示するには、次のコマンドを入力します。

ノート:

このセクションのコマンドはホスト・システムから実行します。

sudo lxc-cgroup -n ol6ctr1 cpuset.cpus
0-7
コンテナをコア0および1に制限するには、次のようなコマンドを入力します。
sudo lxc-cgroup -n ol6ctr1 cpuset.cpus 0,1
コンテナのCPU時間およびブロックI/Oアクセスの共有を変更するには、次のように入力します。
sudo lxc-cgroup -n ol6ctr2 cpu.shares 256
sudo lxc-cgroup -n ol6ctr2 blkio.weight 500

システムでメモリー競合または低メモリーが検出された場合はコンテナを256MBのメモリーに制限し、それ以外の場合は強い制限を512MBに設定します。

sudo lxc-cgroup -n ol6ctr2 memory.soft_limit_in_bytes 268435456
sudo lxc-cgroup -n ol6ctr2 memory.limit_in_bytes 53687091
コンテナの構成に対する変更を永続化するには、次のようにファイル/container/name/configに設定を追加します。
# Permanently tweaked resource settings
lxc.cgroup.cpu.shares=256
lxc.cgroup.blkio.weight=500 

制御できるリソースの詳細は、https://www.kernel.org/doc/html/latest/にあるLinuxカーネルのドキュメントを参照してください。

Oracle Linuxコンテナのulimit設定の構成

コンテナのulimit設定は、そのコンテナのバージョンの/etc/security/limits.conf/で指定されているmemlocknofileなどのulimit設定の値を適用します(これらの値がホスト・システム上の値以下である場合)。

memlockおよびnofileの値は、ユーザー・プロセスによってメモリーにロックできるアドレス空間の最大量(KB単位)およびユーザー・プロセスによって同時に開くことができる最大ファイル・ディスクリプタ数を決定します。

コンテナに対してより大きなulimit値が必要な場合は、次のようにホスト上の/etc/security/limits.confの設定の値を大きくします。

#<domain>      <type>  <item>         <value>
*              soft    memlock       1048576
*              hard    memlock       2097152
*              soft    nofile        5120
*              hard    nofile        10240

プロセスは、シェルの組込みコマンドulimitまたはsetrlimit()システム・コールを使用して、シェルの現在の制限をソフト制限より上に上げることができます。ただし、新しい値は、プロセスがrootによって所有されている場合を除き、ハード制限を超えることはできません。

ulimitを使用して、ホスト上またはコンテナ内から現在のソフト値およびハード値を設定または表示できます。

echo "host: nofile = $(ulimit -n)"
host: nofile = 1024
echo "host: nofile = $(ulimit -H -n)"
host: nofile = 4096
sudo ulimit -n 2048
echo "host: nofile = $(ulimit -n)"
host: nofile = 2048
sudo lxc-attach -n ol6ctr1 -- echo "container: nofile = $(ulimit -n)"
container: nofile = 1024

ノート:

ログアウトしてから再度ログインし、可能ならば、ulimitの新しいソフト値およびハード値を使用するシェルでコンテナを起動する前にホストを再起動します。

Oracle Linuxコンテナのカーネル・パラメータ設定の構成

--privilegedオプションをlxc-oracleテンプレート・スクリプトに指定すると、/proc階層化にあるコンテナの特定のカーネル・パラメータの値を調整できます。

コンテナは、/proc読取り専用をマウントしますが、書き込み可能な次のパラメータは例外です。

  • /proc/sys/kernel/msgmax

  • /proc/sys/kernel/msgmnb

  • /proc/sys/kernel/msgmni

  • /proc/sys/kernel/sem

  • /proc/sys/kernel/shmall

  • /proc/sys/kernel/shmmax

  • /proc/sys/kernelshmmni

  • /proc/sys/net/ipv4/conf/default/accept_source_route

  • /proc/sys/net/ipv4/conf/default/rp_filter

  • /proc/sys/net/ipv4/ip_forward

これらの各パラメータには、ホスト・システム用に構成した値やホスト・システム上で実行中の他のコンテナとは異なる値を設定できます。デフォルト値は、コンテナ作成時にテンプレートから導出されます。アプリケーションでデフォルト値以外の値が必要になった場合にのみ、設定を変更することをお薦めします。

ノート:

UEK R3 QU6より以前では、次のホスト専用パラメータは、カーネル制限のためコンテナ内に表示されませんでした。

  • /proc/sys/net/core/rmem_default

  • /proc/sys/net/core/rmem_max

  • /proc/sys/net/core/wmem_default

  • /proc/sys/net/core/wmem_max

  • /proc/sys/net/ipv4ip_local_port_range

  • /proc/sys/net/ipv4/tcp_syncookies

UEK R3 QU6以降では、これらのパラメータはコンテナ内の読取り専用で、Oracle Databaseおよびその他のアプリケーションをインストールできます。これらのパラメータの値は、ホスト側からのみ変更できます。ホスト専用パラメータに対する変更は、ホスト上のすべてのコンテナに適用されます。

コンテナの削除

コンテナとそのスナップショットを削除するには、次の例に示すとおり、ホスト・システムでlxc-destroyコマンドを使用します。
sudo lxc-destroy -n ol6ctr2
Delete subvolume '/container/ol6ctr2/rootfs'

このコマンドは、rootfsサブボリュームも削除します。

アプリケーション・コンテナの実行

lxc-executeコマンドを使用して、システムの他の部分から効果的に分離された一時アプリケーション・コンテナを作成し、そこでコマンドを実行できます。たとえば次のコマンドでは、sleepを100秒間実行するguestという名前のアプリケーション・コンテナが作成されます。

sudo lxc-execute -n guest -- sleep 100

コンテナがアクティブな間は、別のウィンドウからlxc-ls --activeおよびlxc-info -n guestなどのコマンドを実行して監視できます。

sudo lxc-ls --active
sudo lxc-ls --active
guest
sudo lxc-info -n guest
Name:           guest
State:          RUNNING
PID:            11220
CPU use:        0.02 seconds
BlkIO use:      0 bytes
Memory use:     544.00 KiB
KMem use:       0 bytes

アプリケーション・コンテナをカスタマイズする必要がある場合は、構成ファイルを使用できます。たとえば、コンテナのネットワーク構成またはマウントされるシステム・ディレクトリを変更できます。

次の例は、init.lxcと特定のライブラリ・パスおよびバイナリ・ディレクトリ・パスを使用可能にするマウント・エントリの場合を除き、rootfsがほとんど共有されていないサンプルの構成ファイルからの設定を示しています。
lxc.utsname = guest
lxc.tty = 1
lxc.pts = 1
lxc.rootfs = /tmp/guest/rootfs
lxc.mount.entry=/usr/lib usr/lib none ro,bind 0 0
lxc.mount.entry=/usr/lib64 usr/lib64 none ro,bind 0 0
lxc.mount.entry=/usr/bin usr/bin none ro,bind 0 0
lxc.mount.entry=/usr/sbin usr/sbin none ro,bind 0 0
lxc.cgroup.cpuset.cpus=1

コンテナがホスト・システム上の/usr/sbin/init.lxcにアクセスするには、/usr/sbinのマウント・エントリが必要です。

実際には、アプリケーション・コンテナでマウントするホスト・システム・ディレクトリを、コンテナがアプリケーションを実行するために必要なディレクトリのみに制限する必要があります。

ノート:

システム・コンテナとの競合の可能性を避けるために、/containerディレクトリをアプリケーション・コンテナに使用しないでください。

必要なディレクトリとシンボリック・リンクをrootfsディレクトリの下に構成することも必要です。

sudo TMPDIR=/tmp/guest/rootfs
sudo mkdir -p $TMPDIR/usr/lib $TMPDIR/usr/lib64 $TMPDIR/usr/bin $TMPDIR/usr/sbin \$TMPDIR/dev/pts $TMPDIR/dev/shm $TMPDIR/proc
sudo ln -s $TMPDIR/usr/lib $TMPDIR/lib
sudo ln -s $TMPDIR/usr/lib64 $TMPDIR/lib64
sudo ln -s $TMPDIR/usr/bin $TMPDIR/bin
sudo ln -s $TMPDIR/usr/sbin $TMPDIR/sbin

この例では、構成ファイルに定義されたマウント・ポイント・エントリに加えて/dev/pts/dev/shmおよび/procもディレクトリに含まれています。

次に、-fオプションを使用してlxc-executeに構成ファイル(config)を指定できます。

sudo lxc-execute -n guest -f config /usr/bin/bash

bashプロンプトで、次の一連のコマンドを入力します。

ps -ef
UID    PID  PPID  C STIME TTY          TIME CMD
0      1       0  0 14:17 ?        00:00:00 /usr/sbin/init.lxc -- /usr/bin/bash
0      4       1  0 14:17 ?        00:00:00 /usr/bin/bash
0      5       4  0 14:17 ?        00:00:00 ps -ef
mount
/dev/sda3 on / type btrfs (rw,relatime,seclabel,space_cache)
/dev/sda3 on /usr/lib type btrfs (ro,relatime,seclabel,space_cache)
/dev/sda3 on /usr/lib64 type btrfs (ro,relatime,seclabel,space_cache)
/dev/sda3 on /usr/bin type btrfs (ro,relatime,seclabel,space_cache)
/dev/sda3 on /usr/sbin type btrfs (ro,relatime,seclabel,space_cache)
devpts on /dev/pts type devpts (rw,relatime,seclabel,gid=5,mode=620,ptmxmode=666)
proc on /proc type proc (rw,relatime)
shmfs on /dev/shm type tmpfs (rw,relatime,seclabel)
mqueue on /dev/mqueue type mqueue (rw,relatime,seclabel)
ls -l /
total 16
lrwxrwxrwx.   1 0 0  7 May 21 14:03 bin -> usr/bin
drwxr-xr-x.   1 0 0 52 May 21 14:27 dev
lrwxrwxrwx.   1 0 0  7 May 21 14:03 lib -> usr/lib
lrwxrwxrwx.   1 0 0  9 May 21 14:27 lib64 -> usr/lib64
dr-xr-xr-x. 230 0 0  0 May 21 14:27 proc
lrwxrwxrwx.   1 0 0  8 May 21 14:03 sbin -> usr/sbin
drwxr-xr-x.   1 0 0 30 May 21 12:58 usr
touch /bin/foo
touch: cannot touch '/bin/foo': Read-only file system
echo $?
1

この例では、psコマンドを実行すると、bashinit.lxcの子として実行されることがわかります。mountはコンテナが/usr/libなど読取り専用でマウントする個々のディレクトリを表示し、ls -l /rootfsで設定したシンボリック・リンクを表示します。

読取り専用/binファイル・システムに書き込もうとするとエラーが発生します。同じlxc-executeコマンドを構成ファイルを指定せずに実行すると、コンテナでホストのルート・ファイル・システム全体を読取り/書込みモードで使用できます。

システム・コンテナに関しては、cgroupエントリを構成ファイルに設定し、lxc-cgroupコマンドを使用して、アプリケーション・コンテナがアクセスできるシステム・リソースを制御できます。

ノート:

lxc-executeは、ホストのrootファイル・システムを共有するアプリケーション・コンテナを実行するためのもので、lxc-createを使用して作成するシステム・コンテナを実行するためのものではありません。システム・コンテナを実行するにはlxc-startを使用します。

詳細は、lxc-execute(1)およびlxc.conf(5)の各マニュアル・ページを参照してください。