As I want to decouple my development server from my computer as much as possible I want to create first a virtual machine with linux.
Because I have used Oracle Virtualbox in the past successfully, I will use it here too.
As I want have later a reproducible environment via Infrastructure as code, I give Vagrant a try for this. As source code management system I use GIT, my remote repository is located at GitHub.
As I don’t want create a new linux from scratch, I have looked for a ready system at Vagrantboxes, which contains a new Oracle Linux version, and find a Oracle Linux 7.1 x86_64 system with Chef and Puppet preinstalled.
Before I could start, I had to install on my Windows 10 computer Vagrant 1.8.5 and Oracle Virtualbox 5.0.16. Don’t use the 5.1 Version, as at this is not yet supported by vagrant 1.8.5.
For automatic update of the Oracle VM VirtualBox Extension Pack, which is delivered with the ready box and is required for use of shared folders and more, you should install following plugin as described here:
vagrant plugin install vagrant vbguest
Next I have created a directory of your choice and init there a Vagrantfile by calling
Then I changed the Vagrantfile as following, see the inline comments for documentation:
Vagrant.configure(2) do |config| # Use the mentioned ready OEL 7 linux box config.vm.box = "oraclelinux-7-x86_64.box" config.vm.box_url = "http://cloud.terry.im/vagrant/oraclelinux-7-x86_64.box" # Create a private network config.vm.network "private_network", type: "dhcp" # persistant storage for all docker container config.vm.synced_folder "C:\\shared\\virtual_storage", "/virtual_storage", :mount_options => ["dmode=777","fmode=777"] # virtualbox provider config.vm.provider "virtualbox" do |vb| # name in VirtualBox vb.name = "Development Server" end # Docker Private Registry container for storing later builded docker images, which are not in the Docker Public Registry at https://hub.docker.com/ config.vm.provision "docker" do |d| d.run "registry", image: "registry", daemonize: true, args: "-d -p 5000:5000 -v /virtual_storage/docker_registry:/var/lib/registry" end end
Run next from the created directory
Following you see the output
Bringing machine 'default' up with 'virtualbox' provider... (1) ==> default: Importing base box 'oraclelinux-7-x86_64.box'... ==> default: Matching MAC address for NAT networking... ==> default: Setting the name of the VM: Development Server ==> default: Clearing any previously set network interfaces... ==> default: Preparing network interfaces based on configuration... default: Adapter 1: nat default: Adapter 2: hostonly ==> default: Forwarding ports... default: 22 (guest) => 2222 (host) (adapter 1) ==> default: Booting VM... ==> default: Waiting for machine to boot. This may take a few minutes... default: SSH address: 127.0.0.1:2222 default: SSH username: vagrant default: SSH auth method: private key default: Warning: Remote connection disconnect. Retrying... default: default: Vagrant insecure key detected. Vagrant will automatically replace default: this with a newly generated keypair for better security. default: default: Inserting generated public key within guest... default: Removing insecure key from the guest if it's present... default: Key inserted! Disconnecting and reconnecting using new SSH key... ==> default: Machine booted and ready! [default] GuestAdditions versions on your host (5.0.26) and guest (5.0.12) do not match.(2) Loaded plugins: ulninfo Package kernel-uek-devel-4.1.12-32.el7uek.x86_64 already installed and latest version Package gcc-4.8.5-4.el7.x86_64 already installed and latest version Package 1:make-3.82-21.el7.x86_64 already installed and latest version Package 4:perl-5.16.3-286.el7.x86_64 already installed and latest version Package bzip2-1.0.6-13.el7.x86_64 already installed and latest version Nothing to do Copy iso file C:\Program Files\Oracle\VirtualBox\VBoxGuestAdditions.iso into the box /tmp/VBoxGuestAdditions.iso mount: /dev/loop0 is write-protected, mounting read-only Installing Virtualbox Guest Additions 5.0.26 - guest version is 5.0.12 Verifying archive integrity... All good. Uncompressing VirtualBox 5.0.26 Guest Additions for Linux............ VirtualBox Guest Additions installer Removing installed version 5.0.12 of VirtualBox Guest Additions... Removing existing VirtualBox non-DKMS kernel modules[ OK ] Copying additional installer modules ... Installing additional modules ... Removing existing VirtualBox non-DKMS kernel modules[ OK ] Building the VirtualBox Guest Additions kernel modules Building the main Guest Additions module[ OK ] Building the shared folder support module[ OK ] Building the shared folder support module[ OK ] Building the graphics driver module[ OK ] Doing non-kernel setup of the Guest Additions[ OK ] You should restart your guest to make sure the new modules are actually used ==> default: Checking for guest additions in VM... ==> default: Configuring and enabling network interfaces... ==> default: Mounting shared folders... default: /vagrant => C:/shared/scmlocal/blog default: /virtual_storage => C:/shared/virtual_storage ==> default: Running provisioner: docker...(3) default: Installing Docker onto machine... ==> default: Starting Docker containers...(4) ==> default: -- Container: registry
|1||you see the loading of the ready box and booting with the defined network|
|2||the version of the VirtualBox GuestAdditions of the box is checked and after that replaced with the actual installed VirtualBox version. This happens only on the first "vagrant up" call.|
|3||Docker is installed as a Vagrant Docker provider is called in the Vagrantfile line 20 and it does not exist in the box before.|
|4||a Docker Private Registry container is started via loading docker image from the Docker Public Registry. In a later blog we will use this Docker Private Registry container to hold our own created docker images like database and development tools. The pushed images are saved to a mapped host volume of my windows 10 computer.|
You can connect to the virtualbox directly via
The you can see the downloaded Docker Private Registry images and the started container from this images:
[[email protected] ~]$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry latest c6c14b3960bd 13 days ago 33.28 MB [[email protected] ~]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 739c1c9926b1 registry "/entrypoint.sh /etc/" 5 minutes ago Up 5 minutes 0.0.0.0:5000->5000/tcp registry
You can now stop the Development Server via
If you startup again the server via
the provision steps are not replayed until you destroy the server or explicitly call the provision again via
Here you find the source code for this blog.
Here you find more about the topic "Virtual Development Server".