Docker on Ubuntu on VirtualBox on CentOS 6.8 (オフライン)

なぜこんなことをするのか

サーバのOSがCentOS 6.8でglibcgccのバージョンが低い.また,オフライン環境なので機械学習ライブラリやソフトウェアを使えるようにするのが面倒.だからといってOSアップデートするには環境整備に時間を要するので今すぐにするのは大変.ということでDockerを使ってみるかと思ったが,CentOS7が必要なようだった.結果としてタイトルのようにすることを決めた.

登場人物

  • ホストOS: CentOS 6.8 ネット接続不可能
  • ゲストOS: Ubuntu 16.04
  • 自分のパソコン: ネットに接続できるWindows. wslをインストール済み

VirtualBoxのインストール

まずは公式からVirtualBoxをダウンロードしてホストOSにインストールする.

https://www.virtualbox.org/

rpm -ivh VirtualBox-6.0-6.0.4_128413_el6-1.x86_64.rpm

Ubuntu環境の作成

osはubuntu 16を公式からisoファイルを保存してVirutalBoxのGUIで設定して,インストールしてUbuntuを起動して初期設定を済ませる.

https://www.ubuntu.com/

CPU数とメモリの設定

VirtualBoxでゲストOSの設定を開いて使用できるCPU数とメモリを増やす. もし設定がグレーアウトして変更できないときは,ホストOSのBIOSを開いて, Intel(R) Virtualization Technologyを有効にすればよい.

共有フォルダの設定

このままではゲストOSのUbuntuとホストOSのCentOSとでファイルのやりとりができないので共有フォルダを設定する. VirtualBoxツールバーから Guest AdditionをゲストOSにマウントさせてインストールする. sudo vi /etc/fstab/etc/fstabの最後に以下のように追記する.

[ホストOSでの共有フォルダ] [ゲストOSでのフォルダ] vboxsf defaults 0 0

また,vboxsfグループにユーザを追加する.

sudo gpasswd -a $(whoami) vboxsf

これでホストOSとフォルダを共有できるようになった.

参考: https://www.chihayafuru.jp/tech/index.php/archives/1966

ホストOSからゲストOSにsshできるようにする

ネットワークの設定

ホストOSからゲストOSを見えるようにする.host only networkingというものを設定する. 参考: https://www.thomas-krenn.com/en/wiki/Network_Configuration_in_VirtualBox#Host-only_Networking 設定したらゲストOSにIPアドレスが割り振られてホストOSから見えるようになる.ゲストOSのIPアドレスはおそらく下限の値に設定される.ゲストOSでifconfigと打てばわかる.

openssh-serverのインストール

ゲストOSにopenssh-serverをインストールする. まずはwslで

sudo apt-get download openssh-server
sudo apt-get build-dep --download-only --reinstall -o dir::cache=. openssh-server

これで必要な.debファイルを大量にダウンロードできるので,ホストOSに全部アップロードして,debファイルを同じフォルダにまとめてゲストOSでdpkg -I *.debを実行してインストールする.

sshサービスの始動

sudo /etc/init.d/ssh start これで,ホストOSからssh接続できるようになった. デフォルトでゲストOS起動時にsshサービスが始動するようなのでこれだけで終わり.

パスワード入力が面倒なので公開鍵認証でログインする

クライアント:ホストOS側での設定

ssh-keygenで鍵を作成する. 作成するときパスフレーズを設定しない. $HOME/.ssh/configに以下の例のように設定してあげて,IdentityFileに生成した秘密鍵を指定してあげる.

Host [hostname]
    HostName [ゲストOSのIPアドレス]
    User [ゲストOSのUsername]
    Port 22
    IdentityFile /home/[ホストOSのUsername]/.ssh/id_rsa

サーバ:ゲストOS側の設定

ゲストOSで/etc/ssh/sshd_configファイルを書き換える.多分AuthorizedKeysFileだけコメントアウトされているのでコメントを外せばよい.

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      %h/.ssh/authorized_keys

あとはゲストOSの$HOME/.ssh/authorized_keysにホストOSで生成した公開鍵.pubファイルの中身をこんな感じでべたっと貼り付ける.

cat id_rsa.pub >> $HOME/.ssh/authorized_keys

これでssh [hostname]でパスワード入力なし接続できるようになった.

DockerをゲストOSにインストール

ホストOSがオフライン環境なので,dockerのインストールが少し面倒になってしまった. wslでdocker本体とdocker-composeをダウンロードしてdocker-???.tgzとdocker-composeをCentOSの共有フォルダにアップロードする.

https://download.docker.com/linux/static/stable/x86_64/
https://docs.docker.com/compose/install/

次にゲストOSに入って共有フォルダからそれぞれのファイルを入手して

tar zxvf docker-???.tgz
sudo cp docker/* /usr/bin
sudo cp docker-compose /usr/local/bin/
sudo chmod +x /usr/local/bin/docker-compose

これでdockerの導入は終わり.

このままでも使用できるが,dockerコマンドに毎回sudoが必要なのでゲストOSで設定する.

  1. dockerグループの作成 sudo groupadd docker

  2. dockerグループに使用しているユーザを追加する sudo usermod -aG docker $(whoami)

  3. ゲストOSをいったん再起動する

  4. dockerデーモンの起動 sudo dockerd &

最初にsudo dockerd &とやると&を使っているのでパスワード入力を求められずに実行できない.なのでsudo aみたいにいったんパスワードを入力してから実行した.まともなやりかたがわからないけどゲストOS起動しっぱなしだからいいか(後でなおす)

あとから気が付いたが,VirtualBox上のゲストOSはオンラインに接続できるPCで作っておけばよかった.

参考: https://qiita.com/kod314/items/e574ac12c23598e0d903

まとめ

これでオフライン環境にあるサーバにDocker環境を構築できました. 以下のようにしてサーバに環境を持って行っていくことができるようになりました.

  1. Docker for WindowsでDockerイメージを作成
  2. Powershelldocker save [コンテナ名] -o [イメージファイルのファイル名]でイメージをファイルとして出力.
  3. サーバにイメージファイルをアップロードする.
  4. ゲストOSでdocker load < [イメージファイルのファイル名]としてイメージを取り込む.

やったぜ.