インフラは筋肉で構築するもの

サーバとネットワークを筋肉でどうにかします

初心者も自宅サーバはコンテナで構築しよう

why コンテナ?

初心者もコンテナ仮想化で自宅サーバを構築することが一番おすすめだと思っています

その理由を紹介します

動くサーバを体験することができる

完全に動くものを体験できることは初心者が理解する際に一番重要だと思います

Dockerfile(そのコンテナの構築手順が書いてあるファイル)を確認すればどうやって構築されているかを確認できますし、動けば中身はどうでもいいという人はコンテナを落とすだけで構築が終わります

環境構築の手間を減らせる

使ってみたい機能を動かすために環境構築でハマることがよくあります

Dockerhub(クラウド上のコンテナ置き場)を使えば、依存関係をすでに解消してある完成品が置いてあるので、依存関係で悩む時間をゼロにできます(たまにバグるコンテナもおいてあるので、最低限の知識は必要ですが。。。)

ミスした時の手戻りを少なくできる

私が初心者のときに経験したこと

  • ルートディレクトリを消し飛ばした
  • 色々試しにインストールしすぎて、グッチャグチャになり管理できなくなった
  • 消してはいけないファイルを知らず知らずのうちに巻き込んで消した

これらがコンテナを消す、作り直すだけですぐ終わるようになります

物理サーバに入れたりESXiを使ったりしていると再インストール・初期設定する時間がかかります

私は初心者の時によくやらかして起動しなくなり涙目で際インストしてましたが、コンテナを使えばすぐに作り直すことができます

色々検証する際の手間を省ける

完成品を試したあとは自分でイチから作ってみたくなると思います

その際にコンテナを使えば、「これ入れたらどうなんだろう…」「これ消したらどうなるんだろう…」ということも実際に試して、だめだったらすぐに作り直すことができます


実際に構築してみる

コンテナが動く環境を構築する(raspberry-pi3)

内向きDNSサーバを立てる

自宅サーバで内向きDNSコンテナを作る

内向きDNSサーバをESXiから移行します BINDだと管理が面倒なのでdnsmasqを使って構築します

dnsmasqとは

軽量なDNSサーバとDHCPサーバで、簡単にDNSを立てることができます

$ vi Dockerfile
###############################
FROM alpine                
# FROM hypriot/rpi-alpine-scratch raspberry piの場合はこちらを使用

RUN apk update && \
apk upgrade && \
apk add bash dnsmasq && \
rm -rf /var/cache/apk/* && \
mkdir -p /etc/default/ && \
echo -e "ENABLED=1\nIGNORE_RESOLVCONF=yes" > /etc/default/dnsmasq

CMD ["dnsmasq","--no-daemon"]

ビルドする

$ docker build -t dnsmasq ./

# dnsmasq用のconfigを用意
$ mkdir /opt/docker
$ vi /opt/docker/dnsmasq.conf

# 中身は適宜書き換えてください
#dnsmasq config, for a complete example, see:
#  http://oss.segetech.com/intra/srv/dnsmasq.conf
#log all dns queries
log-queries
#dont use hosts nameservers
no-resolv
#use google as default nameservers
server=8.8.4.4
server=8.8.8.8
#serve all .company queries using a specific nameserver
server=/company/10.0.0.1
#explicitly define host-ip mappings
# adress=/使いたい名前.使いたい名前/割り当てるIPアドレス
address=/myhost.company/10.0.0.2

# 作ったコンテナをrunする
$ docker run --name dnsmasq -d -p 53:53/udp -v /opt/ddocker/nsmasq.conf:/etc/dnsmasq.conf dnsmasq

サンプルをそのまま使うとnslookup myhost.companyで10.0.0.2が帰ってきます

これで名前解決できるようになりました

Rasppberry Pi3でDockerを動かす

2,3年ESXiを用いて自宅サーバを運用していましたが、

  • ほぼリソースを使っておらず無駄が多い
  • 最近コンテナ仮想化に目覚めた
  • RancherOSを使ってみたい

などの理由から Rasppberry-Pi3で自宅サーバをコンテナ仮想で再構築してみることにしました

なぜRancherOS?

  • 構築の手間の省略
  • 最近よく見る
  • 15分あれば初期設定が終わる
  • 公式リファレンスが読みやすい

microSDにRancherOSをぶち込む

imgをmicroSDに書き込みます 書き込み方はいろんなところで書かれているので省略

# IPの設定 アドレスは適宜書き換えてください
$ sudo ros config set rancher.network.interfaces.eth1.address 172.68.1.100/24
$ sudo ros config set rancher.network.interfaces.eth1.gateway 172.68.1.1
$ sudo ros config set rancher.network.interfaces.eth1.mtu 1500
$ sudo ros config set rancher.network.interfaces.eth1.dhcp false
$ sudo ros config set rancher.network.dns.nameservers 172.68.1.111
$ sudo ros system-docker restart network

どうやら デフォルトでSSHパスワード認証が許可されているみたいなので、 IPの設定さえしてしまえば終わりです

ID:パスワードはrancher:rancherで入れます

microSDにインストールしたRancherOSでDocker runができない問題に直面

$ docker run hello-world
docker: Error response from daemon: rpc error: code = 2 desc = "oci runtime error: exec format error".

パーティションの問題らしいので修正してみます

fdiskで拡張しようとするとdevice busyとかのエラーで止まる

公式で対策が出ているので こちらを参照

パーティション修正をしてもまだrunができない

$ docker run hello-world
FATA[0003] Error response from daemon: Cannot start container 0f0fa3f8e510e53908e6a459e817d600b9649e621e7dede974d6a65761ad39e5: exec format error

ググってみるとどうやらCPUのアーキテクチャの問題らしい。。。 raspberry-pi用のコンテナを用意してくれている方がいたので、今回はこちらを使わせて頂きます

$ docker run docker pull hypriot/armhf-hello-world

これでコンテナが動く状態になりました 何かしらコンテナを作る際にもこちらの方作成のalpineコンテナなどを利用することで、 raspberry pi3上で問題なく動作します