A virtual appliance (hereafter VA) is a computer
that can be run as a simulation. In another words,
the object that is being simulated is a running computer and
the computer that is being simulated runs by executing some program.
That is how VAs can be used to run legacy software on
modern and future hardware. The key phrase to search is "computer emulation".

The VA can be seen as a container that includes all of the right versions
of all of the dependencies of a distributable application.
An installer can be a folder with VA specific scripts and binaries.
For example, if a client of a freelance software developer
uses a "standard" VA that is provided by the
freelance software developer (hereafter: freelancer),
then the freelancer can test its deliverables on a specific VA
that the client of the freelancer is expected to use.
Additional services may include _an_attempt_ to make
the software run outside of the "standard" VA, but
that attempt will be on a best effort bases,
because the freelancer lacks the possibility to guarantee
that all of the dependencies of the deliverables are met
outside of the VA.

As of 2021_05 I(Martin Vahi) recommend that
each project has multiple VAs that are
optimised for the different use cases.

As of 2016 the format of the x86 and the AMD64
line of virtual appliances has been standardized and it is
supported by multiple vendors. Some of the tools for running
x86 and AMD64 virtual appliances are
VirtualBox. and QEMU.