概要
当初、Vagrant+CoreOS上でDockerコンテナを実行するつもりだったが、ホストとなるMacをサスペンドさせるとCoreOSの時刻がずれる問題が発覚。PCを立ち上げる度にvagrant reload
とかやるのは面倒。
CoreOSのセキュリティロールの問題もあり、Guest Additionsが入らずハマる。あまりに面倒になったのでゲストはCentOSを使うことで妥協。
Containers
---------------------------
Docker
---------------------------
Vagrant (CentOS) <- Here
---------------------------
VirtualBox
---------------------------
LocalMachine (OS X)
関連ページ
前提となる環境
- Host
- OS: Mac OS X
- VirtualBox 4.2.26
- Vagrant 4.3.26
目的
- VagrantのゲストOSにCentOS 7.0をインストールする
- サスペンド復帰後は自動的に時刻をホストに合わせる
- ゲストOSの設定
- 固定IP (NAT) を設定
- 共有ディレクトリを有効化
- Dockerのインストール (オプション)
実行手順
Vagrantの設定
CentOSのBoxを取得。
$ mkdir -p ~/Vagrant/centos
$ cd ~/Vagrant/centos
$ vagrant box add centos7.0 https://f0fff3908f081cb6461b407be80daf97f07ac418.googledrive.com/host/0BwtuV7VyVTSkUG1PM3pCeDJ4dVE/centos7.box
$ vagrant init centos7.0
ゲストOSの設定を編集する。
# 固定IPの指定
config.vm.network "private_network", ip: "10.0.0.10"
# 共有ディレクトリの設定
config.vm.synced_folder "/Users/naomichi/Projects", "/home/vagrant/Projects", type:"nfs"
# VirtualBoxの設定 (任意)
config.vm.provider :virtualbox do |vb|
# VirtualBox上の名前
vb.customize ["modifyvm", :id, "--name", "centos7"]
# CPU使用率の上限
vb.customize ["modifyvm", :id, "--cpuexecutioncap", "50"]
# CPUの数
vb.customize ["modifyvm", :id, "--cpus", "2"]
# メモリサイズ
vb.customize ["modifyvm", :id, "--memory", "1024", "--cpus", "2", "--ioapic", "on"]
end
Vagrantを起動。
$ vagrant up
Guest Additionsが有効になっているか確認。
$ vagrant vbguest --status
GuestAdditions 4.3.26 running --- OK.
続いてIPアドレスの確認。CentOS 7からnettoolsが非推奨となったので、ここではiproute2パッケージのipコマンドを使ってみる。
$ vagrant ssh
$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:ea:9b:b5 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3
valid_lft 86364sec preferred_lft 86364sec
inet6 fe80::a00:27ff:feea:9bb5/64 scope link
valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:ac:59:f9 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.10/24 brd 10.0.0.255 scope global enp0s8
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:feac:59f9/64 scope link
valid_lft forever preferred_lft forever
enp0s8のIPが10.0.0.10となっていることを確認できる。ちなみにNICの名前も変わったようで、eth0はenp0s3、eth1はenp0sのようにそれぞれ変更されていた。
続いて共有ディレクトリがマウントされているか確認。
$ ls -la
合計 24
drwx------. 4 vagrant vagrant 4096 4月 4 00:38 .
drwxr-xr-x. 3 root root 20 8月 1 2014 ..
-rw-------. 1 vagrant vagrant 189 4月 4 00:39 .bash_history
-rw-r--r--. 1 vagrant vagrant 18 6月 10 2014 .bash_logout
-rw-r--r--. 1 vagrant vagrant 193 6月 10 2014 .bash_profile
-rw-r--r--. 1 vagrant vagrant 231 6月 10 2014 .bashrc
drwx------. 2 vagrant vagrant 28 4月 4 00:26 .ssh
-rw-------. 1 vagrant vagrant 644 8月 1 2014 .viminfo
drwxr-xr-x. 1 vagrant vagrant 238 4月 3 05:40 Projects
OK。
最後にゲストOSの時刻をホストOSに合わせるよう指定。
$ sudo /usr/sbin/VBoxService --timesync-set-threshold 60000
-------------------
00:00:00.001875 main Log opened 2015-04-04T04:40:26.606637000Z
00:00:00.001976 main OS Product: Linux
00:00:00.002008 main OS Release: 3.10.0-123.4.4.el7.x86_64
00:00:00.002037 main OS Version: #1 SMP Fri Jul 25 05:07:12 UTC 2014
00:00:00.002058 main OS Service Pack: #1 SMP Fri Jul 25 05:07:12 UTC 2014
00:00:00.002106 main Executable: /opt/VBoxGuestAdditions-4.3.26/sbin/VBoxService
00:00:00.002109 main Process ID: 4075
00:00:00.002110 main Package type: LINUX_64BITS_GENERIC
00:00:00.002147 main 4.3.26 r98988 started. Verbose level = 0
-------------------
Vagrantを再起動した後も同期が有効になるよう設定。
config.vm.provider :virtualbox do |vb|
vb.customize ["guestproperty", "set", :id, "/VirtualBox/GuestAdd/VBoxService/--timesync-set-threshold", 60000]
end
ゲストOSのセットアップ (任意)
パッケージを最新にする
$ sudo yum update -y
Dockerのインストール
$ sudo yum install -y docker-io device-mapper-event-libs
# サービスを有効化 (systemctlはchkconfigに替わるコマンド)
$ sudo systemctl start docker.service
# 起動時にDockerを開始する
$ sudo systemctl enable docker.service
ln -s '/usr/lib/systemd/system/docker.service' '/etc/systemd/system/multi-user.target.wants/docker.service'
$ Dockerが自動起動の対象となっているか確認
$ systemctl list-unit-files -t service|grep docker
docker.service enabled
# Dockerの情報を表示
$ sudo docker info
Containers: 0
Images: 0
Storage Driver: devicemapper
Pool Name: docker-253:1-8938407-pool
Pool Blocksize: 65.54 kB
Backing Filesystem: xfs
Data file: /dev/loop0
Metadata file: /dev/loop1
Data Space Used: 307.2 MB
Data Space Total: 107.4 GB
Data Space Available: 5.202 GB
Metadata Space Used: 729.1 kB
Metadata Space Total: 2.147 GB
Metadata Space Available: 2.147 GB
Udev Sync Supported: true
Data loop file: /var/lib/docker/devicemapper/devicemapper/data
Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
Library Version: 1.02.93-RHEL7 (2015-01-28)
Execution Driver: native-0.2
Kernel Version: 3.10.0-229.1.2.el7.x86_64
Operating System: CentOS Linux 7 (Core)
CPUs: 1
Total Memory: 489.6 MiB
Name: localhost.localdomain
ID: TOEB:TVTL:MLJ7:TYAH:PHAP:TZUU:XXOL:ANQM:TPL6:FGZQ:U36R:UI6Y
Dockerコンテナに対し、ゲスト (あるいはホスト) の共有ディレクトリを有効にすると、マウントはされるがディレクトリの中身が閲覧できない ("Permission denied"エラーが発生する) 問題がある。
これはCentOSのSELinuxが原因であるため、無効化しておくと良い。
# 現在のSELinuxの動作モードを確認
$ getenforce
# SELinuxが有効
Enforcing
-) SELINUX=enforcing
+) SELINUX= disabled
設定変更後はvagrantの再起動が必要。
タイムゾーンの変更
デフォルトではEDTとなっていたのでJSTに変更。
$ timedatectl
Local time: 木 2015-04-09 22:04:55 JST
Universal time: 木 2015-04-09 13:04:55 UTC
Timezone: America/New_York (JST, +0900)
NTP enabled: n/a
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
$ sudo timedatectl set-timezone Asia/Tokyo
$ timedatectl
Local time: 木 2015-04-09 22:07:12 JST
Universal time: 木 2015-04-09 13:07:12 UTC
Timezone: Asia/Tokyo (JST, +0900)
NTP enabled: n/a
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
ファイアウォールを無効にする
CentOS7からiptableの代わりとなるfirewalldが追加された。仮想環境下ではファイアウォールの必要性がないので外しておく。
$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld
rm '/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service'
rm '/etc/systemd/system/basic.target.wants/firewalld.service'
# 設定が無効になったことを確認
$ systemctl status firewalld
firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled)
Active: inactive (dead)