WSL2は、Windows上で手軽にLinux環境を構築できるシステムです。
開発環境やサーバー環境、コンテナ環境などに活用でき、私も頻繁に利用しています。
それでも構成によっては、Vagrant(ベイグラント)の方が便利な場合があるので、Vagrantだとこんなことができます、という例をいくつかご紹介します。
仮想ネットワークの構築が柔軟にできる
Vagrantは、VirtualBox, Hyper-V,VMware などのハイパーバイザのフロントエンドとして機能する仮想マシン管理ツールです。
ハイパーバイザに備わっている仮想ネットワーク機能が利用できます。
ホストPCと同じセグメントのIPを割当て
仮想マシンはホストマシンと同じネットワークに直接接続されるようになります。(ブリッジ接続)
サービスを公開する場合のポートフォワード等の設定は不要です。
※ IPアドレスの使用は、利用するネットワークルールおよびネットワーク管理者に確認のうえ、ご利用ください
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/focal64" # Ubuntu 20.04 LTS
config.vm.provider "virtualbox" do |vb|
vb.memory = "1024"
vb.cpus = 1
end
# 1台目の仮想マシン
config.vm.define "vm1" do |vm1|
vm1.vm.hostname = "vm1"
vm1.vm.network "public_network", ip: "192.168.1.10"
end
# 2台目の仮想マシン
config.vm.define "vm2" do |vm2|
vm2.vm.hostname = "vm2"
vm2.vm.network "public_network", ip: "192.168.1.11"
end
end
仮想マシンに複数のIPを割り当て
仮想マシンに複数のIPアドレスを割り当てることで、待ち受けポート番号が同じでも複数のサービスを公開することができます。
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/focal64" # Ubuntu 20.04 LTS
config.vm.provider "virtualbox" do |vb|
vb.memory = "2048"
vb.cpus = 2
end
config.vm.define "multi_ip_vm" do |node|
node.vm.hostname = "multi-ip-vm"
# 1つ目のブリッジネットワークインターフェース
node.vm.network "public_network", ip: "192.168.1.10"
# 2つ目のブリッジネットワークインターフェース
node.vm.network "public_network", ip: "192.168.1.11"
# 3つ目のブリッジネットワークインターフェース
node.vm.network "public_network", ip: "192.168.1.12"
end
end
仮想マシン上のdockerコンテナに、IP指定してポートマッピングする例
version: '3'
services:
nginx1:
image: nginx
ports:
- "192.168.1.10:80:80"
nginx1:
image: nginx
ports:
- "192.168.1.11:80:80"
nginx1:
image: nginx
ports:
- "192.168.1.12:80:80"
プロビジョニングで環境構築を自動化できる
Vagrantfileにプロビジョニング(事前の環境設定、環境構築)を記載することで、起動時にソフトウエアのインストールや設定ができます。
ソフトウェアの事前設定
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/focal64"
# Webサーバー
config.vm.define "web" do |web|
web.vm.network "private_network", ip: "192.168.33.10"
web.vm.hostname = "webserver"
web.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y nginx
systemctl enable nginx
systemctl start nginx
SHELL
web.vm.provision "file", source: "./nginx.conf", destination: "/tmp/nginx.conf"
web.vm.provision "shell", inline: <<-SHELL
mv /tmp/nginx.conf /etc/nginx/nginx.conf
systemctl restart nginx
SHELL
end
全ての仮想マシンにカスタムスクリプトの実行
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/focal64" # Ubuntu 20.04 LTS
config.vm.provider "virtualbox" do |vb|
vb.memory = "1024"
vb.cpus = 1
end
# 1台目の仮想マシン
config.vm.define "vm1" do |vm1|
vm1.vm.hostname = "vm1"
vm1.vm.network "public_network", ip: "192.168.1.10"
end
# 2台目の仮想マシン
config.vm.define "vm2" do |vm2|
vm2.vm.hostname = "vm2"
vm2.vm.network "public_network", ip: "192.168.1.11"
end
# Ansibleによるプロビジョニング(すべてのマシンに適用)
config.vm.provision "ansible" do |ansible|
ansible.playbook = "playbook.yml"
end
# カスタムスクリプトの実行(すべてのマシンに適用)
config.vm.provision "shell", path: "custom_script.sh"
end
WSL2よりも仮想マシンイメージの種類が豊富
すぐに利用可能な仮想マシンイメージが豊富にあります。
https://app.vagrantup.com/boxes/search
※HashiCorpは基本的なセキュリティスキャンを行いますが、すべてのboxの内容を完全に検証しているわけではありません。可能な限り公式に維持されているboxesを使用することをお勧めします。また、ゲストOSにWindowsを利用する場合ライセンスに注意ください。
おわりに
手短ですがVagrantだとこんなことができます、という例でした。
最後まで読んで頂きありがとうございました。