Run MSSQL Server in Docker inside Vagrant Ubuntu VM

Goal

Run Microsoft SQL Server in a Docker container inside a Vagrant Ubuntu VM, accessible from the host machine.

Configuration Files

Vagrantfile

Vagrant.configure("2") do |config|
    config.vm.box = "ubuntu/focal64" # v 20.04 LTS
    config.vm.synced_folder "./", "/vagrant"
    config.vm.network "forwarded_port", guest: 1433, host: 1433
    config.vm.provision :shell, path: "vagrant_provision.sh"  
    config.vm.provider "virtualbox" do |vb|
      vb.name = "SqlServer"     
      vb.memory = 2048  # Minimum 2GB required
    end
  end

vagrant_provision.sh

echo "provisioning VM..."
sudo apt update
sudo apt-get update

## install docker and run
sudo apt -y install docker.io
sudo systemctl start docker
sudo systemctl enable docker
docker --version
echo "docker installed and running..."

## create group 'docker' and add user 'vagrant' (the one I connect with) to it
sudo groupadd docker
sudo usermod -aG docker vagrant
echo "docker group created and 'vagrant' user added to it..."

## install docker compose
sudo curl -L https://github.com/docker/compose/releases/download/1.26.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
echo "docker compose installed..."

echo "done provisioning VM."

docker-compose.yaml

version: '3.7'
services:
  sqlserver:
    image: mcr.microsoft.com/mssql/server:2017-latest
    container_name: mssql
    ports:
      - '1433:1433'
    volumes:
      - mssqldata:/var/opt/mssql
    environment:
      - ACCEPT_EULA=Yes
      - SA_PASSWORD=StrongP@ssword!
      - MSSQL_PID=Developer
volumes:
  mssqldata:

Note: Use Docker volumes instead of bind mounts - binding the data folder directly fails.

Launch

vagrant up
vagrant ssh
docker-compose up -d

Alternative - run the container directly without docker-compose:

docker run --name mssql \
        -e ACCEPT_EULA=Y \
        -e MSSQL_PID="Developer" \
        -e MSSQL_SA_PASSWORD="StrongP@ssword!" \
        -v mssqldata:/var/opt/mssql \
        -p 1433:1433 \
        -d mcr.microsoft.com/mssql/server:2017-latest

Connect

From host machine:

Server: localhost:1433
User: sa
Password: StrongP@ssword!

From terminal inside Vagrant VM:

docker exec -it mssql /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P StrongP@ssword!