Vagrant 搭建 Django 开发环境

2023年 1月 4日 58.1k 0

Docker 解决了同一机器上的环境隔离问题,提高了运维部署的效率。 Vagrant 给开发提供一个统一的开发、测试、接近于完全隔离的环境。本文,主要讨论如何使用 Vagrant 搭建 Django 开发环境。版本:VirtualBox 5.0,Vagrant 1.8。

1. 基本概念

1.1 Vagrant

Vagrant 是一个用来构建虚拟开发环境的工具,其本身并不提供虚拟化功能,而是通过管理虚拟机以实现开发环境的构建。Vagrant 基于 Ruby ,主要以命令行的方式运行。Vagrant 底层支持 VirtualBox、VMware 甚至 AWS 作为虚拟机系统,可以非常方便地设置各种虚拟机环境。

1.2 Boxes

Boxes 是一个后缀为 box 的文件,实际上它是一个包含了虚拟机配置、虚拟机硬盘镜像和 Vagrant 配置的压缩包。

2. 使用 Vagrant

2.1 安装 Vagrant

  • 安装 VirtualBox, https://www.virtualbox.org/
  • 安装 Vagrant, https://www.vagrantup.com/

2.2 选择镜像并启动

通常,需要基于某一个基础镜像去构建需要的软件环境,比如,CentOS、Ubuntu 等。官网上提供了大量的镜像, 可以前往 http://www.vagrantbox.es/ 选择合适的镜像 Boxes 文件。第一步,添加 box

1
vagrant box add name path

这里的 name 是给 path 指向的 Boxes 的本地名称, path 使用远程的 URL 或者 本地路径均可。第二步,初始化环境

1
vagrant init  name

使用 name 镜像初始化当前目录,在工作目录创建一个 Vagrantfile 配置文件。第三步,启动环境

1
vagrant up

启动一个虚拟机。虚拟机是使用 Boxes 文件创建的,首先根据 Vagrantfile 文件中 config.vm.box 的配置找到 Boxes 文件,如果本地没有,将会从官网查找下载。第四步,SSH 登录Windows 终端并不支持 ssh,所以需要安装第三方 SSH 客户端。笔者使用的是 Xshell。

2.3 常用 Vagrant 命令

1
2
3
4
5
6
7
8
9
vagrant box list # 列出本地所有的 Boxes
vagrant package # 打包
vagrant init  # 初始化
vagrant up  # 启动虚拟机
vagrant halt  # 关闭虚拟机
vagrant reload  # 重启虚拟机
vagrant ssh  # SSH 至虚拟机
vagrant status  # 查看虚拟机运行状态
vagrant destroy  # 销毁当前虚拟机

2.4 配置代理

针对无法自由访问外网的开发环境,可以通过配置代理解决网络问题。

1
2
3
4
# Linux && OS X 下
export http_proxy=http://proxy.xx.com
# Windows 下
set http_proxy=http://proxy.xx.com

安装 vagrant-proxyconf

1
vagrant plugin install vagrant-proxyconf

配置 Vagrantfile全局配置新建 $HOME/.vagrant.d/Vagrantfile,编辑内容

1
2
3
4
5
6
7
Vagrant.configure("2") do |config|
if Vagrant.has_plugin?("vagrant-proxyconf")
  config.proxy.http     = "http://proxy.xx.com"
  config.proxy.https    = "http://proxy.xx.com"
end
# ... other stuff
end

2.5 Vagrant 的网络配置

Vagrant 通过配置文件能够支持 VirtualBox 的 NAT、Bridged 以及 Hostonly 网络。

  • NAT 网络

默认情况,Vagrant 建立的 VM 具有一个 NAT 网卡。

  • Bridged 网络

当采用如下配置语句时,Vagrant 建立的 VM 具有一个 Bridged 网络

1
config.vm.network "public_network"

此时,VM 在宿主机所在的 LAN 中相当于一台物理机器。可以通过路由器的 MAC 绑定,为 VM 保留一个固定的 DHCP 地址,这样 VM 无论何时启动都会获取到相同的IP地址。

  • Hostonly 网络

当采用如下配置语句时,Vagrant 建立的 VM 具有两个 Hostonly 网络

1
2
config.vm.network "private_network", ip: "192.168.9.10"
config.vm.network "private_network", ip: "192.168.33.10"
  • 混合网络

当采用如下配置语句时,Vagrant 建立的 VM 具有一个 NAT 和一个 Hostonly 网络

1
config.vm.network "private_network", ip: "192.168.33.10"

标识符 private_network 总是被映射为 VirtualBox 的 Hostonly 模型。Vagrant 在创建网卡时,如果配置文件仅配置了一个 private_network,则 Vagrant 自动创建 NAT 网卡,然后在创建配置文件所描述的网络;而如果配置文件指定了两个以上的 private_network 的话,Vagrant 不再自动创建 NAT 网卡了。混合网络非常适合开发和测试环境,可以通过 NAT 和 Internet 相通,多个 VM 之间也能相互通信。

  • 内外网络

当采用如下配置语句时,Vagrant 建立的 VM 具有一个 Bridged 和一个 Hostonly 网络

1
2
config.vm.network "public_network"
config.vm.network "private_network", ip: "192.168.33.10"

这是比较通用的配置模式,VM 既有 Host 主机所在局域网的 IP ,又有一个私有网络的 IP 地址,因此这些 VM 之间具有全连通性。

2.6 端口转发

当采用如下配置语句时,Vagrant 将 host 机器上 80 端口的访问请求转发到虚拟机的 80 端口的服务上

1
config.vm.network :forwarded_port, guest: 80, host: 80

例如,在虚拟机上使用 Nginx 跑了一个 Django 应用,那么在 host 机器上的浏览器中打开http://localhost:80 时,Vagrant 就会把这个请求转发到 VM 里面跑在 80 端口的 Nginx 服务上,因此可以通过这个设置设定 host 和 VM 之间,或是 VM 和 VM 之间的信息交互。

2.7 挂载目录

Vagrant 启动时,默认将当前目录挂载在 /vagrant。 还可以通过配置来设置额外的挂载目录:

1
config.vm.synced_folder "D:\vagrant\app", "/var/www"

上面这个设定,第一个参数是主机的目录,第二个参数是虚拟机挂载的目录

3. Django 的 Vagrant 环境

3.1 本地安装

从 http://pypi.o.tc.com/vagrant/xx-django1.8-u3.box 下载 Box 文件 xx-django1.8-u3.box。这个镜像包含了MySQL、RabbitMQ 等 Django 开发所需环境。数据库 root 账户默认密码为空。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
vagrant box add django xx-django1.8-u3.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'django' (v0) for provider:
    box: Unpacking necessary files from: file://E:/vagrant/xx-django1.8-u3.box
    box:
==> box: Successfully added box 'django' (v0) for 'virtualbox'!
mkdir  django
cd django
vagrant  init django
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

3.2 Vagrantfile 配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
Vagrant.configure(2) do |config|

  config.vm.box = "django"

  # 配置网络
  config.vm.network "private_network", ip: "192.168.12.34"  
  # 端口映射
  config.vm.network "forwarded_port", guest: 3306, host: 3306
  config.vm.network "forwarded_port", guest: 8000, host: 8000  
  config.ssh.username = "vagrant"  
  config.ssh.password = "vagrant"
end

宿主机 hosts 配置,便于使用域名直接访问

1
192.168.12.34 vagrant.localhost.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
...
==> default: Forwarding ports...
    default: 3306 (guest) => 3307 (host) (adapter 1)
    default: 8000 (guest) => 8000 (host) (adapter 1)
    default: 22 (guest) => 2222 (host) (adapter 1)
...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
...

使用账户 vagrant:vagrant SSH 登录 127.0.0.1:2222。

3.3 Django 配置

Vagrant 默认将本地目录挂载在 /vagrant 目录。在本地目录新建 app 目录,将 Django 工程拷贝到 app 中。切换到应用工作目录

1
cd /vagrant/app/  

安装依赖包

1
pip install -r requirements.txt  --index=http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com

创建数据库

1
2
mysql -u root -p
create database `database_name` default character set utf8 collate utf8_general_ci;

启动 Django

1
2
3
python manage.py migrate
python manage.py runserver 0.0.0.0:8000  # 运行 Django
python manage.py celery worker -l info # 启动另外一个窗口,运行 celery 后台任务

通过 Navicat 访问数据库需要授权

1
2
3
mysql -u root -p # 默认 root 密码为空
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'  WITH GRANT OPTION;
FLUSH   PRIVILEGES;

4. 参考

  • https://blog.hedzr.com/2017/05/02/vagrant-%E7%BD%91%E7%BB%9C%E9%85%8D%E7%BD%AE/

相关文章

KubeSphere 部署向量数据库 Milvus 实战指南
探索 Kubernetes 持久化存储之 Longhorn 初窥门径
征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
那些年在 Terraform 上吃到的糖和踩过的坑
无需 Kubernetes 测试 Kubernetes 网络实现
Kubernetes v1.31 中的移除和主要变更

发布评论