Skip to content

Instantly share code, notes, and snippets.

@hideojoho
Last active July 31, 2021 20:57
Show Gist options
  • Save hideojoho/9bad71ce892f6d17720f056526142553 to your computer and use it in GitHub Desktop.
Save hideojoho/9bad71ce892f6d17720f056526142553 to your computer and use it in GitHub Desktop.
How to install Jupyter Notebook with R kernel on Vagrant

What you will get

  • Jupyter Notebook for Python 3 and R
  • Jupyter Notebook Extensions
  • Python libraries: numpy scipy pandas matplotlib (can be changed via Vagrant_provision.sh below)
  • R packages: Many (ggplot2, knitr, lattice, to name a few)

Requirements

  • At least 6-8GB of RAM (of those 4GB will be used for a virtual machine)
  • About 4GB of diskspace
  • 2-3 hours of time (depends on your network speed)

Versions

  • MacOSX 10.11.6
  • VirtualBox 5.1.10
  • Vagrant 1.8.7

Download & Install

Install Vagrant plugins

$ vagrant plugin install vagrant-vbguest

Fix a bug in Vagrant 1.8.7

$ sudo rm /opt/vagrant/embedded/bin/curl

Add a new CentOS7 box

The following commands download a Vagrant box for CentOS 7 from their server. This takes time.

$ vagrant box add centos/7
Select 2 (VirtualBox)

Create a folder for a new Vagrant instance

$ mkdir CentOS7-Jupyter-R; cd CentOS7-Jupyter-R
$ vagrant init centos-VAGRANTSLASH-7
$ mv Vagrantfile Vagrantfile.orig

Download the files and save them to CentOS7-Jupyter-R

Start a VM

The following command installs CentOS 7 to your virtual machine along with Python, Jupyter Notebook, and R. This takes time.

$ vagrant up

Start Jupyter Notebook server

$ sudo vi /etc/ssh/ssh_config
#   SendEnv LANG LC_*
$ vagrant ssh
[vagrant@localhost ~]$ jupyter notebook --ip=0.0.0.0 --no-browser
...
    
    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://0.0.0.0:8888/?token=19cc5de1457673eaf66561034b8d7b639a3c969c42784481

Access Jupyter Notebook

http://192.168.10.33:8888/

  • Copy and paste a token shown in the terminal, if asked

Stop the server

  • Ctrl+C to kill the process

Add a new R package

  • Open a terminal page from Jupyter Notebook (New - Terminal)
[vagrant@localhost ~]$ sudo R -e "install.packages(c('package_name'), dep = TRUE)"
# Update package
echo "Updating default packages ..."
sudo yum -y update
# Install dev tools
echo "Installing Development tools ..."
sudo yum -y groupinstall base "Development tools"
sudo yum -y install zlib-devel bzip2-devel openssl-devel sqlite-devel readline-devel
# Disable SELinux and firewall
echo "Disabling SELinux and firewall ..."
sudo setenforce 0
sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/sysconfig/selinux
# Install Python and Jupyter notebook
echo "Installing Python and Jupyter Notebook ..."
sudo yum -y install epel-release
sudo yum -y install python34 python34-devel
cd
wget https://bootstrap.pypa.io/get-pip.py
sudo python3.4 get-pip.py
sudo pip3.4 install ipython jupyter jupyter_contrib_nbextensions numpy scipy pandas matplotlib janome pyper
cd
jupyter contrib nbextension install --user
# Install R and packages
echo "Installing R and packages ..."
sudo yum -y install R
sudo yum -y install czmq-devel libcurl libcurl-devel libxml2 libxml2-devel
sudo R -e "install.packages(c('crayon', 'pbdZMQ', 'devtools'), repos = 'https://cran.rstudio.com/', dep = TRUE)"
sudo R -e "devtools::install_github(paste0('IRkernel/', c('repr', 'IRdisplay', 'IRkernel')))"
sudo R -e "IRkernel::installspec(user = FALSE)"
# Start Jupyter Notebook
# echo "Starting Jupyter Notebook ..."
# jupyter notebook --ip=0.0.0.0 --no-browser
# -*- mode: ruby -*-
# vi: set ft=ruby :
# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
# The most common configuration options are documented and commented below.
# For a complete reference, please see the online documentation at
# https://docs.vagrantup.com.
# Every Vagrant development environment requires a box. You can search for
# boxes at https://atlas.hashicorp.com/search.
config.vm.box = "centos-VAGRANTSLASH-7"
# Disable automatic box update checking. If you disable this, then
# boxes will only be checked for updates when the user runs
# `vagrant box outdated`. This is not recommended.
# config.vm.box_check_update = false
# Create a forwarded port mapping which allows access to a specific port
# within the machine from a port on the host machine. In the example below,
# accessing "localhost:8080" will access port 80 on the guest machine.
# config.vm.network "forwarded_port", guest: 80, host: 8080
# Create a private network, which allows host-only access to the machine
# using a specific IP.
config.vm.network "private_network", ip: "192.168.33.10"
# Create a public network, which generally matched to bridged network.
# Bridged networks make the machine appear as another physical device on
# your network.
# config.vm.network "public_network"
# Share an additional folder to the guest VM. The first argument is
# the path on the host to the actual folder. The second argument is
# the path on the guest to mount the folder. And the optional third
# argument is a set of non-required options.
# config.vm.synced_folder "../data", "/vagrant_data"
# Provider-specific configuration so you can fine-tune various
# backing providers for Vagrant. These expose provider-specific options.
# Example for VirtualBox:
#
config.vm.provider "virtualbox" do |vb|
# # Display the VirtualBox GUI when booting the machine
# vb.gui = true
#
# # Customize the amount of memory on the VM:
vb.memory = "4096"
end
#
# View the documentation for the provider you are using for more
# information on available options.
# Define a Vagrant Push strategy for pushing to Atlas. Other push strategies
# such as FTP and Heroku are also available. See the documentation at
# https://docs.vagrantup.com/v2/push/atlas.html for more information.
# config.push.define "atlas" do |push|
# push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME"
# end
# Enable provisioning with a shell script. Additional provisioners such as
# Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
# documentation for more information about their specific syntax and use.
config.vm.provision "shell", privileged: false, path: "Vagrant_provision.sh"
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment