ytooyamaのブログ

サーバ構築とか、仕事で発見したこととか、趣味のこととかを書いています。

UbuntuのLXCコンテナーでサービスを動かす

Dockerでサービスを動かし、サービスを外部からアクセスする際の手段としてポートフォワードを使う方法があると思います。

runnable.com

qiita.com

じゃあ、これをLXD,LXCでやるとどうやるのという話ですが、lxcコマンドには特にそのようなオプションを指定するものはないようなので、次のようにiptablesで設定すれば良いようです。以下、Ubuntu 16.04.xでLXC,LXDを使う場合を例として説明します。

これくらいの方法、ドキュメント化されているだろうと思ったら全然見つからなかったのでまとめておきます。こういう話ってQiitaに書いたら喜ばれるんだろうか。週末書くかも。

サービスの起動設定

コンテナーはLXC、コンテナーホストの管理はLXDで行うために、LXDサービスを起動しておきます。

host# systemctl start lxd
host# systemctl enable lxd

初期設定

初めて起動する場合は次のように実行してください。詳細はこちら

host# lxd init

コンテナの起動

初回はデプロイ用のコンテナーイメージをダウンロードします。本例はmy-ubuntuという名前のコンテナーにTrustyをインストールします。

host# lxc launch ubuntu:14.04 my-ubuntu
host# lxc list
+-----------+---------+----------------------+------+------------+-----------+
|   NAME    |  STATE  |         IPV4         | IPV6 |    TYPE    | SNAPSHOTS |
+-----------+---------+----------------------+------+------------+-----------+
| my-ubuntu | RUNNING | 10.251.33.235 (eth0) |      | PERSISTENT | 0         |
+-----------+---------+----------------------+------+------------+-----------+

コンテナにApache Webサーバーをインストー

lxc exec my-ubuntu bashと実行してコンテナーにログインしてから実行しても良いですが、次のようにコマンドを渡してホストからコンテナーを制御することもできます。

host# lxc exec my-ubuntu apt update
host# lxc exec my-ubuntu apt install apache2

iptablesの設定

ホスト上でポートフォワードの設定を行います。ホスト:50080にアクセスすると、コンテナーの80ポートにアクセスするように設定するには次のように実行します。Dockerでポートフォワードを設定するときと同様、ポート番号被りに注意します。「DYNAMIC AND/OR PRIVATE PORTS」を使うと良いでしょう。

host# iptables -t nat -A PREROUTING -p tcp -i enp0s5 --dport 50080 -j DNAT --to-destination 10.251.33.235:80
  • 上例「-i enp0s5」がNAT接続に使うNIC。外部と繋がっている側を指定
  • 上例「–dport 50080」が「Host IP:dport」で指定したポートでアクセスできるために必要な設定
  • 上例「–to-destination 10.251.33.235:80」がアクセスした時の実際の行き先

iptablesの設定をセーブ

iptablesの設定をセーブする。永続化したい場合は各自調べてください。

host# iptables-save

ブラウザーでアクセス

この時点で、http://<LXCHostのIPアドレス>:50080/でアクセスすればコンテナー上にインストールしたApache Webサーバーにアクセスできます。

では次に、PHPを追加してみましょう。

host# lxc exec my-ubuntu apt update
host# lxc exec my-ubuntu apt install php5

次のように実行して、テスト用のPHPスクリプトを作成します。

ログイン
host# lxc exec my-ubuntu bash
ファイル作成
my-ubuntu# echo "<?php phpinfo() ?>" > /var/www/html/test.php

ブラウザーhttp://<LXCHostのIPアドレス>:50080/test.phpにアクセスすると、PHPのテスト用スクリプトを表示できます。つまり、LXCコンテナーApache Webサーバー、PHPの環境を作れたというわけです。仮想マシンと比べてあっという間に構築できるのがコンテナーの魅力です。Dockerも良いですが、LXCも触ると楽しいですよ。

注意点

VirtualBox VMではちょっとうまく動きませんでした。KVMやESXi、VMware Workstation、VMware FusionParallels Desktopだとうまくいくと思います。私はParallels Desktop 12にUbuntu Server 16.04.2をインストールして試しました。もちろん、物理サーバーにLXC,LXD環境を作って、コンテナーを動かすのも同じように可能です。Ubuntu 16.04.xであればLXC,LXDはインストール済みです。

Chromeの全履歴が全履歴じゃなくなってしまった時の対処方法

Chromeの全履歴が全履歴じゃなくなってしまった…ってお前は何を言っているんだ!?と思われるかもしれませんが、たまにそういうことがあるようです。

Chromeの閲覧履歴は「全履歴を表示」で閲覧できるのですが、なんらかの問題でこの履歴の情報を保存しているファイルが壊れることがあるようです。

対処方法は履歴ファイル(そのままHistoryというファイル)がプロファイルに保存されているので、これを削除すると良いようです。次回Chromeを起動すると再生成されるとのことです。

productforums.google.com

Macの場合は次のように実行します。

% cd ~/Library/Application\ Support/Google/Chrome/Default/
% rm History

Ubuntu Server 16.04のコンソールがたまに表示されない場合の対応方法

Ubuntu Server 16.04のコンソールがたまに表示されない問題。 起きるときは頻繁に起きるし、起きないときは全く起きないのでかなり謎。

ちなみに再現するときは物理マシンだろうが仮想マシンだろうが再現します。 とりあえず「Alt」+「F1」を連打すると画面が出ます。たまに文字色がおかしくなります。

Bashのコマンド補完「bash-completion」を忘れずに入れようと思った

Bashでコマンドの補完をするのはBash Completionを利用すると便利。 CentOS 7をminimalインストールした場合はBash Completionパッケージが入っていないので入れると良い。 これで長い名前のサービス名を手打ちする必要がなくなる。

bash-completionパッケージは標準リポジトリーにあるのでインストールする。 bash-completionパッケージをインストール後もコマンドの補完ができないと思ったら、「インストール後は一旦ログアウト&ログインが必要」であることをすっかり忘れていた。

再ログイン後はコマンドの補完が[tab]キーで行えるようになっていた。

~]# yum install bash-completion
~]# complete
~]# logout

~]# complete
complete -F _minimal
complete -F _filedir_xspec oodraw
complete -F _filedir_xspec elinks
...

~]# systemctl s [tabキーを2回叩いてみる]
set-default       show              start             suspend
set-environment   show-environment  status            switch-root
set-property      snapshot          stop

~]# systemctl restart ht [tabキーを2回叩いてみる]
htcacheclean.service  httpd.service

なんでこんな基本的なことを今更書いたかというと、最近は自分しか触らない環境は真っ先にzshを入れて切り替えてしまうので、すっかり忘れていたのでまた忘れないように書いた訳である。

疎通確認に関するTips

サーバーにリモートアクセスできるかを確認するためにまず使われるのがpingというコマンドだと思います。 かつてはそれでも問題なかったのですが、最近はpingを許可しないようにファイアーウォールでブロックしていることもあるようです。

例えばWindows Serverはデフォルトの設定でpingによる通信(ICMP)を許可していません。LinuxでもICMPをブロックしている環境がたまにあったりします。

一方で、リモート管理の観点からWindowsの場合リモートデスクトップ用のポートをを、Linuxの場合SSH通信用のポートを許可している場合があります。こんな時に使えるのがnpingというコマンドです。

pingはICMPプロトコルを使って疎通確認を行うことができるコマンドです。実はSolarisのようにpingでポート指定できるようなOSもあるのですが、一般的にはpingコマンドではポートを指定できません。ところがnpingコマンドではIPアドレスとともにポートを指定することができます。使い勝手はpingコマンドとほとんど一緒です。

次のように使いことができます。 オプションはcオプションで試行回数、eオプションでインターフェイス、pオプションでポートを指定できます。 実行のログはvオプションでより詳細に出すことができますし、qオプションを指定すると結果だけを出力できます。

非常に便利なコマンドですね。利用するにはnmapパッケージをyumやaptなどのコマンドでインストールします。

$ sudo nping -c3 192.168.57.102 -p22 --tcp

Starting Nping 0.7.01 ( https://nmap.org/nping ) at 2017-06-03 14:49 UTC
SENT (0.0032s) TCP 192.168.57.101:54361 > 192.168.57.102:22 S ttl=64 id=15854 iplen=40  seq=1589366271 win=1480
RCVD (0.1975s) TCP 192.168.57.102:22 > 192.168.57.101:54361 SA ttl=64 id=0 iplen=44  seq=3687439332 win=29200 <mss 1460>
SENT (1.0040s) TCP 192.168.57.101:54361 > 192.168.57.102:22 S ttl=64 id=15854 iplen=40  seq=1589366271 win=1480
RCVD (1.1980s) TCP 192.168.57.102:22 > 192.168.57.101:54361 SA ttl=64 id=0 iplen=44  seq=3703078323 win=29200 <mss 1460>
SENT (2.0053s) TCP 192.168.57.101:54361 > 192.168.57.102:22 S ttl=64 id=15854 iplen=40  seq=1589366271 win=1480
RCVD (2.1979s) TCP 192.168.57.102:22 > 192.168.57.101:54361 SA ttl=64 id=0 iplen=44  seq=3718724257 win=29200 <mss 1460>

Max rtt: 194.180ms | Min rtt: 192.381ms | Avg rtt: 193.479ms
Raw packets sent: 3 (120B) | Rcvd: 3 (138B) | Lost: 0 (0.00%)
Nping done: 1 IP address pinged in 2.20 seconds

Ubuntu MATE 16.04.2(32bit)がAcer Aspire ONE AOA 150-Bbで動作しました

ネットブック。 それは、2007年頃から各PCメーカーから発売され、2012年に市場から消えたノートPCでもなく、タブレット型コンピューターでもない小型PC。

私もその軽さや小ささに惹かれて購入したものの、数ヶ月使ってキーボードや画面の小ささから操作しづらく、次第に使わなくなったのを覚えています。 さらにOSもWindows XPしか公式サポートしていないので、新しいバージョンのWindowsへのアップグレードも簡単にできないし、いろいろあって最後は妹が数年使って、気がついたら手元に戻ってきていました。

それからまた数年経って、先日部屋の掃除をしていたらAcer Aspire ONE AOA 150-Bb(ZG5)を見つけました。 起動してみるとXPのロゴ。懐かしいような嫌な思い出が蘇るような。

昔と比べて(多少)気が長くなったのか、割とサクサク動いているような気がしました。 じゃあ、このマシンを何かに使えないかと思ったところ、Ubuntuの16.04が動作するような情報を発見。

早速、32bit版のUbuntu Desktopをダウンロードすることに。 今回は私の好みでUbuntu MATEをインストールすることにしました。

f:id:ytooyama:20170530115521j:plain

Ubuntu MATE 16.04.2 32bit + Acer Aspire ONE AOA 150-Bbが動作しました。無線LANも利用できました(ただし無線の2.4GHzのみ対応)。ちなみにちょっと体感で遅いかなと思う程度の操作感です。あのころのNTFSよりもEXT4の方が読み書きか速いから結果、体感速度で速く感じるってことなのだろうか。

インストール方法は

と簡単でした。久しぶりに電源を入れる場合はBIOSの時刻が初期化されている場合があるので、そちらもチェックした方がいいと思います。

作業端末にする予定ですがこのマシン、無線LANが繋がらなくなることがたまにあるようで、電源を切ったあと、ACとバッテリーを取り外して数分放置してバッテリー、電源を入れ直すと右下の無線LANスイッチがうまく動くようになるとか…なんだそりゃ。

ちなみに、MacBook Proもびっくりなほど爆熱です。Windows XPで動いていた時もこんな感じだったので、このころのAtom CPUってそんなもんなんでしょう。多分

CentOS7でNICのBondingを行うには

重要なこと

CentOS7はNetworkManagerが標準で実行されています。ここは元となっているRed Hat Enterprise Linux 7でも同様です。もしNetworkManagerを有効の状態でBondingを行なってもよければ、NetworkManager GUI、nmcliコマンド、nmtuiコマンドなどで設定を実行できて便利なので、NetworkManagerを生かしたまま、お好みの方法でBondingをした方がいいと思います。詳細はRHEL7のマニュアル「ネットワークガイド第4章 ネットワークボンディングの設定」をご覧ください。OVSでBondingをする場合はNetworkManager/networkサービスのいずれかが正常に動いていれば、どちらでも構いません。

さて、LinuxでBondingを行うには2つの方法があります。一つはKernelのbondingモジュールを使ってカーネルレベルでBondingするという方法です。もう一つはOpenvSwitchを使ってBondingするという方法です。

前者は追加でインストールするものはないのですぐに使えます。OpenvSwitchを使う方法はLinuxにOpenvSwitchをインストールするという手間が追加で発生します。LinuxでBondingをした場合はLinuxの様々なコマンドで状態を確認します。例えばパケットが送受信されているかはtcpdumpコマンドを使うなど。一方、OVSを使ったBondingの方がステータスの確認をするコマンドが充実しているので便利だったりします。

はじめに

実際の手順に入る前に、今回の構成を以下に書いてみます。 サーバーには3つのNICを用意して、うち2つはbonding用、1つは管理用に使います。作業するときは管理用のNIC経由でサーバーにアクセスします。今回の例はeth0とeth2は同じVLANで、eth1はeth0,2とは別のVLANに接続されているのを想定しています。

  • eth0–bonding用
  • eth2–bonding用
  • eth1–管理用(別VLAN)

家庭でBondingを試したい場合は、Linux KVMを使うといいと思います。eth0と2をLinux Bridgeとつなぎ、eth1をKVM標準のNATにつなげば良いと思います。

今回は上に載せるアプリケーションの都合でNetworkManagerを無効化して、従来のnetworkサービスを使う方法について説明します。NetworkManagerが使えるならもっと楽ができるし情報もたくさんあるのですが、そこはまあ仕方ないですね。

LinuxのBondingモジュールで構成する

1) まず、yum updateでシステムを最新の状態に更新します。新しいKernelが追加された場合は再起動します。

2) 次にeth0とeth2の設定を記述します。

HWADDRはNICMACアドレスを記述します。

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
HWADDR=xx:xx:xx:xx:xx:xx
ONBOOT=yes
MASTER=bond0
SLAVE=yes
# vi /etc/sysconfig/network-scripts/ifcfg-eth2
DEVICE=eth2
BOOTPROTO=none
HWADDR=xx:xx:xx:xx:xx:xx
ONBOOT=yes
MASTER=bond0
SLAVE=yes

3) bond0というデバイスを作るため、次のように設定を記述します。

# vi /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
BOOTPROTO=none
ONBOOT=yes
BONDING_OPTS="mode=1 miimon=100"

bondingのモードを切り替えるには上記ネットワーク設定にあるBONDING_OPTSにモードを指定します。設定を反映するにはmodprobe -r bonding &&modprobe bondingなどと実行するか、ホストを再起動しましょう。

4) ifcfg-bond0 にローカルIPを設定します。

...
IPADDR=172.17.14.224
NETMASK=255.255.255.0
GATEWAY=172.17.14.1
DNS1=172.17.14.3

5) デフォルトゲートウェイを設定します。

# vi /etc/sysconfig/network
GATEWAY=172.17.14.1

ここまでできたら再起動すると、次回起動時にbond0が作られてネットワーク通信できる状態になります。cat /proc/net/bonding/bond0コマンドでbondingの状態を確認できます。

OVSでBondingを構成する

1) まず、yum updateでシステムを最新の状態に更新します。新しいKernelが追加された場合は再起動します。

2) openvswitch パッケージをインストールします。CentOSの場合はOpenStack用のリポジトリーに比較的新し目のopenvswitchパッケージが用意されているのでyum list|grep centos-release-openstackを実行して可能な限り新しいOpenStackバージョンを確認して、メタパッケージをインストールします。これでOpenStackパッケージリポジトリ〜が有効になるので、そのあとyum install openvswitchを実行してOVSをインストールします。

2017/6/10追記

centos-openstack-ocata/x86_64で公開されているopenvswitch-2.6.14.1.git20161206.el7ですが、本手順を実施してもまともに動きません。パッケージにバグがあるのかも。以下で公開したsrpmを使ってrpmをビルドしたものを使ってください。そのバージョンでは問題なく動作するのを確認しています。

github.com

3) 次にeth0とeth2の設定を記述します。

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
HWADDR=xx:xx:xx:xx:xx:xx
ONBOOT=yes
IPADDR=0.0.0.0
# vi /etc/sysconfig/network-scripts/ifcfg-eth2
DEVICE=eth2
BOOTPROTO=none
HWADDR=xx:xx:xx:xx:xx:xx
ONBOOT=yes
IPADDR=0.0.0.0

「ONBOOT=yes」と「IPADDR=0.0.0.0」を書いて、NICのstateがUPになるようにします。ここら辺はNetworkManagerだとよしなにやってくれるのですが、networkサービスではちょっと工夫する必要があります。

4) OVSではブリッジポートに自身のポートとbondingのポートをくっつけることでNICのbondingを実現します。そのために、まずOVSのブリッジ設定を記述します。

# vi /etc/sysconfig/network-scripts/ifcfg-ovsbr0
DEVICE=ovsbr0
DEVICETYPE=ovs
TYPE=OVSBond
OVS_BRIDGE=ovsbr0
ONBOOT=yes
BOOTPROTO=none
IPADDR=172.17.14.224
NETMASK=255.255.255.0
GATEWAY=172.17.14.1
DNS1=172.17.14.3
BOND_IFACES="eth0 eth2"
OVS_OPTIONS="bond_mode=active-backup"

5) デフォルトゲートウェイを設定します。

# vi /etc/sysconfig/network
GATEWAY=172.17.14.1

6) コマンドを実行して、ブリッジとポートの割り当てを行います。

# systemctl start openvswitch && systemctl enable openvswitch
# ovs-vsctl add-br ovsbr0
# ovs-vsctl add-bond ovsbr0 bond0 eth0 eth2
# ovs-vsctl set port bond0 bond_mode=active-backup

7) 次のコマンドを実行することで様々な情報を引き出すことができます。

# ovs-appctl bond/list
(bondingデバイスとモード、スレーブデバイスを一覧で表示)
# ovs-appctl bond/show
(上記をもう少し詳細に表示)
# ovs-ofctl dump-flows ovsbr0
(パケットの送受信の状態の表示)
# ovs-vsctl show
(ブリッジとポートの状態と構成を一覧表示)

今回OpenStackを動かすにあたり、OpenStackではNetworkManagerはまだ利用できないので、NetworkManagerをオフにした上でBondingする方法を調べたら割と苦労したので、今後のためを思ってブログに書いてみました。誰か一人にでも役立つことがあれば幸いです。

リンク集

今回の記事を書くにあたり、参考にしたサイト一覧です。

Linux Bonding

OVS Bonding

docker-composeやWSLのサポート、いくつかのバグ修正がされたVagrant 1.9.5がリリース

Vagrant 1.9.5が5/15にリリースされていたので更新。OS X版は特に問題なし。

VagrantはOSやアプリケーションのデプロイメントツールで、Vagrantプラグインにより、様々な機能を追加したり、ハイパーバイザー、コンテナーに対応できる。標準ではVirtualBoxをサポートするほか、プラグインの追加により、Linux KVM、Docker、Hyper-V、ESXiなどに対応できる。

ダウンロードは公式サイトから可能。