CoreOSをVirtualBoxに手動でセットアップしたらめんどくさかった
最近CoreOSやらDockerやらの名前をよく聞くので面白そうと思って入れてみた。
ホストOSはOS X Mavericks。
OS XなのでBoot2Dockerとか使うほうが楽な気がするけど他の仮想マシンもVirtualBoxで管理してるのでCoreOSもVirualBoxに入れた。
構成としてはVirtualBox内のDockerからはインターネットへの通信とホストのOS Xとの通信が可能なようにした。また、SSHで繋ぐ関係上IPアドレスを固定にした。これが一番めんどくさかった。
最初に言っとくとさらっと書いてるけど2日間くらい四苦八苦したので特に理由が無ければVagrant使うといいと思います。Vagrant使わなかったのはフォルダの管理があんまり好きじゃなかったから。
セットアップ
まずhttps://coreos.com/からセットアップ時に使うCoreOSのISOイメージをダウンロード。Download CoreOSのISO Imageから飛んだ先でダウンロード。
で、その間にでもVirtualBoxの下準備。仮想マシンを新しく作る。色々なコンテナを入れることが予想されるのでメモリと仮想ハードディスクは多めに取っておいた。アーキテクチャは「CoreOS」って名前で作るとOracleの64bitになるのでそれでいいはず。
作ったら設定から色々いじるんだけど、必須なのはネットワーク周りでインターフェイス1はNATのままでいいんだけどインターフェイス2などでホストオンリーアダプタを追加しないとホストとは通信できないので設定。他、ついでにCPUコア割り当てを1個じゃアレなので2個くらいに増やしとく。
そんでもってISOイメージのダウンロードが終わったらVirtualBoxの仮想ドライブにマウント。
で、ブート。
インストール
概ね公式ドキュメント通りなんだけど、今回は色々設定いじるので設定用のファイルcloud-config.yamlを作る。
そのファイルに記載すべきなのは
- 接続元のSSHの公開鍵
- これは俺の場合GitHubに登録してるのでhttps://github.com/tasuten.keysみたいなURLからダウンロードするなり*1
~/.ssh/id_rsa.pub
を覗くなりする
- これは俺の場合GitHubに登録してるのでhttps://github.com/tasuten.keysみたいなURLからダウンロードするなり*1
- IPアドレス固定のためのネットワーク設定ファイルの設定
- CoreOSはネットワークインターフェイス周りを
systemd-networkd
で管理なさるのでその流儀にしたがって - ここではブート後に
ifconfig
とかroute -n
とかして、ゲスト側のホストオンリーアダプタのインターフェイス名がenp0s8
、あとNATのデフォルトゲートウェイが10.0.2.2
だったので以下の様に作る。 - あと、固定したいIPアドレスはVirtualBoxのデフォルトの設定だと
192.168.56.101-192.168.56.254
だった気がするのでその範囲で
- CoreOSはネットワークインターフェイス周りを
#cloud-config write_files: - path: /etc/systemd/network/10-host-only.network content: | [Match] Name=enp0s8 [Network] Address=192.168.56.1XX/24 Gateway=10.0.2.2 ssh_authorized_keys: - ssh-rsa AAAAB3[以下略]
注意点としては
- YAMLのフォーマットから外れてるとインストール後失敗に気づくのでCloud-Config Validatorでvalidation checkしとく
- Gatewayには
enp0s8
はホストオンリーのインターフェイスだけどGatewayはNATの方を指定する。じゃないとNATの方でもDHCPで降ってきて結果的にデフォルトゲートウェイがダブってNAT使えなくてインターネット繋げなくて辛くなる - 1行目の
#cloud-config
は仕様上必要らしいよ
こうして用意したcloud-config.yamlを起動したCoreOSへ持っていく。ホストのOS X側で作ったYAMLファイルを、ワンライナーか何かでHTTPサーバ立てて一時的に公開して、CoreOS側でwget 192.168.56.1:10000/cloud-config.yaml
とかすると楽。
ちなみにCoreOS君はJISキーボードじゃなくてUSキーボードで動くから:
はShift+;
な。他JISキーボードだといろんな記号が打ちにくいけど我慢して。
で、CoreOSではこんなかんじの操作する
coreos $ sudo su coreos # wget url-to-cloud-config.yaml coreos # coreos-install -d /dev/sda -C stable -V current -c cloud-config.yaml -v
CoreOSのstable版のcurrentバージョンのOSイメージを取りに行くので結構時間かかる。Wi-Fiで10-20分くらい掛かったっけな。オプションの意味はhttps://coreos.com/docs/running-coreos/bare-metal/installing-to-disk/を見ていただくとして、小文字の-v
はverboseのvなので別に無くてもいい。
-V
もホントは無くて良かったはずなんだけど、どうやらオプション無しで取りに行くバージョンがNot Found食らったので明示的にバージョンをcurrentに指定してる。
終わったらshutdown -h now
して、VirtualBoxの設定画面からISOイメージを取り出して再起動。
で、ここが重要なんだけど、1回目の起動では上記の設定が反映されないのでログインプロンプト出ても問答無用で×ボタンからシャットダウン。もう一度起動すると設定が反映され、表示されるIPアドレスが設定通りになるのでようやくホストのOS X側からssh
。初めて接続する場合はfingerprintの警告が出るのでyes。なんかエラー出たら~/.ssh/known_hosts
にIPアドレスが該当するエントリが既に無いか確認して有ればその行を削除してsshしなおし。公開鍵認証なので少し時間かかることもあるけどひとまず待つ。
host(OS X) $ ssh core@192.168.56.1XX Last login: [略] CoreOS (stable) core@localhost ~ $
一応ping 8.8.8.8
とかして疎通確認しとくと良い。
試しにDockerでnginxでも入れてみる
core@localhost ~ $ docker run -d -p 80:80 dockerfile/nginx [色々取りに行くので気長に待つ。 終わったらホストOSからhttp://192.168.56.1XX/にでもアクセスして、 nginxのページが出れば成功]
なお、nginxを止めるには、↑のコマンドの最後に出てくるImage ID(ハッシュ値)を1a2b3c...とするとdocker stop 1a2b3c
とかする。要らなくなったイメージとかを消すにはDockerで不要になったコンテナやイメージを削除する - @znz blog見ながら頑張れ。
そろそろ卒論近づいてきて時間が少しずつ削れてるけど頑張ります
*1:もちろんtasutenの部分は各自自分のIDで