LXC環境にインストール

lxcを使ったインストール。gitlabはもうそれ専用のシステムにしてしまった方がよい気がします。ホストはstretchを使う。

# apt install lxc
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  bridge-utils debootstrap dns-root-data dnsmasq-base liblxc1 libpam-cgfs
  lxcfs python3-lxc uidmap
提案パッケージ:
  apparmor btrfs-tools lvm2
以下のパッケージが新たにインストールされます:
  bridge-utils debootstrap dns-root-data dnsmasq-base liblxc1 libpam-cgfs lxc
  lxcfs python3-lxc uidmap
アップグレード: 0 個、新規インストール: 10 個、削除: 0 個、保留: 0 個。
1,519 kB のアーカイブを取得する必要があります。
この操作後に追加で 3,895 kB のディスク容量が消費されます。
続行しますか? [Y/n]
# lxc-checkconfig
Kernel configuration not found at /proc/config.gz; searching...
Kernel configuration found at /boot/config-4.9.0-3-amd64
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled

--- Control groups ---
Cgroup: enabled
Cgroup clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled

--- Misc ---
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
Bridges: enabled
Advanced netfilter: enabled
CONFIG_NF_NAT_IPV4: enabled
CONFIG_NF_NAT_IPV6: enabled
CONFIG_IP_NF_TARGET_MASQUERADE: enabled
CONFIG_IP6_NF_TARGET_MASQUERADE: enabled
CONFIG_NETFILTER_XT_TARGET_CHECKSUM: enabled
FUSE (for use with lxcfs): enabled

--- Checkpoint/Restore ---
checkpoint restore: enabled
CONFIG_FHANDLE: enabled
CONFIG_EVENTFD: enabled
CONFIG_EPOLL: enabled
CONFIG_UNIX_DIAG: enabled
CONFIG_INET_DIAG: enabled
CONFIG_PACKET_DIAG: enabled
CONFIG_NETLINK_DIAG: enabled
File capabilities: enabled

Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig

で、いずれにせよbridgeが必要になりそう。bridge-utilsは依存で入っているはずだ。

設計再定義

で、ここでは例えばだけど、1つの仮りているvpnがあって、それには当然グローバルIPも振ってあり各種サービスが動作している(apacheなど)といった場合。 まあこの場合でも何とかしてみよう。

とりあえず何は何でもlxc-create

# lxc-create -n lxc-gitlab -t debian -- -r stretch

-nは名称 あとはまあdebian stretchを投入するお呪いという所

...
invoke-rc.d: could not determine current runlevel
invoke-rc.d: policy-rc.d denied execution of start.

Current default time zone: 'Etc/UTC'
Local time is now:      Sat Feb  3 02:10:56 UTC 2018.
Universal Time is now:  Sat Feb  3 02:10:56 UTC 2018.

みたいな感じで終わるだろう

# lxc-ls -f
NAME       STATE   AUTOSTART GROUPS IPV4 IPV6
lxc-gitlab STOPPED 0         -      -    -

とりあえず開始して入る

# lxc-start  -n lxc-gitlab
# lxc-attach -n lxc-gitlab
root@lxc-gitlab:~#

とまあこういう具合

ネットワークの環境をちょいちょいととのえていく

あたり前といえばあたり前なのだが現状ネットワークがないので

# apt update
エラー:1 http://httpredir.debian.org/debian stretch InRelease
  'httpredir.debian.org' が一時的に解決できません
エラー:2 http://security.debian.org stretch/updates InRelease
  'security.debian.org' が一時的に解決できません
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
パッケージはすべて最新です。
W: http://httpredir.debian.org/debian/dists/stretch/InRelease の取得に失敗しました  'httpredir.debian.org' が一時的に解決できません
W: http://security.debian.org/dists/stretch/updates/InRelease の取得に失敗しました  'security.debian.org' が一時的に解決できません
W: いくつかのインデックスファイルのダウンロードに失敗しました。これらは無視されるか、古いものが代わりに使われます。

# ifconfig -a
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (ローカルループバック)
        RX packets 80  bytes 6536 (6.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 80  bytes 6536 (6.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

というわけでループバックしかないため、一度抜けて止める。

root@lxc-gitlab:~# exit
# lxc-stop -n lxc-gitlab
# lxc-ls -f
NAME       STATE   AUTOSTART GROUPS IPV4 IPV6
lxc-gitlab STOPPED 0         -      -    -

lxcのconfig

/var/lib/lxc/lxc-gitlab/config とかにある。が、まだ手をつけない

というか基本的にlxcの関連は/var/lib/lxc/以下にまとまっているので覚えておくこと。

なんだけどもnatをするにあたってもbridgeが1つあるといい、lxcは適当にインタフェース名を決めるので、それを束ねておくブリッジが必要になってくるのだ。よく利用されるものとしてlxc-brという名前が多いようだからそうする(名前は適当に決めてもよい)。

/etc/network/interfaces

ここでは適当なプライベートアドレス192.168.100.0/24を想定するが、192.168.100..っていうのが埋まっているなら勿論別のものを割り当ててください。

auto lxc-br
iface lxc-br inet static
        address 192.168.100.1
        netmask 255.255.255.0
        broadcast 192.168.100.255
        pre-up brctl addbr lxc-br
# ifup lxc-br
# ifconfig lxc-br
lxc-br: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.100.1  netmask 255.255.255.0  broadcast 192.168.100.255
        inet6 fe80::1cb4:b2ff:fe7e:b6a6  prefixlen 64  scopeid 0x20<link>
        ether 1e:b4:b2:7e:b6:a6  txqueuelen 1000  (イーサネット)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 7  bytes 578 (578.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

とかまあ、こういう具合になる。

lxc-brが設定できたのでconfigを書き換える

/var/lib/lxc/lxc-gitlab/config

#lxc.network.type = empty
lxc.network.type = veth
lxc.network.link = lxc-br
# ↑この辺だけ変更

ここでlxc-startしてlxc-attachするとviが使えないといかいうおちがあるので(chrootしてつっこむとかいう手はあり)、外側から書いていこう。 コンテナの/etc/network/interfacesは現状loopbackしか書かれていないため、eth0とかを書く。

# vi /var/lib/lxc/lxc-gitlab/rootfs/etc/network/interfaces
---
auto lo
iface lo inet loopback

auto eth0
#iface eth0 inet dhcp
iface eth0 inet static
        address 192.168.100.2
        netmask 255.255.255.0
        gateway 192.168.100.1
        broadcast 192.168.100.255

あとnameserver(リゾルバ)も書き換えとく /var/lib/lxc/lxc-gitlab/rootfs/etc/resolv.conf

#search sakura.ne.jp
#nameserver 210.188.224.10
#nameserver 127.0.0.1
nameserver 8.8.8.8

sources.listも序でだし変えとく

/var/lib/lxc/lxc-gitlab/rootfs/etc/apt/sources.list

deb [arch=amd64] http://ftp.jp.debian.org/debian          stretch         main
deb [arch=amd64] http://security.debian.org/ stretch/updates main

これで8割okなんだが、ホストの側のnatがだめかも。

ホスト側で

# iptables -t nat -F
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 

etc0は実際出ていくアダプタを指定してください。たとえばbr0とかになっているならbr0です。

あと

# echo 1 > /proc/sys/net/ipv4/ip_forward

としときまして、再起動されてもいいように

/etc/sysctl.d/99-sysctl.conf

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

としといていよいよattach

# lxc-start  -n lxc-gitlab
# lxc-attach -n lxc-gitlab
# apt update
取得:1 http://security.debian.org stretch/updates InRelease [63.0 kB]
無視:2 http://ftp.jp.debian.org/debian stretch InRelease
ヒット:3 http://ftp.jp.debian.org/debian stretch Release
取得:4 http://security.debian.org stretch/updates/main amd64 Packages [269 kB]
取得:5 http://security.debian.org stretch/updates/main Translation-en [118 kB]
450 kB を 0秒 で取得しました (631 kB/s)
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
アップグレードできるパッケージが 4 個あります。表示するには 'apt list --upgradable' を実行してください。

通信できるようになりました。まあこれで第一段階はok。なんならrootfsを全部コピーしときます。gitlabのインストールをミスってもいいように。

いよいよgitlab

locale=cでやる事。

# export LANG=C
# locale
LANG=C
LANGUAGE=
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=

apt

ここから注意というか、SSLを使わない場合はこのまま進んでよい。SSLを使う場合を想定する。

# apt install gitlab
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
...

ともあれaptを通す。

ドメインを決めて(named virtualhostになるようなのでちゃんとする)

これ、ごちゃごちゃ書かれているがLet's Encryptにも対応するぞ的な事。これを< はい >にすると

この辺使ってないからわからんのですよ。。。3か月ごとに手動更新必要だぞとかなんかいろいろ書いてありますが、とりあえず「いいえ」

DBのパスワードはすら表示されないので注意して進めると…

Reloading nginx configuration...
Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xe" for details.
invoke-rc.d: initscript nginx, action "reload" failed.
dpkg: error processing package gitlab (--configure):
 subprocess installed post-installation script returned error exit status 1
Processing triggers for libc-bin (2.24-11+deb9u1) ...
Processing triggers for ca-certificates (20161130+nmu1) ...
Updating certificates in /etc/ssl/certs...
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
Processing triggers for systemd (232-25+deb9u1) ...
Errors were encountered while processing:
 gitlab
E: Sub-process /usr/bin/dpkg returned an error code (1)

いわれる通りsystemctl status nginx.serviceコマンドを打つと

Feb 03 12:47:19 lxc-gitlab nginx[12114]: nginx: [emerg] BIO_new_file("/etc/gitlab/ssl/gitlab.crt") failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/etc/gitlab/ssl/gitlab.crt','r') error:2006D080:BIO routines:BIO_new_file:no such file)
Feb 03 12:47:19 lxc-gitlab systemd[1]: nginx.service: Control process exited, code=exited status=1
Feb 03 12:47:19 lxc-gitlab systemd[1]: Reload failed for A high performance web server and a reverse proxy server.

この辺らしい。

というわけで、最初に/etc/gitlab/ssl/gitlab.crtを作らないといけない?まあつくってみるならば

# openssl genrsa -out /etc/gitlab/ssl/gitlab.key 2048
# openssl req -new -key /etc/gitlab/ssl/gitlab.key -out /etc/gitlab/ssl/gitlab.csr
# ↑(最低限common nameくらいは合わせるべきか)
# openssl x509 -req -days 365 -in /etc/gitlab/ssl/gitlab.csr -signkey /etc/gitlab/ssl/gitlab.key  -out /etc/gitlab/ssl/gitlab.crt

とまあ、こんなのしておいて

# apt -f install

などとするとinstallは完了するはず。

SSLが通ったはいいが...

ホストでがっちり止められているのでポート通しときましょう。。。

iptables -A PREROUTING -t nat -p tcp -i eth0 --dport 443 -j DNAT --to 192.168.100.2:443

全てを(というかhostを)rebootする

あと最後もう一息

lxcが自動起動しない

/var/lib/lxc/lxc-gitlab/config

lxc.start.auto = 1

natとかportfowardがうまくいかん

iptables系

# iptables -t nat -F
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# iptables -A PREROUTING -t nat -p tcp -i eth0 --dport 443 -j DNAT --to 192.168.100.2:443

ipv4のfowaredは/etcで有効化してあるとして、これを保存するにはiptables-persistentを利用するのが楽だ。 きちんと保存されていればdumpをそのまま書き加えてくれる。それだけ。あとはhostをrebootしてもokなはずだよ。

番外編 Let's encrypt

あえてここまできっちりゲストおよびホストおもにネットワークの環境を作成したと仮定したらLet's encryptも使えるだろう。この場合rootfsを一度消してやりなおそう。

ちなみにこの場合も一瞬でいいけど80(HTTP)もgitlabに被せてくださいね

install_on_lxc.txt · 最終更新: 2018/02/04 02:36 by admin
www.chimeric.de Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0