それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

LXC とホスト間でディレクトリを共有する

LXC とホスト間でディレクトリを共有する

lxc で debian を作って、そこでnginx を運用していると、dockerで volumeの共有みたいにホスト・コンテナ間でディレクトリを共有したい。

docker だと EXPOSE で ディレクトリを、起動時にvolume を指定するだけでいけるけど、lxc はそこまでかんたんじゃない。

LXCでディレクトリの共有の場合

LXCでコンテナを起動していると、ユーザー名とuid がlinux の機能で擬似的にリマップされているので、同じディレクトリでもパーミッションをみるための ower / group のパーミッションがぐちゃぐちゃになるので、事前に設定しなくてはいけない。

/var/www/html をLXCで共有するとき

ubuntu の www-data(uid 33 / gid 33 ) のユーザーでホストとコンテナでディレクトリの共有をする。

/var/www/htmlをホストとコンテナで共有する事を考えてみる。

lxc ホストが ubuntu で lxc のコンテナも ubuntu で 両方をdebian 系で統一して試した。 /var/www/ は www-data ユーザで扱うので www-data ユーザをマッピングする設定がいる。

uid のマッピング

最初に、uid をマッピングの準備をする

takuya@lxc-host:~$ id www-data
uid=33(www-data) gid=33(www-data) groups=33(www-data)
takuya@lxc-host:~$ lxc exec ubuntu1804 id www-data
uid=33(www-data) gid=33(www-data) groups=33(www-data)

www-dataがいないときは nginx / apacheがインストールされていないと思われる。

ホスト側で、www-data がオーナーのフォルダを作る

mkdir /opt/shared-www
chown www-data: -R /opt/shared-www

まず、ホスト側からコンテナ(ゲスト)に見せるフォルダを作る

ホストとコンテナの間でIDをマッピングする。

lxc config set ubuntu1804 raw.idmap 'both 33 33'

ホストとコンテナの間で、ディレクトリを共有するデバイスを作る

コンテナにディレクトリを渡すときは、設定は「デバイス」あつかいになるので config device 関連にまとめらている。

lxc config device add ubuntu1804 config-www-dir disk source=/opt/shared-www/ path=/var/www/shared

lxc config device で設定を確認する。

takuya@lxc-host:~$ lxc config device show vps
config-www-dir:
  path: /var/www/shared/
  source: /opt/shared-www/
  type: disk

再起動

最後に、IDマッピングを有効化し、 device disk を有効化するために、再起動する

lxc restart nginx

これでホストとゲストのコンテナの間でフォルダを共有することができる。

docker の expose のボリュームに比べて少し面倒ですね。

ポイント

ホスト・コンテナ間で uid/gidマッピングが必要

device config でデバイスとして追加する。

php で url から ホスト名を取り出す。 - parse_url

PHPでURLからホスト名だけを取り出す。

<?php  parse_url( $url, PHP_URL_HOST );

parse_url にフラグを入れるだけで、ホスト名を取り出すことができる。

実行するとこんな感じになります。

php > var_dump(parse_url( 'https://www.yahoo.co.jp:443/', PHP_URL_HOST ));

string(15) "www.yahoo.co.jp"

見て分かる通り、指定したものをちゃんと簡単に取り出せます。

ほんとなんで十分に検証もしないままコピペの正規表現パターンを書いちゃうんでしょうかねぇ。

parse_url 関数が多機能すぎるんでしょうか。

参考資料

https://www.php.net/manual/en/function.parse-url.php

php で DNS からレコードを調べてIPアドレスを取り出す - dns_get_record

ドメイン名のDNSレコードを調べてIPアドレスを取得する

dns_get_recordDNSの値をクエリすることが出来ます。

<?php
dns_get_record('www.yahoo.co.jp', DNS_A)

gethostbynameの、古くからあるIPアドレスを調べる方法を取ることが出来ます。

<?php 
gethostbyname('www.yahoo.co.jp'))

dns_get_record を使った場合の取り出し例

CNAME で指定されたDNSレコードの場合は、 DNS_A をフラグとして入れてあげると、IPアドレスが取り出せる。

php > var_dump(dns_get_record('www.yahoo.co.jp', DNS_A));
array(1) {
  [0]=>
  array(5) {
    ["host"]=>
    string(16) "edge12.g.yimg.jp"
    ["class"]=>
    string(2) "IN"
    ["ttl"]=>
    int(120)
    ["type"]=>
    string(1) "A"
    ["ip"]=>
    string(14) "183.79.219.252"
  }
}
php > var_dump(dns_get_record('www.yahoo.co.jp'));
array(1) {
  [0]=>
  array(5) {
    ["host"]=>
    string(15) "www.yahoo.co.jp"
    ["class"]=>
    string(2) "IN"
    ["ttl"]=>
    int(815)
    ["type"]=>
    string(5) "CNAME"
    ["target"]=>
    string(16) "edge12.g.yimg.jp"
  }
}
php >

参考資料

https://www.php.net/manual/en/function.dns-get-record.php