Docker on Ubuntu on VirtualBox on CentOS 6.8 (オフライン)
なぜこんなことをするのか
サーバのOSがCentOS 6.8でglibcやgccのバージョンが低い.また,オフライン環境なので機械学習ライブラリやソフトウェアを使えるようにするのが面倒.だからといってOSアップデートするには環境整備に時間を要するので今すぐにするのは大変.ということでDockerを使ってみるかと思ったが,CentOS7が必要なようだった.結果としてタイトルのようにすることを決めた.
登場人物
VirtualBoxのインストール
まずは公式からVirtualBoxをダウンロードしてホストOSにインストールする.
rpm -ivh VirtualBox-6.0-6.0.4_128413_el6-1.x86_64.rpm
Ubuntu環境の作成
osはubuntu 16を公式からisoファイルを保存してVirutalBoxのGUIで設定して,インストールしてUbuntuを起動して初期設定を済ませる.
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で設定する.
dockerグループの作成
sudo groupadd docker
dockerグループに使用しているユーザを追加する
sudo usermod -aG docker $(whoami)
ゲストOSをいったん再起動する
dockerデーモンの起動
sudo dockerd &
最初にsudo dockerd &
とやると&を使っているのでパスワード入力を求められずに実行できない.なのでsudo a
みたいにいったんパスワードを入力してから実行した.まともなやりかたがわからないけどゲストOS起動しっぱなしだからいいか(後でなおす)
あとから気が付いたが,VirtualBox上のゲストOSはオンラインに接続できるPCで作っておけばよかった.
参考: https://qiita.com/kod314/items/e574ac12c23598e0d903
まとめ
これでオフライン環境にあるサーバにDocker環境を構築できました. 以下のようにしてサーバに環境を持って行っていくことができるようになりました.
- Docker for WindowsでDockerイメージを作成
- Powershellで
docker save [コンテナ名] -o [イメージファイルのファイル名]
でイメージをファイルとして出力. - サーバにイメージファイルをアップロードする.
- ゲストOSで
docker load < [イメージファイルのファイル名]
としてイメージを取り込む.
やったぜ.