Prerequisites
To follow this tutorial, you will need the following:- Node.js, version 20.15.1 at the time of writing.
- npm, as a package manager for installing and maintaining dependencies. This usually comes bundled with Node.js.
- A foundational knowledge of Vue.
- Vite for a development server and building optimized static assets for production.
- Nginx to serve static assets and also act as a reverse proxy server.
- Docker to build standalone containers to serve your production app.
This guide assumes that you have basic knowledge of the above-mentioned technologies and tools. If you are not
familiar with any of them, it is highly recommended to review their official documentation and tutorials to get up to
speed before proceeding with this guide.
Scaffolding the Vue app
Vite offers a CLI tool that makes the scaffolding process much easier. Run the following command:5173
. Go to http://localhost:5173 to see your app.
The dev server is enabled with HMR, so it hot reloads the
application when you make changes.
Building Your Production App
When it is time to deploy your app for production, simply run:<root>/index.html
as the build entry point
and produces an application bundle that is suitable to be served over a static hosting service. You can read more about
building for production in the Vite guide.
The output is found in the <root>/dist
directory unless configured to a different path.
Once built, you can preview the production build using
npm run preview
to start a production-like local web server.It is important to note that
vite preview
is intended for previewing the build locally and not meant as a production
server.Configuring nginx
Once the application is built for production, we need a static web server to serve those files. For that purpose, we are using [Nginx]. Nginx is an open-source HTTP and reverse proxy server.nginx.conf.template
nginx.conf.template
in the root of your project. We wonβt be using this template now; weβll use it to
run the Nginx server inside the Docker container.
Note two important blocks in this configuration:
index.html
from the files we built using Ember, stored in the /usr/share/nginx/html
folder. We
will copy the assets to this folder while building the Docker application.
And then the API block:
You might want to skip the API block if you donβt have a backend yet; otherwise, nginx will throw an error for an
invalid host on the backend URL.
example.com
. Whenever an API call is made to
example.com/api
, the nginx server acts as a reverse proxy server and forwards the request to the backend server.
You can use reverse proxying to navigate the traffic that is inbound to nginx. The reverse proxy server also acts as a
mask, hiding the real backend from the outside world.
Create the Docker Image
Dockerizing makes the app run anywhere, agnostic of the platform. As long as Docker is installed, whether itβs Windows, Mac, or Linux, it can run with the same behavior. Before creating the Dockerfile, letβs create a.dockerignore
file and add the contents that should not be copied over
to the Docker file system.
.dockerignore
Creating a
.dockerignore
file and adding folders like node_modules
is a must, since dependencies will be installed
while building the image based on the platform preferences used. Copying those from the file system will overwrite the
installed dependencies and might cause errors during deployment.Dockerfile
vue-app
image for platform linux/amd64
and tags it as latest
.
If you are locally testing your application, you can skip the platform
key to build the images
Run the docker image
Letβs run the Docker container using the image created for the Vue application with the command below.-it
: Enables interactivity with TTY.--rm
: Tells the Docker Daemon to clean up the container and remove the file system after the container exits.--name vue-app
: Names the containervue-app
.-e PORT=3000
: Sets the environment variable PORT in Docker to3000
.-e BACKEND_PORT=3001
: Sets the environment variable BACKEND_PORT in Docker to3001
.-e BACKEND_HOST=host.docker.internal
: Sets the environment variable BACKEND_HOST in Docker tohost.docker.internal
.-d
: Runs the container in detached (background) mode. You can skip this flag to see the logs directly in your terminal window.-p 3000:3000
: Maps port 3000 on your host to port 3000 in the container.vue-app
: The name of the image.
http://localhost:3000
to see the Vue application running inside the Docker container.
Hurray π. Now we have created and packaged a Vue app for production use.