You have all the power of Docker at your disposal. This means you can run any Docker command against Vessel.
The first time you start up an application with Vessel, it will download the following official Docker images:
Vessel will also build the following Docker images locally on your machine:
Images are used to run containers. You can think of an image as a PHP class, and a container as an instance of a class.
You can view the images you have downloaded or built on your local machine:
# List images built on your computer docker image ls
You'll see something like this:
REPOSITORY TAG IMAGE ID CREATED SIZE vessel/app latest ee589c11428a 6 weeks ago 385MB vessel/node latest e0c607290998 6 weeks ago 696MB ubuntu 18.04 ccc7a11d65b1 8 weeks ago 120MB mysql 5.7 c73c7527c03a 2 months ago 412MB redis alpine 9d8fa9aa0e5b 2 months ago 27.5MB node 8.6 90223b3d894e 5 months ago 665MB
This shows the base images used (Node, Redis, MySQL, Ubuntu), and then our two custom images we use for the PHP and Node containers.
If you want to completely rebuild Vessel images (to perhaps pull in the latest version of NodeJS or update the base Ubuntu image), you can delete these images and then have Vessel re-build them.
Here's a few examples of rebuilding the Node and PHP containers.
To rebuild the Node container:
# Remove the vessel/node image and its base image # in this order docker image rm vessel/node docker image rm node # Have vessel rebuild any images it needs to # which will be "node" in this case ./vessel build
We can do the same with our PHP application image:
# Remove the vessel/app image and its base image # in this order docker image rm vessel/app docker image rm ubuntu # Have vessel rebuild any images it needs to # which will be "vessel/app" in this case ./vessel build
Docker Compose is used to tie together the Docker images created/downloaded. When we start Vessel, Docker Compose tells it to create new containers, set up the networking, persist MySQL/Redis data through volumes, and setup file sharing between your code and the PHP container.
Vessel will pass-through any command it does not understand to
docker-compose. If no command is passed, it will run
# Running this: ./vessel # Is equivalent to ./vessel ps # Which, under the hood, is running: docker-compose ps
You can run any
docker-compose command with
vessel. Vessel will fill in defaults and environment variables needed/expected by the
docker-compose.yml file for you, so it's easier and more convenient than using the
docker-compose command itself.
For example, we can restart our containers (e.g. run
docker-compose restart) by letting
vessel pass the command through to
You can see the
docker-compose help menu like so:
docker-compose are defined as "services". Vessel's
docker-compose.yml file defines the following services:
The Docker Compose setup creates a network when the containers are spun up. Each container is added to the network automatically, allowing the containers to communicate to eachother.
The container's hostname is the service's name, so the mysql container can be reached using hostname
mysql, and the redis container can be reached using hostname
This is why Laravel's
.env file has the following hostnames defined after running the
bash vessel init command:
vessel start, you can see the network created:
# List created networks docker network ls # Inspect the vessel network created. # It will have a unique name ending in _vessel docker network inspect <network-name-from-above>
This network is (re)created and destroyed whenever we start and stop Vessel.
Both Redis and MySQL images automatically create a Docker volume. This is defined in their
Dockerfile and is not a special feature of Vessel.
Each volume is a shared directory mounted to your host machine, which lets the containers save data in a place that persists between stopping and restarting the containers.
This means when your containers are destroyed (as they are during normal Docker operation), you won't lose your important data, such as your databases or redis cache data.
You can see what volumes are created after starting Vessel:
# List created volumes docker volume ls
You'll see something like this:
DRIVER VOLUME NAME local vesselexample_vesselmysql local vesselexample_vesselredis
This shows two "local" volumes. Their name is generated by Docker using a normalized directory name of the project, with the name "vesselmysql" or "vesselredis" appended.
If you want to clean old volumes, or delete your current ones, you can! Just know this permanently deletes your data, including your databases:
docker volume rm vesselexample_vesselmysql docker volume rm vesselexample_vesselredis